我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文讨论php代码中,类的魔术方法中的__get()_set()。它是用于设置或获取类的普通属性的魔术方法。注意:这里并不涉及类常量,以及类的静态变量。

苏南大叔:php教程,如何理解类的魔术方法:__get()和__set()? - 类属性魔术函数setget
php教程,如何理解类的魔术方法:__get()和__set()?(图1-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:win10nginx@1.15.11php@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的。

相关文章

结束语

本文并未涉及静态变量以及常量相关的魔术函数,所以感知的仅仅是普通的类属性。更多苏南大叔的php经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php