PHP把全部以__(两个下划线)开头的类方法当成魔术方法,而且这些魔术方法的参数都不能经过引用传递。php的魔术方法有:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state() 和 __clone()等。
下面简单说一下对应的功能:
Class MyClass {
__construct($var1,$var2) {
//构造器
}
__destruct() {
//析构方法
}
__clone() {
//克隆方法 $obj2 = clone $obj1; 时执行
对象的复制
class a{
public $s = '';
}
$a_1 = new a();
$a_1->s = 'a1';
$a_2 = clone $a_1;
$a_2->s = 'a2';
echo $a_1->s; //'a1'
echo $a_2->s; //'a2'
浅度复制
class a{
public $s = '';
}
class b{
public $a = null;
public $str = null;
}
$str = '123';
$b_1 = new b();
$b_1->a = new a();
$b_1->str = & $str;
$b_1->a->s = 'b1';
$b_2 = clone $b_1;
$b_2->a->s = 'aaaaa';
$b_2->str = 'nihao';
echo $b_1->a->s;
echo "\n";
echo $b_1->str;
echo "\n";
echo $b_2->a->s;
echo "\n";
echo $b_2->str;
深度复制
class a{
public $s = '';
}
class b{
public $a = null;
public $str = null;
public function __clone(){
$b = $this->str;
$this->str = & $b;
$this->a = clone($this->a);
}
}
$str = '123';
$b_1 = new b();
$b_1->a = new a();
$b_1->str = & $str;
$b_1->a->s = 'b1';
$b_2 = clone $b_1;
$b_2->a->s = 'aaaaa';
$b_2->str = 'nihao';
echo $b_1->a->s;
echo "\n";
echo $b_1->str;
echo "\n";
echo $b_2->a->s;
echo "\n";
echo $b_2->str;
}
__call($fun,$args) {
//魔术调用 方法名和参数
if(method_exists($this, $fun.count($args))){
return call_user_func_array(array(&$this,$fun.count($args)),$args);
}else{
throw new Exception('调用了未知的方法:'.__METHOD__);
}
}
__callStatic($fun,$args) {
//魔术调用 静态方法名和参数
//可见性未设置为public或未声明为static的时候会产生一个警告 。
//本特性只在PHP 5.3.0 及以上版本有效。
与__call区别:修饰stati
}
__invoke($args) {
//把类做为函数使用 参数
//当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用
//本特性只在PHP 5.3.0 及以上版本有效。 class Callme { public function __invoke($phone_num) { echo "Hello: $num"; } } $call = new Callme(); $call(13810688888); // "Hello: 13810688888 } __toSring() { //对象输出 $echo $obj = new Class(); 时输出 }
__set($var,$value) {
//设置对象属性 $obj->var = value 赋值
//在给未定义的变量赋值时,__set() 会被调用。
}
__get($var) {
//读取对象属性 $obj->var 获取
//读取未定义的变量的值时,__get() 会被调用。
}
__isset($var) {
//判断对象内部属性是否存在 isset($obj->var )。
//当对未定义的变量调用isset() 或 empty()时,__isset() 会被调用。
//自PHP 5.1.0起有效
}
__unset($var) {
//释放内部对象属性 unset($obj->var)。
//当对未定义的变量调用unset()时,__unset() 会被调用。
//自PHP 5.1.0起有效
}
__set_state(array $args) {
//当调用var_export()时,这个静态 方法会被调用。
//本方法的惟一参数是一个数组,其中包含按array(‘property’ => value, …)格式排列的类属性。
//自PHP 5.1.0起有效
}
__sleep() {
//序列化前奏方法 return array($var1,$var2);
}
__wakeup() {
//反序列化前奏方法 $this->var = ‘other_value’
}
}
补充:一个类外面使用的自动加载方法:
__autoload($classname) {
require(PATH.$classname.’_class.php’);
}