php魔术方法

1、__call(string $Fname, array $arguments);

     在对象中调用一个不可访问的方法时会调用该方法。用静态方式调用一个不可访问的方法时会调用

__callstatic()。

例: function __call($name, $argus){   $err = "Call dont exited function :".$name."(";   for($i=0;$i<count($argus)-1;$i++){    $err.= gettype($argus[$i]).", ";   }   echo $err,gettype($argus[count($argus)-1]),")";  }

2、__construct()构造函数

        如果子类中定义了构造函数,则在实例化子类的实例时就不会隐式调用父类的构造函数。要在子类的

构造函数中执行父类的构造函数:parent::__construct(); 如果子类中没有定义构造函数,则会从父类继承。         为了实现向后兼容,如果php 5在类中找不到__construct()并且也没有从父类继承的话,他就会尝试

寻找旧式 的构造函数,也就是和类名同名的函数。

__destruct()  析构函数

        在php中,没有任何变量指向对象时,该对象占用的内存空间会被释放,对象被销毁。这就是php的垃

圾回收机制,防止内存溢出。

        当一个php线程结束时,当前占用的所有内存空间会被释放,所有对象会被销毁。

class Person {    public function __destruct(){     echo '析构函数现在执行了 <br />';     } } $p = new Person(); $p = null; // 析构函数在这里执行了 $p = "abc"; // 一样的效果 for($i = 0; $i < 5; $i++){     echo "$i <br />"; }

3、__clone()        当复制完成时,如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone() 方法会

被调用,可用于修改属性的值(如果有必要的话)。私有化__clone可以防止克隆该类的对象。   

class B{     static $a = 1;     public $b;

    public function __construct(){         $this->b = ++self::$a;     }     public function __clone(){         $this->b = ++self::$a;     } }

class A{     public $obj1;     public $obj2;

    public function __clone(){          //强制复制一份this->obj1 ,否则保存同一个对象         $this->obj1 = clone $this->obj1;     } } $ad = new A(); $af = $ad;   //clone方法会被调用   ??? $ag = clone $ad;   //强制复制对象

4、__invoke()     当以调用函数的方式调用一个对象时,改魔术方法会被执行。

    例:     class A{         public function __invoke($x){             print_r($x);         }     }     $test = new  A();     $test(9);   //此时__invoke()会被调用

5、__get(string $name)

    在读取不可访问的属性的值时改函数会被调用。$name 是属性名。

   __set(string $name,mixed $val)     设置不可访问的值时会调用该方法。通过该方法可以禁止对类属性的扩展:在没有该方法的情况下对类对

象的一个不存在的属性赋值相当于扩展该对象的属性。    function  __set(){}  //禁止扩展该类对象的属性

    模拟java的get() 、set() 方法:

class A{  private $asd = 'as';  public function __get($name){       if(isset($name))return $this->$name;       else return false;      }  public function __set($name,$val){       if(isset($name)) $this->$name = $val;  } }

6、__isset(string $name)     当对不可访问属性进行isset()或empty()时,改方法会被调用。

7、当对不可访问属性调用 unset()时,__unset()  会被调用。

8、__sleep( void )

    serivalize()函数会检查类中是否存在魔术方法__sleep(),如果存在,该方法会先被调用,然后才执行序

列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应该被序列化的变量名称的数组。如果该方

法未返回任何内容,则NULL被序列化,并产生E_NOTICE级别的错误。

    __sleep()常用作提交未提交的数据,或类似的数据清理工作。同时,如果有一些很大的对象,但不需要保

存全部信息,这个魔术方法就很有用。

    与之相反,unserivalize()会检查是否存在一个__wakeup()方法,如存在则先调用改方法,预先准备对象

需要的资源。

calss Connection{

    private $server,$user,$password,$db;     protected $link;

    public function __construct($server,$user,$password,$db){         $this->server = $server;         $this->password = $password;         $this->db = $db;         $this->user = $user;         $this->connect();     }

    public function connect(){         $this->link = mysql_connect($this->server,$this->user,$this->password);         mysql_select_db($this->db,$this->link);     }

    public function  __sleep(){         return array('server','user','password','db');   //要保存的属性     }

    public function __wakeup(){         $this->connect();      //要预备的资源,重新进行数据库链接,或一些其他的初始化操作。     } }

9、自动加载 __autoload

function __autoload($className){     require './'.$className; }

posted @ 2016-10-08 19:40  Burning_Leaf  阅读(5205)  评论(0编辑  收藏  举报