php 魔术方法__get()和__set()理解

时间:2023-03-08 16:22:31

__get()方法,官方手册上是这样解释的 : ' 当调用(自己加的:或设置|赋值)当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。本节后面将使用"不可访问属性(inaccessible properties)"和"不可访问方法(inaccessible methods)"来称呼这些未定义或不可见的类属性或方法'。'未定义'容易理解。我们知道类权限控制有三个关键字分别是'public','private','protected',其中除了'public'对于__get()和__set()方法来说都是不可见性,当访问和设置未定义和已经订定义但关键字为'private,protected'属性时会自动调用__get(),__set()方法。

正常情况下__get()默认返回的是第二个参数value的值,而__set()默认返回的第一个参数name的值(注意:这里有点歧义,上面说php会忽略__set()的返回值,这里指的是会忽略__set()方法体里自定义返回值而默认的返回值照常返回,也即是说__set()方法无论如何返回的都是默认返回值,而__get()不会忽略任何返回值,当方法体内有返回值会返回,无返回值返回默认的返回值),

还有注意点就是:

因为 PHP 处理赋值运算的方式,__set() 的返回值将被忽略。类似的, 在下面这样的链式赋值中,__get() 不会被调用

$a = $obj->b = 8; (这种写法__get()不会被调用,虽然看起来访问了不存在的属性b,将一个属性赋值给一个变量也算是访问一个属性情况)