php 一个容易被混淆的概念,深入理解成员变量和 属性。

本文章有误,不要阅读该文章。

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中了。

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注