FCLAMP 2020-05-19
PHP将所有以__(两个下划线)开头的类的方法保留为魔术方法。所以在定义类方法时,建议不要以__为前缀。
void __construct ([ mixed $args [, $... ]] )
PHP5允许开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时调用此方法,所以非常适合做一些初始化工作。
注意:如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用parent::__construct()。如果子类没有定义构造函数,则会如同一个普通的类方法一样从父类继承(假设没有被定义为private的话)。
举个例子:
测试结果:
void __destruct ( void)
PHP5引入了析构函数的概念。这类似于其它面向对象语言,如C++。析构函数会在到某个对象的引用被删除或者当对象被显式销毁时执行。
举个例子:
测试结果:
和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数中显示调用parent::__destruct()。此外也和构造函数一样,子类如果没用定义析构函数则会继承父类的。析构函数即使在使用exit()终止脚本时也会被调用。在析构函数中调用exit()将会终止其余关闭操作的运行。
试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。
public mixed __call ( string $name , array $arguments ) public static mixed __callStatic ( string $name , array $arguments )
在对象中调用一个不可访问的方法时,__call()会被调用。
用静态方式调用一个不可访问的方法时,__callStatic()会被调用。
$name是要调用的方法的名称,$arguments参数是一个枚举数组,包含着要传递给方法$name的参数。
举个例子:
测试结果:
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变量的值。
属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。
举个例子:
测试结果:
是一道经常出现在前端面试时的问题。如果只是简单的了解new关键字是实例化构造函数获取对象,是万万不能够的。更深入的层级发生了什么呢?同时面试官想从这道题里面考察什么呢?下面胡哥为各位小伙伴一一来解密。