16个PHP开发者必知必会的魔术方法

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 代码编程 发布于1年前 更新于1年前 569

PHP作为一种广泛使用的服务器端脚本语言,不仅因其灵活性受到开发者的青睐,而且还因其提供的众多魔术方法(Magic Methods)而备受欢迎。魔术方法是PHP中的特殊方法,以双下划线(__)开头,它们在特定的情况下会自动被调用,极大地增强了语言的表达力。接下来,我们将深入探索16个对PHP开发者而言必知必会的魔术方法,并通过具体示例来解释它们的用途和工作原理。

1. __construct()

构造方法在创建对象时自动调用,通常用于初始化对象属性。

class MyClass {
    public function __construct() {
        echo "对象已创建";
    }
}
$obj = new MyClass(); // 输出:对象已创建

2. __destruct()

析构方法在对象没有被引用时自动调用,常用于资源的清理工作。

class MyClass {
    public function __destruct() {
        echo "对象被销毁";
    }
}
$obj = new MyClass();
unset($obj); // 输出:对象被销毁

3. __call()

当调用一个对象中不可访问的方法时,__call()方法会被自动调用。

class MyClass {
    public function __call($name, $arguments) {
        echo "调用方法 $name 不存在。参数列表:" . implode(', ', $arguments);
    }
}
$obj = new MyClass();
$obj->nonExistentMethod('参数1', '参数2'); // 输出:调用方法 nonExistentMethod 不存在。参数列表:参数1, 参数2

4. __callStatic()

当调用一个类中不可访问的静态方法时,__callStatic()方法会被自动调用。

class MyClass {
    public static function __callStatic($name, $arguments) {
        echo "调用静态方法 $name 不存在。参数列表:" . implode(', ', $arguments);
    }
}
MyClass::nonExistentStaticMethod('参数1', '参数2'); // 输出:调用静态方法 nonExistentStaticMethod 不存在。参数列表:参数1, 参数2

5. __get()

当读取对象中不可访问的属性时,__get()方法会被自动调用。

class MyClass {
    private $data = array();
    
    public function __get($name) {
        return isset($this->data[$name]) ? $this->data[$name] : null;
    }
}
$obj = new MyClass();
echo $obj->undefinedProp; // 输出:null

6. __set()

当设置对象中不可访问的属性时,__set()方法会被自动调用。

class MyClass {
    private $data = array();
    
    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
}
$obj = new MyClass();
$obj->newProp = '测试';
echo $obj->newProp; // 输出:测试

7. __isset()

当使用isset()empty()检查对象中不可访问的属性时,__isset()方法会被自动调用。

class MyClass {
    private $data = array("prop" => "存在");
    
    public function __isset($name) {
        return isset($this->data[$name]);
    }
}
$obj = new MyClass();
var_dump(isset($obj->prop)); // 输出:bool(true)
var_dump(isset($obj->undefinedProp)); // 输出:bool(false)

8. __unset()

当使用unset()移除对象中不可访问的属性时,__unset()方法会被自动调用。

class MyClass {
    private $data = array("prop" => "存在");
    
    public function __unset($name) {
        unset($this->data[$name]);
    }
}
$obj = new MyClass();
unset($obj->prop);
var_dump(isset($obj->prop)); // 输出:bool(false)

9. __sleep()

__sleep()方法在使用serialize()函数序列化对象之前自动调用,可以用于清理对象并返回一个包含对象中所有应被序列化的属性名称的数组。

class MyClass {
    public $prop1 = '值1';
    private $prop2 = '值2';
    public $prop3 = '值3';
    
    public function __sleep() {
        return array('prop1', 'prop3');
    }
}
$obj = new MyClass();
$serialized = serialize($obj);
echo $serialized; // 输出:O:7:"MyClass":2:{s:5:"prop1";s:6:"值1";s:5:"prop3";s:6:"值3";}

10. __wakeup()

__wakeup()方法在使用unserialize()函数反序列化对象之后自动调用,用于重建任何资源类型的属性或执行其他初始化操作。

class MyClass {
    public function __wakeup() {
        // 重新初始化操作
    }
}

11. __toString()

当尝试将对象作为字符串输出时,__toString()方法会被自动调用。

class MyClass {
    public function __toString() {
        return "这是一个对象";
    }
}
$obj = new MyClass();
echo $obj; // 输出:这是一个对象

12. __invoke()

当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用。

class MyClass {
    public function __invoke($arg) {
        return "被当作函数调用,参数为:" . $arg;
    }
}
$obj = new MyClass();
echo $obj('测试'); // 输出:被当作函数调用,参数为:测试

