php魔术方法

构造函数:__construct()
实例化对象时被调用。
在类中,构造函数是用来初始化对象的,利用构造函数,可以操作对象,并改变它的值。
当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
当子类重写了构造函数,子类被实例化时,只调用子类的构造函数,而父类的构造函数不被调用。
析构函数:__destruct()
当删除一个对象或对象操作终止时被调用。
当该对象的所有引用都被删除,或者对象被显式销毁时执行。
克隆函数:__clone()
当对象被拷贝(克隆)时直接调用。
如$a = new Action(); $a = $object;
__set($name, $value)
用$object->a = 17的方式给属性赋值时,如果属性a存在且是public型,那么直接给属性a赋值皆可;
如果属性a不存在或者是protected/private型,就会调用__set($name, $value)方法。
二个参数:属性、属性值。
__get($name)
用$object->a的方式读取对象的属性时,如果属性a存在且是public型,那么直接返回该属性的值;
如果属性a不存在或者是protected/private修饰的不可直接访问的类型,就会调该方法并以返回值为准。
一般可以使用该方法使外部可限制性地访问内部属性,或者完成类似java中的反射操作。
__isset($name)
检测一个对象的属性是否存在时被调用。
如:isset($c->name),如果name不存在,则触发该函数。
对不存在或者不可访问的属性使用isset()或者empty()时,__isset()会被调用。
__unset($name)
销毁一个对象的属性时被调用。
如:unset($c->name),如果name不存在,则触发该函数。
当unset一个不存在或者不可访问的属性时,__unset()会被调用,否则直接unset该属性皆可。
__call($name, $arguments)
当调用不存在或者不可访问的方法时,会调用__call($name, $arguments)方法。
__callStatic($name, $arguments)
当在静态方法中调用不存在或者不可访问的方法时,会调用__callStatic($name, $arguments)方法。
这个方法 是PHP5.3里才添加的,比较新。
__toString()
当打印对象时会被直接调用。如 echo $object; 或 print $obj;
注意:这时候php会抛出一个Catchable fatal error错误;用print_r打印对象不会触发此函数。
__set_state()
用var_export()输出一个对象时,__set_state()会被调用,输出内容以该魔术方法的返回值为准。
注:var_export()和var_dump()类似,只是var_export()输出的内容符合php语法。
__autoload($name)
实例化一个对象时,如果对应的类不存在,则该方法被调用。
这个函数比较特殊,这个函数并不是作为类的成员方法使用的。
注意:该方法是全局函数,参数是类的名称。
可以用spl_autoload_register函数来定义其他的函数来代替__autoload
__sleep()
serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
__wakeup()
unserialize时被调用,做些对象的初始化工作。
### PHP 魔术方法概述 PHP魔术方法是一组特殊的类成员函数,这些方法的名字以双下划线 `__` 开头。它们的主要作用是在特定条件下被触发执行,从而提供了一种灵活的方式来处理各种场景下的需求。 #### 常见的魔术方法及其功能 以下是几个常见的魔术方法以及其具体用途: 1. **`__construct()`** - 当创建一个新的对象实例时会自动调用此方法。 - 它通常用于初始化对象的状态或设置默认属性值。 - 示例代码如下: ```php class Example { public function __construct() { echo "对象已创建"; } } $obj = new Example(); // 输出: 对象已创建 ``` 2. **`__destruct()`** - 此方法会在对象销毁之前被调用。 - 主要用来清理资源或者保存数据到文件等操作。 - 示例代码如下: ```php class Example { public function __destruct() { echo "对象即将销毁"; } } $obj = new Example(); unset($obj); // 输出: 对象即将销毁 ``` 3. **`__get()` 和 `__set()`** - 这两个方法分别用于访问和修改未定义或不可达的私有/受保护属性。 - 如果试图读取不存在的属性,则会触发 `__get()`;如果尝试写入这样的属性则会触发 `__set()`。 - 示例代码如下: ```php class Example { private $data; public function __set($key, $value) { $this->data[$key] = $value; } public function __get($key) { return isset($this->data[$key]) ? $this->data[$key] : null; } } $example = new Example(); $example->test = 'hello'; // 调用了 __set() echo $example->test; // 调用了 __get(), 输出: hello ``` 4. **`__call()` 和 `__callStatic()`** - 当调用一个不存在的方法时,这两个方法会被激活。 - `__call()` 处理的是实例方法调用,而 `__callStatic()` 是静态方法调用的情况。 - 示例代码如下: ```php class Example { public function __call($method, $args) { echo "$method was called with arguments: "; print_r($args); } public static function __callStatic($method, $args) { echo "$method was statically called with arguments: "; print_r($args); } } $example = new Example(); $example->nonExistentMethod(1, 2, 3); // 动态方法调用 Example::anotherNonExistentMethod('a', 'b'); // 静态方法调用 ``` 5. **`__toString()`** - 将对象转换成字符串表示形式的时候会调用该方法。 - 特别适用于打印调试信息或是将对象嵌套于其他字符串之中。 - 示例代码如下: ```php class Example { public function __toString() { return "这是一个Example类的对象"; } } $example = new Example(); echo $example; // 输出: 这是一个Example类的对象 ``` 6. **`__invoke()`** - 如同引用所描述的一样,在尝试像函数一样调用某个对象时,这个方法就会被执行[^2]。 - 示例代码已在引用中给出。 7. **`__clone()`** - 创建当前对象副本之后立即调用它。 - 可在此处实现深拷贝逻辑或者其他必要的克隆后动作[^2]。 - 示例代码如下: ```php class Example { protected $property; public function __clone() { $this->property = clone $this->property; } } ``` 8. **`__sleep()` 和 `__wakeup()`** - 序列化过程中涉及到了这两个方法。 - `__sleep()` 返回一个数组指定哪些变量应该序列化存储下来; - `__wakeup()` 则负责反序列化后的恢复工作。 9. **`__debugInfo()` (自 PHP 5.6 起可用)** - 提供定制化的 var_dump 结果展示方式。 ### 总结 利用好这些魔术方法可以极大地提升程序设计的质量与效率,同时也让代码更加简洁易懂。然而需要注意过度依赖可能会降低可维护性和清晰度,因此应当谨慎选用合适的场合应用之[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值