本文章有误,不要阅读该文章。
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中了。