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

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

文章已超过725天无更新,请确认内容是否可用

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

喜欢就支持一下吧!

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

女人、金钱和坏事总是新闻

威·柯珀

推荐阅读

提升开发效率:PHPStorm常用插件大全

本文详细介绍了PHPStorm常用的插件,包括了日常开发中的热门插件,帮助开发者提升开发效率和代码质量。

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

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

本文列举了16个PHP开发者应当掌握的魔术方法,涵盖了它们的定义、使用场景和实现技巧,为PHP开发提供重要参考。

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

读懂 Docker:基础概念、实用场景与应用现状

本文详细介绍了 Docker 的概念、用途以及其在当下是否广泛使用的情况,从定义、核心组件阐述 Docker 是什么,列...

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

查看内存系列命令应用以及介绍【Linux 篇】

在日常运维Linux系统时,物理内存是其中最重要的一方面。Linux 本身提供了少的方法来帮助我们查看相关信息!下面是一...

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

Mysql数据库常见优化建议(持续更新中)

优化数据库是数据库管理员和数据库开发人员的必备技能。Mysql作为和我们平时打交道最多的数据库之一,如何才能让它发挥出最...

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

深入解析 React 和 Vue.js 性能优化策略

本文深入解析了 React 和 Vue.js 的性能优化策略,包括 React 的 React.memo 与 PureC...

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

深入理解 PHP 中的依赖注入与控制反转

本文深入讲解 PHP 中的依赖注入与控制反转,包括技术细节、实战案例,并提供总结与扩展学习建议,帮助开发者提升项目架构能...

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

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

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

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