本文章有误,不要阅读该文章。
1.对于public 定义的类的变量称为成员变量,譬如:
public $age;
2.通过 get开头的方法定义的为属性,他们都可以通过$ob->age 访问,譬如:
public function getSex() {} public function setSex($sex) {}
3.下面我们看一下他们执行的优先级
class ob{ # 类成员变量 public $age =10; # 属性方法 public function getAge(){ return 18; } # 魔术方法 public function __get($name){ return 22 ; } }
如果我执行:
$ob = new ob(); $ob->age
执行的结果为:
1.返回的是public 定义的成员变量, 10
2.如果去掉public $age的定义,那么返回的是魔术方法 22
因为魔术方法对应的是,当某些成员变量不存在的时候,就会访问魔术方法__get
3.如果去掉 __get的方法的定义,才会访问对象的属性,那么返回的是 18
二:下面我们执行一点高级点的php知识:
有时候我们看似一个简单的赋值,可能在后面执行了很多我们看不到的东西,这个在yii2中有很多地方用到了。
class ob{ public $age = 10; public function setScore($score){ $this->age = 22; } public function getScore(){ $this->age = 55; return 199; } }
当我们执行:
$ob = new $ob() echo $ob->age; # 结果输出10,这个没有问题,很容易理解 echo $ob->score; # 结果为199 echo $ob->age; # 结果输出55 $ob->score = 10; #并没有给score赋值,而是给成员变量age赋值22 echo $ob->age; # 结果输出55
上面我写的代码有点离谱,不过对于理解这个概念很有帮助,可以看到我们利用封装的对象$ob,进行赋值,在当前代码中并没有赋值,而是干了其他的事情。
譬如在yii的model有一个赋值的函数
$model->attributes = […],这里执行的就是一个属性,也就是setAttributes,结果保存到了private类成员变量$_attributes中了。