PHP把以__(两个下划线)开头的类方法当做魔术方法。所以,当定义类方法的时候,除了魔术方法,其他方法不建议以__为前缀。
1.__construct
__construct为php类的构造函数,当创建对象时,要先自动调用此方法,非常适合做一些初始化操作。
2.__destruct
__destruct为析构函数,当对象内部的操作执行完毕后,会自动调用此函数,释放内存。此外还有个规则就是后进先出,即后创建的对象先被释放。
3.__toString
此函数的原型public string __toString(void),当对象像字符串一样被处理时,将自动调用此函数,如echo $obj,$obj为对象。
4.__call
函数原型public mixed __call(string $name, array $arguments),当对象调用不存在的函数时,将调用此函数,不存在的函数名将作为第一个参数传给__call,传给不存在函数的参数将以数组的形式作为第二个参数传给__call.
5.__callStatic
函数原型public static mixed __callStatic(string $name, array $arguments),此函数和__call类似,只是在调用不存在的静态方法时,会自动调用此函数。
6.__clone
函数原型void __clone(void),当对象复制通过clone关键字来完成时,类中的__clone方法将自动被调用,在此方法中可以对新生成的对象的属性等进行重新设置,以此方法完成的复制,在内存中会有两个对象,彼此不互相影响。
7.__autoload
这个方法主要是自动载入类文件,例如
function __autoload($class_test){
include($class_test.".php");//根据自己实际情况定
}
这个方法不是定义在类内部的。
8.__set和__get
函数原型public void __set(string $name, mixed $value),比如说,我们在类中定义了一个私有的属性,我们在类外部是不能访问他的值和设置他的值的,如果想用对象访问他,就可以利用__set方法和下面讨论的__get方法。当对象操作不可访问的属性时,将自动调用__set方法和__get方法。
__get原型public mixed __get(string $name)
下面是测试的例子
<?php function __autoload($class_name){ include($class_name . ".php"); } class MyPc{ public $name = "thinkphp"; public $age; protected $city = "changchun"; private $tmp; function __construct(){//构造函数 $this->age = 24; }
function __destruct(){//析构函数 } function __toString(){ return "__toString is tested!!"; } function __call($name, $arguments){//对象调用不存在的函数时调用 echo "the " . $name . implode(",", $arguments) . "\n"; }
static function __callStatic($name, $arguments){//调用不存在的静态方法时调用 echo "the " . $name . implode(",", $arguments) . "\n"; } function __clone(){//克隆 $this->name = "ci"; } function __set($var, $value){ $this->$var = $value; } function __get($arg){ echo $this->$arg; } } $pc = new MyPc(); echo $pc->age . "\n";//__construct test echo $pc . "\n" ;//__toString test $pc->test("call test");//__call test MyPc::good("lala");//__callStatic test $pc1 = clone $pc;//__clone test echo $pc1->name . "\n"; $pc->tmp = "private field"; echo $pc->tmp . "\n"; echo $pc->city; //测试__autoload方法,要重新写个php类文件 $test = new Good(); echo $test->name;