ホームページ  >  記事  >  バックエンド開発  >  マジックメソッドの例をphpで詳しく解説

マジックメソッドの例をphpで詳しく解説

怪我咯
怪我咯オリジナル
2017-05-03 18:07:001744ブラウズ

魔法の方法とは何ですか?

PHP オブジェクト指向では、一連のマジック メソッドがプログラミングに非常に便利です。PHP では、2 つのアンダースコア __ で始まるメソッドをこれらのマジック メソッドと呼びます。明示的に呼び出しますが、特定の条件によってトリガーされます。この章では、PHP で提供されるマジック メソッドについて簡単に説明します。

PHP のマジックメソッドは次のとおりです:

Function Description
__construct() クラスのコンストラクター
__de struct() クラス関数の破棄
__call() は、オブジェクト内のアクセスできないメソッドを呼び出すときに呼び出されます
__callStatic() は、静的モードでアクセスできないメソッドを呼び出すときに呼び出されます
__get() が取得されるときに呼び出されますクラスのメンバー変数を設定する
__set() クラスのメンバー変数を設定するときに呼び出されます
__isset() アクセスできないプロパティでisset()またはempty()が呼び出されるときに呼び出されます
__unset() アクセスできないプロパティに対して unset() が呼び出されたときに呼び出されます。
__sleep() serialize()実行時、この関数が最初に呼び出されます
__wakeup() unserialize()実行時、この関数が最初に呼び出されます
__toString() クラス 文字列として扱った場合の応答メソッド
__invoke() 関数呼び出しでオブジェクトを呼び出した場合の応答メソッド
__set_state() var_export()を呼び出してエクスポートする場合クラスの場合、この静的メソッドは転送されます。
__clone() オブジェクトのコピーが完了すると呼び出されます

マジックメソッドの例をphpで詳しく解説上の表の「__」は、1つの「_」ではなく、2つのアンダースコアです

これらのマジックメソッドの適用例をそれぞれ見てみましょう

__construct() と __destruct()

関数とデストラクターはよく知られているはずです。これらはオブジェクトの作成時と破棄時に呼び出されます。たとえば、ファイルを開き、オブジェクトが作成されたときにファイルを開き、オブジェクトが消滅したときにファイルを閉じる必要があります。

<?php
class FileRead
{
    protected $handle = NULL;

    function __construct(){
        $this->handle = fopen(...);
    }

    function __destruct(){
        fclose($this->handle);
    }
}
?>

これら 2 つのメソッドは、継承時に拡張できます。例:

<?php
class TmpFileRead extends FileRead
{
    function __construct(){
        parent::__construct();
    }

    function __destruct(){
        parent::__destruct();
    }
}
?>

__call() と __callStatic(オブジェクト内の)

これら 2 つのメソッドは、アクセスできないメソッドが呼び出されたときに呼び出されます。後者は静的メソッドです。これら 2 つのメソッドは、変数メソッド (変数関数) 呼び出しで使用できます。

<?php
class MethodTest
{
    public function __call ($name, $arguments) {
        echo "Calling object method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
    }

    public static function __callStatic ($name, $arguments) {
        echo "Calling static method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
    }
}

$obj = new MethodTest;
$obj->runTest(&#39;in object context&#39;);
MethodTest::runTest(&#39;in static context&#39;);
?>

__get()、__set()、__isset()、__unset()

これら 2 つの関数は、クラスのメンバー変数を取得/設定するときに呼び出されます。たとえば、オブジェクト自体のメンバー変数ではなく、オブジェクト変数を別の配列に保存します

<?php
class MethodTest
{
    private $data = array();

    public function __set($name, $value){
        $this->data[$name] = $value;
    }

    public function __get($name){
        if(array_key_exists($name, $this->data))
            return $this->data[$name];
        return NULL;
    }

    public function __isset($name){
        return isset($this->data[$name]);
    }

    public function __unset($name){
        unset($this->data[$name]);
    }
}
?>

__sleep()と__wakeup()

serialize()とunserialize()を実行すると、それらが最初に呼び出されますこの2つの機能です。たとえば、オブジェクトをシリアル化する場合、そのオブジェクトにはデータベース リンクが含まれており、逆シリアル化中にリンク状態を復元したい場合は、これら 2 つの関数を再構築することでリンクを復元できます。

例は以下のとおりです:

<?php
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(&#39;server&#39;, &#39;username&#39;, &#39;password&#39;, &#39;db&#39;);
    }

    public function __wakeup()
    {
        $this->connect();
    }
}
?>

__toString()

オブジェクトを文字列として扱う場合の応答メソッド。たとえば、オブジェクトを出力するには echo $obj; を使用します

<?php
// Declare a simple class
class TestClass
{
    public function __toString() {
        return &#39;this is a object&#39;;
    }
}

$class = new TestClass();
echo $class;
?>

このメソッドは文字列のみを返すことができ、このメソッドで例外をスローすることはできません。そうでない場合は、致命的なエラーが発生します。

__invoke()

関数呼び出しでオブジェクトを呼び出す際のレスポンスメソッド。以下の通り

<?php
class CallableClass
{
    function __invoke() {
        echo &#39;this is a object&#39;;
    }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
?>

__set_state()

var_export()を呼び出してクラスをエクスポートする際に、この静的メソッドが呼び出されます。

<?php
class A
{
    public $var1;
    public $var2;

    public static function __set_state ($an_array) {
        $obj = new A;
        $obj->var1 = $an_array[&#39;var1&#39;];
        $obj->var2 = $an_array[&#39;var2&#39;];
        return $obj;
    }
}

$a = new A;
$a->var1 = 5;
$a->var2 = &#39;foo&#39;;
var_dump(var_export($a));
?>

__clone()

オブジェクトのコピーが完了すると呼び出されます。例えば、記事「デザインパターンとPHP実装の詳細解説:シングルトンモード」で紹介したシングルトンモードの実装方法では、オブジェクトの複製を防ぐためにこの機能が使用されています。

<?php
public class Singleton {
    private static $_instance = NULL;

    // 私有构造方法 
    private function __construct() {}

    public static function getInstance() {
        if (is_null(self::$_instance)) {
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }

    // 防止克隆实例
    public function __clone(){
        die(&#39;Clone is not allowed.&#39; . E_USER_ERROR);
    }
}
?>

おすすめ関連記事:

phpでのマジック定数の例を詳しく解説

以上がマジックメソッドの例をphpで詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。