13. __set_state()

__set_state()方法用于类中静态方法的声明,当使用var_export()导出类的实例时,此静态方法会被调用。

class MyClass {
    public $prop;
    
    public static function __set_state($an_array) {
        $obj = new MyClass();
        $obj->prop = $an_array['prop'];
        return $obj;
    }
}
$obj = new MyClass();
$obj->prop = '测试';
$exported = var_export($obj, true);
echo $exported; // 输出:MyClass::__set_state(array( 'prop' => '测试', ))

14. __clone()

__clone()方法在对象被克隆时自动调用,用于修改新克隆的对象的属性或执行克隆后的初始化。

class MyClass {
    public $prop;
    
    public function __clone() {
        // 克隆后的操作
    }
}
$obj = new MyClass();
$obj2 = clone $obj;

15. __debugInfo()

__debugInfo()方法在使用var_dump()打印对象信息时自动调用,可以用于控制哪些属性和信息被输出。

class MyClass {
    private $hidden = '隐藏值';
    
    public function __debugInfo() {
        return [
            'revealed' => '这是可见的',
        ];
    }
}
$obj = new MyClass();
var_dump($obj); // 将仅显示revealed属性

16. __serialize()__unserialize()

在PHP 7.4及以上版本中,__serialize()__unserialize()提供了对对象序列化和反序列化过程的更细粒度控制。

class MyClass {
    private $prop = '值';
    
    public function __serialize(): array {
        return ['prop' => $this->prop];
    }
    
    public function __unserialize(array $data): void {
        $this->prop = $data['prop'];
    }
}
$obj = new MyClass();
$serialized = serialize($obj);
echo $serialized; // 输出序列化后的字符串

$unserialized = unserialize($serialized);
var_dump($unserialized); // 输出反序列化后的对象
THE END

喜欢就支持一下吧!

版权声明:除却声明转载或特殊注明,否则均为艾林博客原创文章,分享是一种美德,转载请保留原链接,感谢您的支持和理解

读书人上厕所时间长,那不是干肠,是在蹲坑读书;读书人最能忍受老婆的嘟嚷,也不是脾气好,是读书人入了迷两耳如塞。吃饭读书,筷子常会把烟灰缸的烟头送进口里,但不易得脚气病,因为读书时最习惯抠脚丫子。可怜都是蜘蛛般的体形,都是金鱼似的肿眼,没个倾国倾城貌,只有多愁多病身。

贾平凹

推荐阅读

构建高效稳定的PHP应用:PHP服务器性能优化与架构设计

本文围绕PHP、Linux服务器和前端程序,探讨如何构建高效稳定的PHP应用。文章首先介绍了PHP服务器性能优化的关键步...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 02月27日

探索PHP 8:构建更现代、安全和高效的Web应用程序

深入探讨如何使用PHP 8的新特性来构建现代、安全、高效的Web应用程序,包括JIT编译器、属性(Attributes)...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月12日

深入探索PHP面向对象编程

探索PHP面向对象编程(OOP)的核心概念,包括类和对象的定义、继承、接口、抽象类、特质、匿名类等,通过具体案例深入理解...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月18日

thinkphp 模型withCount方法如何指定COUNT字段

本文将详细介绍如何在 ThinkPHP 模型中使用 withCount 方法来获取关联模型的计数信息。通过指定 COUN...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 01月03日

PHP $_SERVER 超全局变量全面解读:深入挖掘 Web 开发的宝库

深入探索PHP中的$_SERVER超全局变量,包括常用字段解析、安全性考虑及实际应用示例,助力开发者构建更稳定、安全的W...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 04月15日

MySQL全文索引深度剖析:加速您的文本搜索

深入探讨MySQL全文索引,包括其定义、优劣势、使用场景,以及通过实例展示其工作原理。了解如何在大量文本数据中使用全文索...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 04月20日

深度探索 PHP 8 注解:从基础概念到高级应用

本文全面深入地探讨了 PHP 8 注解,从基础概念、原理分析到自带注解详解与高级应用实践,为开发者提供了关于注解的全方位...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月12日

深入实现Laravel API认证:如何配置和使用JWT中间件

本文深入探讨了如何在Laravel中实现JWT中间件,以保护API安全。包含了JWT的安装、配置、中间件的创建和注册、路...

https://file-one.7k7s.com//uploads/20240604/89f56a7378e381410f4dfcfab3948775.jpg
陈杰 03月08日