那些年我们错过的魔术方法

 PHP 对象的一个优势是可以使用魔术方法,这些方法可以不需要修改外部代码而重写一个类的默认行为,这使得PHP 语法有更少的冗余性和更具有扩展性。这些方法很好识别,他们都是以双下划线(__)开始的

PHP 对象的一个优势是可以使用魔术方法,这些方法可以不需要修改外部代码而重写一个类的默认行为,这使得PHP 语法有更少的冗余性和更具有扩展性。这些方法很好识别,他们都是以双下划线(__)开始的。
比如: __construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state() 和 __clone() 等方法在 PHP 中被称为"魔术方法"(Magic methods)。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。
 
注意:
 
PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
 
1、__get、__set
 
这两个方法是为在类和他们的父类中没有声明的属性而设计的。
 
 
代码如下:
__get(string $name)  //当调用一个未定义的属性时访问此方法;
__set(string $name, mixed $value)  //给一个未定义的属性赋值时调用;
 
 
这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。
 
2、__isset、__unset
 
 
代码如下:
__isset( $property ) //当在一个未定义的属性上调用isset()函数时调用此方法;
__unset( $property ) //当在一个未定义的属性上调用unset()函数时调用此方法;
 
 
3、__call、__callStatic
 
 
 代码如下:__call(string $name, array $arguments) //当调用一个未定义的方法是调用此方法。 
 
这里的未定义的方法包括没有权限访问的方法。
 
 
代码如下:__callStatic(string $name, array $arguments) 
 
当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。
 
__callStatic 它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用,PHP5.3.0以上版本有效。
PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。同样,__call() 魔术方法必须被定义为公共的,所有其他魔术方法都必须如此。
 
4、__autoload
 
__autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
注意:在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。
 
 
5、__construct、__destruct
 
__construct 构造方法,当一个对象创建时调用此方法。
使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么。这样你在改变类的名称时,就不需要改变构造方法的名称。
__destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源。
析构函数允许你在使用一个对象之后执行任意代码来清除内存。
当PHP决定你的脚本不再与对象相关时,析构函数将被调用。
在一个函数的命名空间内,这会发生在函数return的时候。
对于全局变量,这发生于脚本结束的时候。如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值,通常将变量赋值勤为NULL或者调用unset。
 
6、__clone
 
PHP5中的对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法。
如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。
 
7、__toString 
 
 
代码如下:
public string __toString ( void )
 
 
__toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时。 应该显示些什么。此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。
 
 
 代码如下:
$myObject = new myClass();
echo $myObject;
// Will look for a magic method echo
$myObject->__toString();
 
 
注意:不能在 __toString() 方法中抛出异常。这么做会导致致命错误。
 
需要指出的是在 PHP 5.2.0 之前,__toString() 方法只有在直接使用于 echo 或 print 时才能生效。PHP 5.2.0 之后,则可以在任何字符串环境生效(例如通过 printf(),使用 %s 修饰符),但不能用于非字符串环境(如使用 %d 修饰符)。自 PHP 5.2.0 起,如果将一个未定义 __toString() 方法的对象转换为字符串,会产生 E_RECOVERABLE_ERROR 级别的错误。
 
8、__sleep() 和 __wakeup()
 
 代码如下:
public array __sleep ( void )
void __wakeup ( void )
 
 
serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
 
注意:
 
__sleep() 不能返回父类的私有成员的名字,这样做会产生一个 E_NOTICE 级别的错误。可以用 Serializable 接口来替代。
__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。
与之相反, unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。
__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
 
9、__invoke()
 
 
 代码如下:mixed __invoke ([ $... ] ) 
 
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
 
10、__set_state()
 
 
代码如下:static object __set_state ( array $properties ) 
 
自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态方法会被调用。
本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性。
 

时间: 2024-10-26 09:00:51

那些年我们错过的魔术方法的相关文章

那些年我们错过的魔术方法(Magic Methods)_php技巧

PHP 对象的一个优势是可以使用魔术方法,这些方法可以不需要修改外部代码而重写一个类的默认行为,这使得PHP 语法有更少的冗余性和更具有扩展性.这些方法很好识别,他们都是以双下划线(__)开始的.比如: __construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),__set_state() 和

PHP的魔术方法

1.__get/__set:对对象属性的接管 2.__call/__callStatic:控制php对象方法的使用 3.__toString:将php对象转换成字符串 4.__invoke:将一个php对象当成函数来执行时来回调这个方法 class Object { protected $array = array(); function __set($key,$value) { var_dump(__METHOD__); $this->array[$key] = $value; } funct

PHP 5.3的新增魔术方法

  PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象. class testClass { public function __invoke { print "hello world"; } } $n = new testClass; $n(); 执行结果为: hello world. 官方示例 class CallableClass { public function __invoke($x) { var_dump($x); } } $obj

MongoDB实战(2)工具集与特殊魔术方法

一.MongoDB启动方式 MongoDB除了支持命令行的启动方式还支持配置文件启动通过读取启动配置文件的方式来启动数据库比方说配置文件如下 则可以使用如下命令 ./mongod -f /etc/mongodb.conf MongoDB参数说明 dbpath: 数据文件存放路径每个数据库会在其中创建一个子目录用于防止同一个实例多次运行的mongod.lock也保存在此目录中. logpath 错误日志文件 logappend 错误日志采用追加模式默认是覆写模式 bind_ip 对外服务的绑定ip

PHP中的常见魔术方法功能作用及用法实例

  这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)__get()和.__set().__isset()等等魔术方法,需要的朋友可以参考下 概述 在面向对象编程中,PHP提供了一系列的魔术方法,这些魔术方法为编程提供了很多便利.PHP中的魔术方法通常以__(两个下划线)开始,并且不需要显示的调用而是由某种特定的条件出发.这篇文章简单总结了PHP中提

PHP魔术方法的使用示例

  这篇文章主要介绍了PHP魔术方法的使用示例,本文分别讲解了__get.__set.__call.__callStatic.__toString. __invoke等魔术方法的使用,需要的朋友可以参考下 ① __get/__set:将对象的属性进行接管 当访问一个不存在的对象属性时: index.php 代码如下: define('BASEDIR',__DIR__); //定义根目录常量 include BASEDIR.'/Common/Loader.php'; spl_autoload_re

PHP中的魔术方法总结和使用实例

  这篇文章主要介绍了PHP中的魔术方法总结和使用实例,魔术方法是PHP面向对象中特有的特性,它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,需要的朋友可以参考下 魔术方法是PHP面向对象中特有的特性.它们在特定的情况下被触发,都是以双下划线开头,你可以把它们理解为钩子,利用模式方法可以轻松实现PHP面向对象中重载(Overloading即动态创建类属性和方法).魔术方法很多还是成对出现的,以下列出目前PHP中所有的模式方法. 1.__construct,__destruc

PHP中魔术方法的用法

  PHP中魔术方法的用法 /** PHP把所有以__(两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以 __为前缀. * */ // __toString.__set.__get__isset().__unset() /* The __toString method allows a class to decide how it will react when it is converted to a string. __set() is run when writing

php教程之魔术方法的使用示例

 这篇文章主要介绍了php的魔术方法的使用示例(php魔术函数),需要的朋友可以参考下  代码如下: /** PHP把所有以__(两个下划线)开头的类方法当成魔术方法.所以你定义自己的类方法时,不要以 __为前缀. * */   // __toString.__set.__get__isset().__unset() /*   The __toString method allows a class to decide how it will react when it is converted