2016-09-05 5 views
0

나는 PHP를 배우고 난 붙어있어 내가 다음 코드를PHP : 자식 클래스에서 보호 var에 액세스

PHP Fatal error: Uncaught Error: Cannot access protected property poodle::$Name 

이가 이상한 같습니다

<?php 

class dogtag { 

    protected $Words; 

} 

class dog { 

    protected $Name; 
    protected $DogTag; 

    protected function bark() { 
     print "Woof!\n"; 
    } 

} 

class poodle extends dog { 

    public function bark() { 
     print "Yip!\n"; 
    } 

} 

$poppy = new poodle; 
$poppy->Name = "Poppy"; 
$poppy->DogTag = new dogtag; 
$poppy->DogTag->Words = "My name is 
Poppy. If you find me, please call 555-1234"; 

var_dump($poppy); 

?> 

이것은 내가 가진 무엇 나는 어린이 클래스의 보호 된 vars와 함수에 접근해야만한다.

누군가 내가 틀린 곳을 설명해 주시겠습니까?

감사합니다.

답변

1

보호 된 변수는 실제로 하위 클래스에서 액세스 할 수 있습니다. 그러나 하위 클래스 내부에서 변수에 액세스하지 않습니다.

변수를 public으로 만들면 클래스 외부에서 변수에 액세스 할 수 있습니다.

문서 : http://php.net/manual/en/language.oop5.visibility.php

예 :

Class Dog { 

    private $privateProperty = "private"; //I can only be access from inside the Dog class 
    protected $protectedProperty = "protected"; //I can be accessed from inside the dog class and all child classes 
    public $publicProperty = "public"; //I can be accessed from everywhere. 

} 


Class Poodle extends Dog { 

    public function getProtectedProperty(){ 
     return $this->protectedProperty; //This is ok because it's inside the Poodle (child class); 
    } 

} 

$poodle = new Poodle; 
echo $poodle->publicProperty; //This is ok because it's public 
echo $poodle->getProtectedProperty(); //This is ok because it calls a public method. 
+0

감사합니다. 그러나 나는 그것을 얻지 못했습니다. 내가 하위 클래스의 인스턴스 (양귀비)에서 그것을 액세스하려고하는 것을 의미하고 하위 클래스 정의 (클래스 푸들 확장 ...)에서 아닙니다? – S4rg0n

+0

이것은 개 클래스 내부에서 액세스하는 것이 아니라 외부에서 액세스하는 것을 의미합니다. – Daan

+0

죄송하지만 이해가 안됩니다. 개 클래스에서 상속받은 푸들 하위 클래스에서 $ Name에 액세스하려고합니다. 푸들 ($ poppy)의 인스턴스를 만들고 protected var $ Name을 변경하려고합니다. 개인 var과 함께 할 수는 없지만 $ Name은 보호됩니다. $ poppy는 poodle 클래스의 인스턴스이므로 protected 부모의 var를 수정할 수 있어야합니다. 양해 해줘서 고마워. – S4rg0n

0

당신이 당신의 클래스에 magic 방법을 추가 할 수 있도록 할 필요가 재산 '단어'에 액세스 할 수 없습니다 - 그것은 당신이 수업 외부의 사유 재산에 접근하고 조작 할 수있게합니다.

class foo{ 
    private $bah; 

    public function __construct(){ 
     $this->bah='hello world'; 
    } 
    public function __get($name){ 
     return $this->$name; 
    } 
    public function __set($name,$value){ 
     $this->$name=$value; 
    } 
    public function __isset($name){ 
     return isset($this->$name); 
    } 
    public function __unset($name){ 
     unset($this->$name); 
    } 
} 

$foo=new foo; 
echo $foo->bah; 

$foo->bah='banana'; 
echo $foo->bah; 
관련 문제