初学 PHP __set ( ) 和 __ get ( )
一、通过自定义方法访问私有属性
在类外,不能修改和读取类中的私有属性或者受保护的属性,为了到达目的,可以在类中定义一个公共的方法供使用
<?php
class Staff{
private $name;
private $salary;
public function setSalary($salary){
$this->salary = $salary;
}
public function getSalary(){
return $this->salary;
}
}
$staff = new Staff();
$staff->setSalary(1000);
echo $staff->getSalary();//输出 1000
上面的这种方式不灵活,如果要设置别的属性,还要再写相应的方法,可以写一个通用的设置属性的方法,如下
<?php
class Staff{
private $name;
private $salary;
public function setAttribute($Attribute, $value){
$this->$Attribute = $value;
}
public function getAttribute($Attribute){
return $this->$Attribute;
}
}
$staff = new Staff();
$staff->setAttribute("name", "刘看山");
echo $staff->getAttribute("name");//输出 刘看山
二、通过魔术方法访问私有属性
当访问私有的或者受保护的属性时, __set()
__get()
这两个魔术方法会被调用
<?php
class Staff{
private $name;
private $salary;
public function __set($Attribute, $value){
$this->$Attribute = $value;
}
public function __get($Attribute){
return $this->$Attribute;
}
}
$staff = new Staff();
$staff->name = "刘看山";
echo $staff->name;//输出 刘看山
本作品采用《CC 协议》,转载必须注明作者和本文链接
不懂就问,为了访问私有属性还要特意操作魔术方法,为什么不直接把属性改成公有的就好
@linxb 如果是有很多等级的用户呢?只让其中某一种人有权访问,_get里要做身份验证的
@linxb 我现在也不知道怎么回答,因为我也是一个新手,只是我在学 PDO 的时候,如果要设置 PDO 中的属性,不能直接设置,要通过方法来设置. 有这样一段代码
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
(这里的$this->pdo
是我自己项目中的). 可见,PDO 中提供了这样一个设置属性的方法setAttribute()
,第一个参数PDO::ATTR_ERRMODE
表示属性名,第二个参数PDO::ERRMODE_EXCEPTION
表示属性值,那么这句代码的意思就是将 PDO 中的错误报告模式设置为抛出异常模式.具体参见PDO::setAttribute按上面示例来说,定义的两个私有变量是多余的
@wanghan 有道理,只是之前没有过这样的场景,所以觉得疑惑