php教程,如何理解类的魔术方法:__get()和__set()?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文讨论php
代码中,类的魔术方法中的__get()
和_set()
。它是用于设置或获取类的普通属性的魔术方法。注意:这里并不涉及类常量,以及类的静态变量。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:win10
,nginx@1.15.11
,php@8.2.10-nts
。当类属性无法被访问的时候(包括不存在或者private
等情况),就会触发本文的__get()
或者__set()
。
__get()
用于访问一个不能访问的普通类属性的时候,__get()
会被触发。
class SN
{
private $name = "苏南大叔";
public function __get($attr)
{
echo "试图获得属性:", $attr, PHP_EOL;
}
}
$sn = new SN;
echo $sn->name; // 无法访问的私有属性...
echo $sn->name2;
// echo $sn::name3; // Undefined class constant 'name3'
// echo SN::name4; // Undefined class constant 'name4'
// echo SN::$name5; // Access to undeclared static property: SN::$name5
输出:
试图获得属性:name
试图获得属性:name2
只要是通过->
访问的属性,就一定是public
的普通变量,不会是静态变量,也不会是常量。因为它们都是使用"::"访问的。但是使用->
访问的方法,则可能是普通方法,也可能是静态方法。
__set()
class SN
{
private $name = "苏南大叔";
public function __set($attr, $value)
{
echo "试图设置属性:", $attr . "(" . $value . ")", PHP_EOL;
}
public static $name6 ="";
}
$sn = new SN;
$sn->name = "sunan大叔"; // 无法访问的私有属性...
$sn->name2 = "苏南二叔";
// $sn::name3 = "苏南三叔"; // syntax error, unexpected '='
// SN::name4 = "苏南四叔"; // syntax error, unexpected '='
// SN::$name5 = "苏南五叔"; // Access to undeclared static property: SN::$name5
SN::$name6 = "苏南六叔";
echo SN::$name6; // 苏南六叔
输出:
试图设置属性:name(sunan大叔)
试图设置属性:name2(苏南二叔)
苏南六叔
常量一旦定义则无法改变,所以,在外部试图使用::
修改常量,直接报错不符合语法。试图使用::$
修改一个静态变量,就需要确保是public static
的。
相关文章
- https://newsn.net/say/js-proxy-2.html
- https://newsn.net/say/php-class-chain.html
- https://newsn.net/say/php-static-var.html
- https://newsn.net/say/php-static-method.html
结束语
本文并未涉及静态变量以及常量相关的魔术函数,所以感知的仅仅是普通的类属性。更多苏南大叔的php
经验文章,请点击:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。