初学 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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

不懂就问,为了访问私有属性还要特意操作魔术方法,为什么不直接把属性改成公有的就好

5年前 评论
wanghan

@linxb 如果是有很多等级的用户呢?只让其中某一种人有权访问,_get里要做身份验证的

5年前 评论

@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

5年前 评论

按上面示例来说,定义的两个私有变量是多余的

5年前 评论

@wanghan 有道理,只是之前没有过这样的场景,所以觉得疑惑

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!