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

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

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

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 Trait 的优势及使用场景详解

本文详细讲解了 PHP Trait 的定义、优势、使用场景及最佳实践,帮助开发者深入理解这一强大的代码复用工具,并在实际...

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

PHP中去除数组指定键值的方法

本文详细介绍了在PHP中去除数组中指定键值的几种方法,包括使用 array_filter、unset、array_dif...

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

深入理解PHP中的异常处理机制

深入探讨PHP中的异常处理机制,包括基础知识、自定义异常类的创建、多异常处理策略、使用finally块以及异常处理的最佳...

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

PHP中[guzzlehttp/guzzle] 的使用方法

如何在PHP中使用GuzzleHttp库进行HTTP请求。我们将详细解释如何使用GuzzleHttp发送GET、POST...

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

大模型名称中的K:揭秘AI的"记忆容量"选择艺术

从技术定义到商业价值,深度解析大模型名称中"K"的核心含义,通过法律审查、小说创作等场景揭示不同K值对任务效果的关键影响...

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

PHP 项目中的安全防护实战技巧

本文详细阐述了 PHP 项目中常见的安全威胁,并提供了具体的实战防护技巧,涵盖 SQL 注入、XSS 攻击、文件包含漏洞...

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

PHP的JIT魔法:解锁代码性能的秘密

深入探讨PHP 8的即时编译(JIT)特性,包括其工作原理、性能优化示例,以及在不同场景下的应用和局限性。

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

前后端分离架构的优点、挑战与最佳实践

本文详细介绍了前后端分离架构的优点、常见挑战及最佳实践,适用于开发团队在构建现代 Web 应用时参考和借鉴。

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