2017-02-04 3 views
0

Я изучаю PHP и пытаюсь создать базовый класс с несколькими свойствами protected. Я могу установить их с помощью «волшебного» сеттера, однако не могу напечатать свойство name. Я читал, и это кажется базовым, но по какой-то нечетной причине вывод - это «имя», а не фактическая строка, которую я передаю. Код выглядит следующим образом:PHP не может получить свойство класса

class Animal{ 
     protected $name; 
     protected $color; 
     protected $type; 

     public function __set($attr, $value){ 
      switch ($attr){ 
       case "name": 
        $this->name = $attr; 
        break; 

       case "color": 
        $this->color = $attr; 
        break; 

       case "type": 
        $this->type = $attr; 
        break; 
       default: 
        echo "attr not found in class"; 
      } 

      printf ("set %s to %s <br>", $attr, $value); 
     } 

     public function __get($attr){ 
      if(property_exists($this, $attr)){ 
       return $this->$attr; 
      } 
     } 

     public function run(){ 
      echo $this->name ." runs! <br>"; 
     } 

     public function getName(){ 
      return $this->name."<br>"; 
     } 
    } 

$animal1 = new Animal(); 
$animal1->name = "Animal_1"; 
$animal1->color = "black"; 
$animal1->type = "common"; 

echo $animal1->getName(); 
echo $animal1->run(); 
echo $animal1->name; 

Это выход:

set name to Animal_1 
set color to black 
set type to common 
name 
name runs! 
name 

Почему я не могу получить name свойство класса и вместо того, чтобы просто получить имя самого свойства?

ответ

7

Изменение:

$this->name = $attr; 

к:

$this->name = $value; 

в $ атр установлен на «имя» в соответствии с вашим переключателем случае, и я полагаю, что значение $ держит то, что вам действительно нужно.

То же самое относится и к остальным вашим корпусам коммутатора.

+1

Спасибо. Я не могу поверить, что я не заметил эту ошибку. – undroid

1

Вы в настоящее время установить значение свойства по ключу:

$this->name = $attr; 

Вместо этого установите значение $value:

$this->name = $value; 

Это предотвратит любые ошибки, которые могут возникнуть.

P.S. Я только сейчас заметил, что кто-то уже опубликовал одно и то же решение. Woops :)

Смежные вопросы