我正在学习PHP并尝试创建一个具有多个protected
属性的基本类。我可以使用“魔术”设置器设置它们,但是无法打印name
属性。我已经读过,这似乎是基本的东西,但由于一些奇怪的原因,输出是“名称”而不是我传递的实际字符串。代码如下:
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
属性,而只是获取属性本身的名称?
答案 0 :(得分:7)
变化:
$this->name = $attr;
为:
$this->name = $value;
因为根据你的开关案例,$ attr被设置为“name”,我认为$ value正在保存你真正需要的东西。
同样的事情将适用于其他开关案例。
答案 1 :(得分:1)
您目前将属性的值设置为其键:
$this->name = $attr;
而是将值设置为$value
:
$this->name = $value;
这可以防止可能发生的任何错误。
P.S。我刚才注意到有人已经发布了相同的解决方案。 Woops:)