__set和__get方法

__set和__get是两个比较重要的魔术方法,如下面代码所示。

<?php
class Account
{
    private $user = 1;
    private $pwd = 2;
}

$a = new Account();
echo $a->user;
$a->name = 5;
echo $a->name;
echo $a->big;

运行这段代码会怎么样呢?结果报错如下:

PHP Fatal error:  Cannot access private property Account::$user in F:\WWW\demo\2017\1\27\1.php on line 9

所报错误大致是说,不能访问Account对象的私有属性user。在上面代码中的Account类中增加以下代码,其中使用了__set和__get魔术方法。

public function __set($name,$value)
    {
        $this->$name = $value;
    }

    public function __get($name)
    {
        if(isset($this->$name)){
            return $this->$name;
        }
        return null;
    }

再次运行,看到正常输出,没有报错。在类里以链各个下划线开头的方法都属于魔术方法(除非是你自定义的),它们是PHP种的内置方法,有特殊含义。手册里把这个两个方法归到重载。

PHP的重载和Java等语言的重载不同。Java里,重载是指一个类中可以定义参数列表不同但名字相同的多个方法。比如Java也有构造方法,Java允许有多个构造函数,只要保证方法签名不一样就行;而PHP则在一个类中只允许有一个构造函数。

PHP提供的“重载”指动态地“创建”类属性和方法。因此,__set和__get方法被归到重载里。

这里可以直观看到,若类中定义了__set和__get这一对魔术方法,那么当给对象属性赋值或者取值时,即使这个属性不存在,也不会报错,一定程度上增加了程序的健壮性。

我们注意到,在Account类里,user属性的访问权限是私有的,私有的属性意味着这个属性是类的“私有财产”,只能在类内部对其进行操作。如果没有__set这个魔术方法,直接在类的外部对属性进行赋值操作是会报错的,只能通过在类中定义一个public的方法,然后在类外调用这个公开的方法进行属性读写操作。

现在有了这两个魔术方法,是不是对私有属性的操作变得更方便了呢?实际上,并没有什么奇怪的,因为这两个方法本身就是public的。它们和在对外的pblic方法中的操作private属性的原理一样。只不过这对魔术方法使其操作更简单,不需要显示地调用一个public的方法,因为这对魔术方法在操作类变量时是自动调用的。当然,也可以把类属性定义成public的,这样就可以随意在类的外部进行读写。不过,如果只是为了方便,类属性在任意时候都定义成public权限显然是不合适的,也不符合面向对象的设计思想

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值