PHP魔术方法须知

参考PHP手册:魔术方法

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

具有构造函数的类会在每次创建新对象时先调用此方法,用在使用对象之前做一些初始化工作。

Note:
1.如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。
2.如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。
3.可以为构造函数定义任意多个参数,只要在实例化时传入对应个数的参数即可。构造函数中出现的任何异常都会阻止对象的创建。
4.将构造函数声明为私有方法,可以防止在类外部创建对象,这在单利模式中经常使用。

2.__destruct ( void )

析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

Note:
1.和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。
2.析构函数即使在使用exit()终止脚本运行时也会被调用。在析构函数中调用exit()将会中止其余关闭操作的运行。
3.析构函数在脚本关闭时调用,此时所有的 HTTP 头信息已经发出。脚本关闭时的工作目录有可能和在 SAPI(如 apache)中时不同。
4.试图在析构 函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。

PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。我们是通过魔术方法(magic methods)来实现的。

3.__call、__callStatic(方法重载)

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

在对象中调用一个不可访问方法时,__call() 会被调用。
在静态上下文中调用一个不可访问方法时,__callStatic()会被调用。

说明:
1.$name 参数是要调用的方法名称。
2.$arguments 参数是一个枚举数组,包含着要传递给方法 $name 的参数。
3.PHP 5.3.0版本新增 __callStatic()魔术方法。可见性未设置为 public 或未声明为 static 的时候会产生一个警告。

4.__set、__get、__isset、__unset

public void __set ( string $name , mixed $value )
在给不可访问属性赋值时,__set() 会被调用。

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

public bool __isset ( string $name )
当对不可访问属性调用 isset()empty()时,__isset()会被调用。

public void __unset ( string $name )
当对不可访问属性调用 unset()时,__unset() 会被调用。

说明:
1.参数$name是指要操作的变量名称。__set()方法的$value参数指定了 $name 变量的值。
2.属性重载只能在对象中进行。在静态方法中,这些魔术方法将不会被调用。所以这些方法都不能被 声明为 static。从 PHP 5.3.0 起, 将这些魔术方法定义为 static 会产生一个警告。
3.PHP 5.3.0 新增 __isset()__unset() 两个魔术方法。

Note:
1.因为 PHP 处理赋值运算的方式,__set() 的返回值将被忽略。类似的, 在下面这样的链式赋值中,__get() 不会被调用:$a = $obj->b = 8;

class TestClass
{
    private $foo;

    public function __set($name, $value){
        echo "__set().".$name.".".$value;
    }
    public function __get($get){
        echo "__get({$get})";
    }
}

$class = new TestClass();
$a = $class->foo;
$a = $class->foo = 8;

//输出:
//__get(foo)
//__set().foo.8

Note:
2.在除 isset() 外的其它语言结构中无法使用重载的属性,这意味着当对一个重载的属性使用 empty() 时,重载魔术方法将不会被调用。为避开此限制,必须将重载属性赋值到本地变量再使用 empty()(很遗憾,这个不知道啥意思,如果有人看到,并且知道,深切的恳请告知,Q1563659827,先谢过!(*^__^*) )

5.__sleep()、__wakeup()

public array __sleep ( void )
方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。

void __wakeup ( void )
经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

6.__toString()

public string __toString ( void )
用于一个类被当成字符串时应怎样回应。例如 echo $obj; 应该显示些什么。此方法必须返回一个字符串,否则将发出一条E_RECOVERABLE_ERROR 级别的致命错误。

7.__invoke()

mixed __invoke ([ $... ] )
当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用。

Note:
本特性只在 PHP 5.3.0 及以上版本有效。

8.__set_state()

static object __set_state ( array $properties )
自 PHP 5.1.0 起当调用 var_export() 导出类时,此方法会被调用。
本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性。

9.__debugInfo

array __debugInfo ( void )
该方法在var_dump()类对象的时候被调用,如果没有定义该方法,则var_dump会打印出所有的类属性

10.__clone()

对象复制可以通过 clone 关键字来完成(如果可能,这将调用对象的 __clone() 方法)。对象中的 __clone() 方法不能被直接调用。

$copy_of_object = clone $object;

当对象被复制后,PHP 5 会对对象的所有属性执行一个浅复制(shallow copy)。所有的引用属性 仍然会是一个指向原来的变量的引用。

void __clone ( void )

当复制完成时,如果定义了 __clone() 方法,则新创建的对象(复制生成的对象)中的 __clone()方法会被调用,可用于修改属性的值(如果有必要的话)。

你可能感兴趣的:(PHP魔术方法须知)