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;