ホームページ  >  記事  >  バックエンド開発  >  PHP のマジック メソッド __get()、__set()、__call()、__callStatic() と静的な使用法の詳細な説明

PHP のマジック メソッド __get()、__set()、__call()、__callStatic() と静的な使用法の詳細な説明

伊谢尔伦
伊谢尔伦オリジナル
2017-07-03 11:43:443135ブラウズ

php5 の後、私は非常に興味深いいくつかの マジックメソッド を実装しました。私はこれまでプロセス指向のプログラミング手法を使用していましたが、最近 oop に関する研究をほとんど行っていません。

マジックメソッドのようなものは単に怠けているだけのような気がします。私が初めて PHP を書いたとき、ブログを書いていたときはまだ PHP4.3 という海外のオープンソース フレームワークを使用していました。ただし、すべてのオブジェクトはフレームワークに実装されており、すべてのデータはオブジェクトにカプセル化されます。

そのため、データベースから大量のものを選択した後、それらをループ内で 1 つずつオブジェクトにカプセル化する必要があり、各フィールドも getField() メソッドと getField() メソッドを実装する必要があります。書くのは本当に少し面倒です。と、繰り返しの作業のように感じます。

そして、これらの魔法のメソッド get()、set()、call()、callStatic() の誕生により、この問題は完全に解決されました。

get() と set() はクラスの属性用、call() はメソッド用、callStatic() は静的クラス メソッド用です。

1. Get() および set() マジック メソッド:

オブジェクトをインスタンス化した後、クラスに存在しない属性、またはアクセス権限を持たない属性を呼び出すと、PHP は get() メソッドを呼び出します。このようにして、多くのコードを節約し、構造を明確にするだけでなく、クラスのプライベート メンバーに外部からアクセスする方法も提供します。

例:

<?php
class testGet
{
  private $name = &#39;test&#39;;
}
$test = new testGet();
$test->name;

上記のコードを実行すると、エラーが報告されます: PHP 致命的エラー: /Library/WebServer/Documents/workspace/learn/call のプライベート プロパティ testGet::$name にアクセスできません/ a.phpの7行目

ですが、get()メソッドでアクセスできるように修正しましょう

<?php
class testGet
{
  private $name = &#39;test&#39;;

  function get($property) {
    if ( isset($this->$property) ) 
      return $this->$property;
    else
      return NULL;
  }
}
$test = new testGet();
echo $test->name . PHP_EOL;

これにコードを変更したら、再度アクセスしても問題ありません。

注: 属性が静的として定義されている場合、get() を介してアクセスしたときにもエラーが報告されます。その理由は、静的メンバーはクラス自体に属し、インスタンス化によって変更されないため、自分でテストできるためです。

set() メソッドを使用すると、クラス属性の動的作成を禁止することができ、後続の開発者やプログラム保守者にとって不要なトラブルを回避できます。

function set($property) {

//$propertyはプロパティの名前を受け取ります

}

正直、oopの設計には多くのデザイナー自身が関わることになります。ドキュメントがないので、後発者がコードを読むのは依然として非常に困難です。もちろん、それは後発者のレベルに大きく関係します。

以下は get と set を一緒に使用する例です:

<?php
class testGet
{
  private $name = &#39;test&#39;;

  function get($property) {
    if ( isset($this->$property) ) 
      return $this->$property;
    else
      return NULL;
  }
  
  public function set($property, $value) {
    if ( isset($this->$property) )
      $this->$property = $value;
    else
      return NULL;
  }
}
$test = new testGet();
$test->name = &#39;my test name&#39;;
echo $test->name . PHP_EOL;

function set($property, $value) {

//$property によって受け取られたプロパティの名前

// $value で受け取ったプロパティの名前 属性の値です

}

2. call() および callStatic() メソッド:

オブジェクトが存在しないクラスのメソッドを呼び出した場合またはアクセス権限がない場合は、call() メソッドが自動的に呼び出されます。

以前、同僚が私に、なぜ TP フレームワークには利用できない低レベルのメソッドがたくさんあるのに、上位層では呼び出すことができるのかと尋ねたのを覚えています。実際に機能するのは call() メソッドです。

この方法を知らないと、間違いなく混乱し、問題を特定するのが難しくなります。

<?php
abstract class Obj 
{
        private $objData        = array();
        /** 
         * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候
         * 调用魔术方法
         */
        public function call($name, $args) {
            $field = preg_match(&#39;/^get(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] )
                return $this->objData[strtolower($matches[1])];
            $field = preg_match(&#39;/^set(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] ) { 
                return $this->objData[strtolower($matches[1])] = $args[0];
            }   
        }   
}
class User extends Obj
{
        
}
$user = new User();
$user->setName(&#39;test&#39;);
echo $user->getName();

User クラスは何も行いませんが、継承されたクラスの call() メソッドを通じてすべて (getName と setName) を行います。 function call($ methodname、$ args){

// $ methodname // $args

array

}で渡されたパラメーターが呼び出されるメソッド名}
call () は、静的クラスの静的メソッドとして機能する callStatic() メソッドに対応します。

例:

<?php
    abstract class Obj 
    {
        private static $objData        = array();
        /** 
         * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候
         * 调用魔术方法
         */
        public static function callStatic($name, $args) {
            $field = preg_match(&#39;/^get(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] )
                return self::$objData[strtolower($matches[1])];
            $field = preg_match(&#39;/^set(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] ) { 
                return self::$objData[strtolower($matches[1])] = $args[0];
            }   
        }   
    }
    class User extends Obj 
    {
    
    }
    User::setName(&#39;test&#39;);
    echo User::getName() . PHP_EOL;
3. 遅延静的バインディング: 静的オブジェクト

以上がPHP のマジック メソッド __get()、__set()、__call()、__callStatic() と静的な使用法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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