thumber 2015-06-17 18:26:58 5732次浏览 2条回复 0 1 0

读文档“关键概念--属性”部分,产生了几个困惑。 1、如果一个类,实现了getter和setter方法,但是不继承Yii\base\Object,可以直接用属性名来访问吗?

class Demo 
{
    private $name;

    public function getName()
    {
        return $this->name;
    }

    public function setName($value)
    {
        $this->name = $value;
    }

}
$obj = new Demo();

echo $obj->name;(fatal error:原因是访问了私有变量;说明不继承Object,在使用私有变量的时候就不会去调用getter和setter方法,所以不能在这种情况下直接用属性名访问私有成员变量。如果成员变量是公有的,那当然是可以访问的。);

2、如何理解“如果此类属性名和类成员变量相同,以后者为准。例如,假设以上 Foo 类有个 label 成员变量,然后给 $object->label = 'abc' 赋值,将赋给成员变量而不是 setter setLabel() 方法。” 困惑:属性名和类成员变量相同?属性名不就是成员变量吗?难到还会重复定义属性? 猜想:如果一个属性是私有的,而可以访问该属性,一定是调用了getter或setter方法;那如果这个属性是公有的,而我们也为这个属性定义了setter和getter,这个时候访问该属性,有没有调用getter和setter呢? 验证:

class Demo extends Object
{
    public $name = "1";

    public function getName()
    {
        return $this->name;
    }

    public function setName($value = '2')
    {
        $this->name = $value;
    }
}
$obj = new Deal();
$obj->name = "3";
echo $obj->name;(输出为3,说明$obj->name直接访问的属性而没有调用setter方法。);
觉得很赞
  • 回复于 2015-06-17 22:48 举报

    php和其他语言不同。。
    访问属性不会调用getxxx setxxx的,为了实现这种调用效果,只好用了魔术方法__get __set来间接调用

    觉得很赞
  • 回复于 2017-07-17 13:47 举报

    如果此类属性名和类成员变量相同,以后者为准。也就是你在get或set后使用的名字如果和类成员变量(就是前面设置的那个属性,比如例子1中的private $name;或例子2中的public $name = "1";)相同,将调用成员变量或给成员变量赋值,而不是调用getter或setter方法

您需要登录后才可以回复。登录 | 立即注册