php类的魔术方法也就是带下划线的类方法介绍及应用

 

 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’);
 }

你可能感兴趣的:(PHP,魔术方法,魔术应用)