PHP无法获取类属性

时间:2017-02-04 19:41:46

标签: php

我正在学习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属性,而只是获取属性本身的名称?

2 个答案:

答案 0 :(得分:7)

变化:

$this->name = $attr;

为:

$this->name = $value;

因为根据你的开关案例,$ attr被设置为“name”,我认为$ value正在保存你真正需要的东西。

同样的事情将适用于其他开关案例。

答案 1 :(得分:1)

您目前将属性的值设置为其键:

$this->name = $attr;

而是将值设置为$value

$this->name = $value;

这可以防止可能发生的任何错误。

P.S。我刚才注意到有人已经发布了相同的解决方案。 Woops:)