PHP魔术方法

FCLAMP 2020-05-19

PHP魔术方法

PHP将所有以__(两个下划线)开头的类的方法保留为魔术方法。所以在定义类方法时,建议不要以__为前缀。

构造函数__construct()

void __construct ([ mixed $args [, $... ]] )

PHP5允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时调用此方法,所以非常适合做一些初始化工作。

注意:如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。如果子类没有定义构造函数,则会如同一个普通的类方法一样从父类继承(假设没有被定义为private的话)。

举个例子:

PHP魔术方法

测试结果:

PHP魔术方法

析构函数__destruct()

void  __destruct ( void)

PHP5引入了析构函数的概念。这类似于其它面向对象语言,如C++。析构函数会在到某个对象的引用被删除或者当对象被显式销毁时执行

举个例子:

PHP魔术方法

测试结果:

PHP魔术方法

和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数中显示调用parent::__destruct()。此外也和构造函数一样,子类如果没用定义析构函数则会继承父类的。析构函数即使在使用exit()终止脚本时也会被调用。在析构函数中调用exit()将会终止其余关闭操作的运行。

试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。

方法重载__call()和__callStatic()

public mixed  __call ( string $name , array $arguments )
public static mixed  __callStatic ( string $name , array $arguments )

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

用静态方式调用一个不可访问的方法时,__callStatic()会被调用。

$name是要调用的方法的名称,$arguments参数是一个枚举数组,包含着要传递给方法$name的参数。

举个例子:

PHP魔术方法

测试结果:

PHP魔术方法

重载

PHP所提供的重载(overloading)是指动态地创建类属性和方法。我们是通过魔术方法来实现的。当调用当前环境下未定义或不可见的类属性或方法时,重载方法会被调用。所有的重载方法都必须声明为public。

注意:这些魔术方法的参数都不能通过引用传递。

PHP的重载与绝大多数面向对象语言不同。传统的重载是用于提供多个同名的类方法,但方法的参数类型和个数不同。

属性重载

public void  __set ( string $name , mixed  $value )
public mixed  __get ( string $name )
public bool __isset ( string $name )
public void  __unset ( string $name )

在给不可访问属性赋值时,__set()会被调用。

读取不可访问的属性的值时,__get()会被调用。

当对不可访问属性调用isset()或empty()时,__isset()会被调用。

当对不可访问属性调用unset()时,__unset()会被调用。

参数$name是指要操作的变量名称。__set()方法中的$value参数指定了$name变量的值。

属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。

举个例子:

 PHP魔术方法

 测试结果:

PHP魔术方法

相关推荐