phpマジックメソッド解析

7183 ワード

PHPはすべてを_(2つの下線)先頭のクラスメソッドをマジックメソッドとします.
クラスメソッドをカスタマイズする場合は、マジックメソッド以外に__を使用しないことをお勧めします.を選択します.phpマジックメソッドには、_construct(), __destruct(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __clone(),__コール()など.
  • __construct()はphpにおけるクラスの構造方法であり、クラスの属性を初期化するために使用される.同じクラスでは1つのコンストラクションメソッドしか宣言できないため、再ロードできません.ただし、デフォルトのパラメータは使用できます.構造方法は一般的にpublicタイプでありprivateタイプであれば単例モード,php単例設計モードを構成する.
    <?php
        class Person
        {
            private $name;
            private $age;
            private $email;
            //        
            public function __construct($name="yeetrack", $age=1, $email="[email protected]")
            {
                $this->name = $name;
                $this->age = $age;
                $this ->email = $email;
            }
            public function printInfo()
            {
                echo "name->" . $this->name . " age->" . $this->age . " email->" . $this->email . "<br/>";
            }
        }
                                                                                                                                                                                                              
        $per = new Person("youthflies",2);
        $per->printInfo();
    ?>
     
  • __destruct()はphpのクラスのプロファイルメソッドであり、オブジェクトは破棄前に自動的に呼び出され、プロファイルメソッドでファイルを閉じたり、接続を解放したりすることがよく行われます.phpはごみ回収メカニズムを備えており,オブジェクトがアクセスできない場合に自動的にごみ回収メカニズムを有効にし,オブジェクトが占有するスタック空間を解放する.phpの解析法は,ごみ回収を開始する前に呼び出される方法である.プロファイルメソッドメソッドは、必要に応じて宣言する必要があります.
  • カプセル化とデータ保護のため、クラスのデータ属性をprivateと宣言するのが一般的で、頻繁にデータ属性を読み取る必要がある場合は煩雑です.set()メソッドは、プログラムの実行時にprivateタイプのデータに値を割り当てることができるこの問題を解決します.上のコードを受け取ります:
    //      __set()
            public function __set($propertyName, $value)
            {
                if($propertyName == "name")
                    $this->name = $value; // name  
                elseif ($propertyName == "age")
                {   
                    if($value>200 | $value<0) //  age  
                        return;
                    $this->age = $value;
                }
                elseif ($propertyName == "email")
                    $this->email = $value;
            }
    ありました_setの宣言は、メンバー属性に
    $per = new Person("youthflies",2);
    $per->name = "youthflies";
    $per ->age = 12;
    $per->email = "[email protected]";
    $per->printInfo();
    の値を割り当てることができます(属性はprivateタイプですが)、phpはデフォルトで呼び出されます.set()メソッド.
  • プロパティがprivateタイプとして宣言され、オブジェクトの外で直接取得されるとphpはデフォルトで__を検索します.get()メソッド.このメソッドは、プログラム実行中にprivateタイプのデータを取得できます.上のコードを受け取ります:
    //      __get()
            public function __get($propertyName)
            {
                if($propertyName == "name")
                    return $this->name;
                elseif ($propertyName == "age") //     age  
                    return "secret";
                elseif ($propertyName == "email")
                    return $this->email;
            }
    上のコードのように、私たちは_get()メソッドには、いくつかの権限制御を加えたり、偽のデータを返したりします.
  • isset()メソッドは、変数が存在するか否かを判断するために使用される.クラスの属性がpublicの場合、isset()メソッドでオブジェクトの属性を直接判断できますが、privateタイプの場合、直接判断できません.isset()メソッド.クラス内でのみ宣言されました_isset()メソッドでは、クラスの外部でisset()を使用してクラス内のprivateデータを間接的に判断できます.上のコードを受け取ります:
    //      __isset()
            public function __isset($propertyName)
            {
                if($propertyName == "name")
                    return isset($this->name);
                elseif ($propertyName == "age")//     age  
                    return false;
                elseif ($propertyName == "email")
                    return isset($this->email);
            }
    上の声明を経て、私达はクラスの外でこのようにすることができます:
    var_dump(isset($per->name));
    var_dump(isset($per->age));
    var_dump(isset($per->email));
  • unset()メソッドは変数を削除するために使用されます.クラスのプロパティがpublicの場合、unset()で直接削除できます.privateの場合、_unset()メソッドです.__に似ています.isset()メソッド.
    //      __unset()  
            public function __unset($propertyName)
            {
                if($propertyName == "name")//     name  
                    return;
                elseif($propertyName == "age")
                    unset($this->age);
                elseif ($propertyName == "email")
                    unset($this->email);
            }
    これにより、クラスの外側でprivateタイプのプロパティを直接unset()クラスに含めることができます.
  • __toString()は、オブジェクトの文字列出力を取得するために使用され、オブジェクト参照を直接印刷すると自動的に呼び出されます.
    //      __toString()
            public function __toString()
            {
                return "name: " . $this->name . "<br/>age: " . $this->age . "<br/>email: " . $this->email . "<br/>";
            }
    では、外で直接echo$perを使用できます.phpはクラスの__をデフォルトで呼び出します.toString()メソッド.
  • 私たちが呼び出したメソッドがクラスに存在しない場合、errorが現れ、プログラムがshutdownします.call()メソッドは、クラスに存在しないメソッドが呼び出された場合に、この状況を解決するために使用されます.call()メソッドが呼び出されます.このメソッドには、存在しないメソッドの名前と、存在しないメソッドのパラメータ(配列で保存)の2つのパラメータがあります.
    //      __call()
            public function __call($methodName, $args)
            {
                echo "  :" . $methodName . "   <br/>";
                print_r($args);
            }
     
  • __Autoload()メソッドは、必要なクラスファイルを自動的にロードするために使用されます.各クラスにphpファイルを個別に作成し、このクラスが必要な場合はincludeでphpファイルを含めます.クラスファイルが非常に多い場合は、面倒です.Autoload()は自動的にロードできます.もちろん、クラスファイルに一定のルールで名前を付けることが前提です.
    //      __autoload()
            public function __autoload($className)
            {
                include(strtolower($className) . ".class.php";
            }
                                                                          
            $hello = new Hello();
    上記のコードのように、Helloオブジェクトを新規作成します.Helloクラスが存在しない場合、autoload()メソッドがデフォルトで呼び出されます.$classNameはパラメータ「Hello」を取得し、現在のフォルダの下にあるHelloをincludeします.class.phpファイルは、このようにphpファイルに名前を付けるとincludeに成功します.         
  • php 5は、参照によってオブジェクトを呼び出し、独立したコピーを確立する必要がある場合、cloneメソッドによってcloneが得られるとき、2つの完全に同じで互いに独立したオブジェクトを呼び出すことができる.cloneプロセスでカスタム初期化操作を行う場合は、クラスに__を宣言できます.clone()メソッド、clone()メソッドを呼び出すとphpはデフォルトで__を呼び出すclone()メソッド.
    //      __clone()
            public function __clone()
            {
                $this->name = "youthflies__clone";
                $this->age = "12__clone";
                $this->email = "[email protected]__clone";
            }
    宣言後、次の2行のコードを使用して効果を表示します. 
    $per2 = clone $per;
        $per2->printInfo();
     
  • __sleep()メソッドは、オブジェクトをシリアル化するとき(すなわちserialize()関数を呼び出すとき)に呼び出され、シリアル化についてはphpオブジェクトを参照してシリアル化されます.sleep()メソッドにはパラメータがなく、戻り値はシリアル化するプロパティを指定する配列です.
    //      __sleep()
            public function __sleep()
            {
                return array("name","email");
            }
    は、$perをシリアル化すると、nameとemailの2つの属性のみをシリアル化します.
  • __wakeup()メソッドは、オブジェクトを逆シリアル化するときに、生成するオブジェクトにいくつかのデータを初期化するために使用されます.
    //      __wakeup()
            public function __wakeup()
            {
                $this->age = 12;
            }
    は私たちが宣言したためです.sleep()の場合、age属性はシリアル化されていないので、_wakeup()メソッドでは、age属性に手動で値を付与することで、反転行化するとageが12に値を付与.