认识__get及__set,并看看Laravel如何使用它们

  • 时间:2021-09-12 15:36 编辑:知速网 来源:知速网 阅读:292
  • 扫一扫,手机访问
摘要:认识__get及__set,并看看Laravel如何使用它们

此次要讲的是,可以让操作资料更弹性的__get及__set,


先来看看官网定义:


__set() is run when writing data to inaccessible (protected or private) or non-existing properties.


__get() is utilized for reading data from inaccessible (protected or private) or non-existing properties.


简单来说,当存取到不存在(non-existing)、或没有读取权限(protected or private)的属性(property)时,就会自动触发__get或__set。


先看__get

先来看一个使用__get的范例·:

class Fruit
{
    public $lemon = 'goodLemon';
    private $cherry = 'goodCherry';
    protected $orange = 'goodOrange';
    public function __get($name)
    {
        return "[__get] $name";
    }
}
$fruit = new Fruit();
// 1. public
//    → string(5) "goodLemon" 
var_dump($fruit->lemon); 
// 2. inaccessible(pivate)
//    → string(14) "[__get] cherry"
var_dump($fruit->cherry);
// 3. inaccessible(protected) 
//    → string(14) "[__get] orange"
var_dump($fruit->orange);
// 4. non-existing
//    → string(13) "[__get] apple"
var_dump($fruit->apple);

如范例所见,


lemno是public的属性,所以可以正常读取。

cherry是private,外界基本上是没办法读取的,因此触发了__get魔术方法。

orange是protected,外f界基本上是没办法读取的,因此触发了__get魔术方法。

第四个范例的apple,基本上根本没有宣告过,所以是不存在的,也触发了__get魔术方法。

补充:


__get的第一个参数$name就是使用者所呼叫的属性(property)名称,例如,当使用者呼叫$fruit->cherry时,__get收到的第一个参数就是'cherry'字串。


再看__set

一样直接来看__set的范例:

class Fruit
{
    public $lemon = '';
    private $cherry = '';
    protected $orange = '';
    public function __set($name, $value)
    {
        echo "[__set] $name, $value".PHP_EOL;
    }
}
$fruit = new Fruit();
// 1. public
//    → 正常
$fruit->lemon = 'goodLemon';
// 2. pivate
//    → [__set] cherry, goodCherry
$fruit->cherry = 'goodCherry';
// 3. protected
//    → [__set] orange, goodOrange
$fruit->orange = 'goodOrange';
// 4. non-existing
//    → [__set] apple, goodApple
$fruit->apple = 'goodApple';

如范例所见,


lemno是public的属性,所以可以正常写入。

cherry是private,外界基本上是没办法写入的,因此触发了__set魔术方法。

orange是protected,外界基本上是没办法写入的,因此触发了__set魔术方法。

第四个范例的apple,基本上根本没有宣告过,所以是不存在的,也触发了__set魔术方法。

补充:


__set的第一个参数$name一样是属性的名称,第二个参数$value则是想要设定的值,例如$fruit->cherry = 'goodCherry',$value就是字串'goodCherry'。

get、set放在一起看

大家都知道, 一般来说,是无法读取private属性的,所以像下面范例一样,直接读取private $apple,程式会直接喷错。

class Fruit
{
    private $apple;
}
$fruit = new Fruit();
// PHP Fatal error:  Uncaught Error: Cannot access private property Fruit::$apple
// → 程式終止
var_dump($fruit->apple);
$fruit->apple = 'apple';
var_dump($fruit->apple);

因此,为了要完成这段程式,我们需要同时利用__get及__set。

class Fruit
{
    private $apple;
    public function __get($name)
    {
        return $this->$name;
    }
    public function __set($name, $value)
    {
        $this->$name = $value;
    }
}
$fruit = new Fruit();
// 1. NULL
var_dump($fruit->apple);
// 2. 成功
$fruit->apple = 'apple';
// 3. string(5) "apple"
var_dump($fruit->apple);

第一次呼叫apple的时候,虽然它仍然是private的属性,但因为这次有__get了,所以不会报错,得到了NULL。

我们assign一个值给apple,透过__set,我们成功把值赋与了变数$apple。

再一次呼叫apple,因为前面成功assign,这次可以成功拿到字串apple。

补充:


$this->$name,这样的用法,是因为php的语法特性,可以把变数中所包含的字串取出,作为变数名称。所以当$name为'apple'时,$this->$name等同于$this->apple。


Laravel中的应用


  • 全部评论(0)
上一篇:已是第一篇内容
下一篇:解决网站服务器遇到 Allowed memory exhausted 问题
最新发布的资讯信息
【计算机/互联网|】小红书账号交易要找靠谱的平台。(2021-09-18 10:28)
【计算机/互联网|】小红书账号转让要注意的流程(2021-09-17 10:56)
【技术支持|】认识__get及__set,并看看Laravel如何使用它们(2021-09-12 15:36)
【技术支持|】解决网站服务器遇到 Allowed memory exhausted 问题(2021-09-12 15:32)
【计算机/互联网|】MySQL Community 版本与MySQL企业版有什么不同? 有什么限制?(2021-06-18 09:06)
【技术支持|】如何获取两个日期之间的所有日期?(2021-06-11 08:08)
【技术支持|】Laravel-S (Swoole 加速) 的初步探索整理(2021-06-10 17:15)
【计算机/互联网|】PHP7无法载入LDAP的解决方式(2021-06-10 10:46)
【计算机/互联网|】win10下PHP的安装与设定(2021-06-09 08:41)
【计算机/互联网|】C# MVC View 底下字串(string)的显示方式(2021-06-08 11:05)
联系我们
工作时间:8:00-23:30
客服 QQ:93613971
邮 箱:admin#zhisu.com
法律顾问:聊城瀚诚律师事务所