ホームページ >バックエンド開発 >PHPの問題 >PHPのマジックメソッドとマジック定数とは何ですか

PHPのマジックメソッドとマジック定数とは何ですか

青灯夜游
青灯夜游オリジナル
2021-06-21 18:14:572707ブラウズ

PHP では、マジック メソッドは、「__call()」、「__get()」、「__set()」など、2 つのアンダースコア「__」で始まるメソッドを指します。マジック定数は、メソッドを指します。これは、「__LINE__」、「__FILE__」など、コードの場所の変更に応じて変化する 8 つの定数になります。

PHPのマジックメソッドとマジック定数とは何ですか

#このチュートリアルの動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター

Magic Method (マジック メソッド)

PHP では、2 つのアンダースコア

__ で始まるメソッドをマジック メソッドと呼び、PHP において重要な役割を果たします。マジック メソッドには次のものが含まれます:

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

__destruct( ) コンストラクターとデストラクターはよく知られているはずです。これらはオブジェクトの作成時と破棄時に呼び出されます。たとえば、ファイルを開き、オブジェクトが作成されたときにファイルを開き、オブジェクトが死んだときにファイルを閉じる必要があります。
<?php 
class FileRead
{
    protected $handle = NULL;

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

    function __destruct(){
        fclose($this->handle);
    }
}
?>
これら 2 つのメソッドは、継承時に展開できます。たとえば、次のようになります。

#__call ()

および

__callStatic()

これら 2 つのメソッドは、オブジェクト内でアクセスできないメソッドが呼び出されたときに呼び出され、後者はは静的メソッドです。これら 2 つのメソッドは、変数メソッド (変数関数) 呼び出しで使用できます。
<?php 
class TmpFileRead extends FileRead
{
    function __construct(){
        parent::__construct();
    }

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

__set()

__isset()、および __unset()#これら 2 つの関数は、クラスのメンバー変数を取得または設定するときに呼び出されます。たとえば、オブジェクト自体のメンバー変数の代わりに、オブジェクト変数を別の配列に保存します#<pre class="brush:php;toolbar:false;">&lt;?php class MethodTest { public function __call ($name, $arguments) { echo &quot;Calling object method &amp;#39;$name&amp;#39; &quot;. implode(&amp;#39;, &amp;#39;, $arguments). &quot;\n&quot;; } public static function __callStatic ($name, $arguments) { echo &quot;Calling static method &amp;#39;$name&amp;#39; &quot;. implode(&amp;#39;, &amp;#39;, $arguments). &quot;\n&quot;; } } $obj = new MethodTest; $obj-&gt;runTest(&amp;#39;in object context&amp;#39;); MethodTest::runTest(&amp;#39;in static context&amp;#39;); ?&gt;</pre>#__sleep()and#__wakeup()

serialize()unserialize() を実行すると、これら 2 つの関数が最初に呼び出されます。たとえば、オブジェクトをシリアル化する場合、そのオブジェクトにはデータベース リンクが存在しますが、逆シリアル化中にリンク状態を復元したい場合は、これら 2 つの関数を再構築することでリンクを復元できます。例は次のとおりです。 <pre class="brush:php;toolbar:false;">&lt;?php class MethodTest { private $data = array(); public function __set($name, $value){ $this-&gt;data[$name] = $value; } public function __get($name){ if(array_key_exists($name, $this-&gt;data)) return $this-&gt;data[$name]; return NULL; } public function __isset($name){ return isset($this-&gt;data[$name]) } public function unset($name){ unset($this-&gt;data[$name]); } } ?&gt;</pre>

__toString()

オブジェクトを文字列として扱う場合の応答メソッド。たとえば、オブジェクト

<?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();
    }
}
?>

を出力するには、

echo $obj; を使用します。このメソッドは文字列のみを返すことができ、このメソッドで例外をスローすることはできません。スローしないと、致命的なエラーが発生します。

__invoke()

関数を呼び出してオブジェクトを呼び出すときの応答メソッド。次のように

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

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

__set_state()

Call

var_export()

この静的メソッドは、クラスをエクスポートするときに呼び出されます。 。

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

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

<?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));
?>
マジック定数

PHP の定数のほとんどは変更されませんが、位置に応じて変更される 8 つの定数があります。これらの 8 つの定数は、コードの場所 これら 8 つの定数はマジック定数と呼ばれます。

__LINE__

、ファイル内の現在の行番号

__FILE__

、ファイル

の完全なパスとファイル名
  • __DIR__、ファイルが置かれているディレクトリ
  • __FUNCTION__、関数名
  • __CLASS__、クラス名
  • __TRAIT__、トレイト名
  • __METHOD__、クラスメソッド名
  • __NAMESPACE__ 、現在の名前空間の名前
  • これらのマジック定数は、現在の環境情報を取得したり、ログを記録したりするためによく使用されます。 推奨学習: 「
  • PHP ビデオ チュートリアル

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

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