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;