phpオブジェクトクラスでよく使われるマジックメソッド

8346 ワード

1、__construct():クラスがnew$classをインスタンス化したときに自動的に呼び出されるメソッドを構築し、クラスの継承でメソッドを継承および上書きできます.例:
//__construct()
class construct{
    public function __construct(){
        $this->var = "this is var";    
    }
}
class con2 extends construct{
    public function __construct(){
        $this->var = "this is var2";    
    }
}
$con2 = new con2;
echo $con2->var;

3、__destruct():オブジェクトが破棄されたり、使用されなくなったりした場合(ページの実行が完了した場合)、このメソッドを自動的に呼び出します.例:
class construct{
    public function __construct(){
        $this->var = "this is var";    
    }
    public function __destruct(){
        echo 'close';    
    }
}
$con = new construct;
// 
class destruct{
    public function __construct(){
        $this->logfile_handle = fopen('/tmp/log.txt',w);    
    }
    public function __destruct(){
        fclose($this->logfile_handle);    
    }
}

4、__toString():クラスが文字列として扱われたときにどのように応答すべきか、すなわちecho$classで返された内容が何であるか、がない場合に使用されます.toString()マジックメソッドの場合、E_RECOVERABLE_ERRORレベルの致命的なエラーが返されます.
例:
<?php
class TestClass{
    public $foo;
    public function __construct($foo){
        $this->foo = $foo;    
    }
    public function __toString(){
        return $this->foo;
    }
    
}
$class = new TestClass('Hello');
echo $class;//Hello
?>

5、__invoke():このマジックメソッドはクラスが関数として使用される場合に自動的に呼び出されますが..._invoke()マジックメソッドはPHP 5のみです.3.0以上が有効です.例
//__invoke() PHP5.3.0 
class CallableClass{
    function __invoke($x){
        var_dump($x);    
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));//true

6、__get()と_set():アクセスしにくい属性からデータを読み出すのは自動呼び出し_get()マジックメソッドは、アクセスしにくい熟知した付与時から自動的に呼び出されます_set()マジックメソッドは、(プライベートプロパティ、未定義プロパティ、初期化されていないプロパティ)例を含むアクセスが困難です.
//__get()  __set()
class demoClass{
    private $a;
    private function __get($name){
        return 'this var not exist';
    }
    private function __set($name,$value){
        echo 'this var value not exist';    
    }
}
$demo = new demoClass();
var_dump($demo->a);// __get() 
$demo->a = 1;// __set() 

7、__call():このメソッドが範囲クラスに存在しないメソッドの場合に自動的に呼び出されるメソッドで、パラメータは2つあります.例:
//__call()
class funClass{
    public function __call($name,$arg){
        echo $name.'function not exist';    
    }
}
$fun = new funClass();
$fun->aa();//function not exist

8、__sleep()と_wakeup:この2つのマジックメソッドは、オブジェクトでserialize()とunserialize()をシーケンス化して自動的に呼び出すメソッドです.例
//__sleep __wakeup  
class sleepClass{
    public $myContent;
    public function __construct($string){
        $this->myContent = $string;    
    }
    public function __sleep(){
        $this->myContent = "this is mimi";
        return array('myContent');
    }
    public function __wakeup(){
        echo 'aaa';    
    }
}
$sleep = new sleepClass('i love bb');
$ser = serialize($sleep);//this is mimi
unserialize($ser);//aaa
//   
class Connection {
    protected $link;
    private $server, $username, $password, $db;
    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }
    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }
    public function __sleep()
    {
        return array('server', 'username', 'password', 'db');
    }
    public function __wakeup()
    {
        $this->connect();
    }
}
$con = new Connection('127.0.0.1','root','','mythinkcom');
echo serialize($con);

9、__clone():$obj 2=clone$obj 1と$obj 2=$obj 1の違いは、前者に2つのメモリアドレスがあり、後者には1つのメモリアドレスしかないことです.
class cloneClass{
    public $var = 'aa';    
}
$clone = new cloneClass;
$clone2 = clone $clone;
echo $clone->var;
echo $clone2->var;