PHP8中的魔术方法-PHP8知识详解

在PHP 8中,魔术方法是一种特殊的方法,它们以两个下划线(__)开头。魔术方法允许您定义类的行为,例如创建对象、调用其他方法或访问和修改类的属性。以下是一些常见的魔术方法:

__construct(): 类的构造函数。当一个对象被创建时自动调用。

__destruct(): 类的析构函数。当一个对象被销毁时自动调用。

__get($name): 在读取一个不可访问属性的值时自动调用。

__set(name, value): 在给一个不可访问属性赋值时自动调用。

__isset($name): 在对不可访问属性调用 isset() 或 empty() 函数时自动调用。

__unset($name): 在对不可访问属性调用 unset() 函数时自动调用。

__call(name, arguments): 在调用一个不存在或不可访问的方法时自动调用。

__callstatic(name, arguments): 在调用一个不存在或不可访问的静态方法时自动调用。

__toString(): 在将对象作为字符串输出时自动调用。

__invoke($arguments): 当尝试将对象作为函数调用时自动调用。

__clone(): 当对象被克隆时自动调用。

__debugInfo(): 在使用 var_dump() 函数输出对象信息时自动调用。

__serialize(): 在对象被序列化时自动调用。

__unserialize($data): 在对象被反序列化时自动调用。

__sleep(): 在对象被序列化时自动调用,返回要序列化的属性列表。

__wakeup(): 在对象被反序列化时自动调用。

因为php8有众多的魔术方法,本文也不会一一详细说明了,本文以__set()和__get()方法来详细讲解。

由于面向对象思想并不鼓励直接从类的外部访问类的属性,以强调封装性,所以可以使用__get 和__set 方法来达到此目的。无论何时,类属性被访问和操作时,访问方法都会被激发。通过使用它们,可以避免直接对类属性进行访问。

(1)当程序试图写入一个没有定义或不可见的成员变量时,PHP就会执行__set()方法。该方法包含两个参数,分别表示变量名称和变量值。

(2) 当程序调用一个没有定义或不可见的成员变量时,PHP就会执行__get()方法来读取变量值。该方法包含一个参数,表示要调用变量的名称。

使用__set()和__get()方法,参考代码:

复制代码
<?php
    https://www.olzz.com/tag/class/ Fruit{
        function __set($names,$value){
            $this->$names = $value;
        }

        function __get($names){
            https://www.olzz.com/tag/return/ $this->$names;
        }
    };
    $a = new Fruit ();
    $a->name = "梨子";
    $a->price = "3.88元";
    echo $a->name."的价格为:".$a->price."<br />";
    $b = new Fruit();
    $b->name = "火龙果";
    $b->num="666公斤";
    $b->price= "4.88元";
    echo $b->name."的库存为:".$b->num.",价格为: ".$b->price."<br />";
?>

以上代码在PHP8中的运行结果如下:

复制代码
梨子的价格为:3.88元
火龙果的库存为:666公斤,价格为: 4.88元

上面代码中,变量name、price、num都是没有定义成员变量,所以此时会调用__set()和__get()方法。

相关推荐
Lazionr1 分钟前
unordered_map和unordered_set的使用
开发语言·c++·算法
Xiu Yan24 分钟前
Python 数据分析:数据分析步骤
开发语言·python·数据分析
魔众30 分钟前
ModStartBlog v11.3.0 安全加固、体验优化,自动化测试更强大
开源·php·laravel
黑妹天下第一乖32 分钟前
小智改造实战解读-用kokoro-onnx替换云端 TTS 的完整记录
大数据·开发语言·人工智能·python·交互
郑州光合科技余经理33 分钟前
本地生活平台搭建:跨业态用户标识怎么贯通
java·开发语言·前端·后端·uni-app·php·ai编程
深盾科技_Virbox42 分钟前
云端与本地并行交付,软件许可管理如何实现统一运营?
java·大数据·开发语言·安全
xuxigifxfh1 小时前
HJ15 求int型正整数在内存中存储时1的个数
java·开发语言·华为机考
Wokoo71 小时前
自动化测试入门:核心场景、回归测试与 Web 自动化环境搭建
java·开发语言·测试工具
tachibana21 小时前
Golang 中数组和切片的区别?
开发语言·后端·golang·数组·切片
智购科技无人售货机工厂店2 小时前
玻璃瓶饮料破损率突然上升,排查发现是取货口缓冲垫老化了~YH
java·开发语言·人工智能·python·eclipse