ホームページ > バックエンド開発 > PHPチュートリアル > PHP の魔法のメソッドを 5 分で理解できます (詳細な例)

PHP の魔法のメソッドを 5 分で理解できます (詳細な例)

WBOY
リリース: 2023-04-10 18:26:01
オリジナル
4100 人が閲覧しました

前回の記事では、「PHP での clone キーワードと __clone() メソッドの使用法 (詳細な例)」をご紹介し、PHP キーワードと __clone() での clone について詳しく説明しました。メソッドについては、この記事で引き続き PHP の魔法のメソッドをお届けします。お役に立てば幸いです。

PHP の魔法のメソッドを 5 分で理解できます (詳細な例)

前回の記事で、__clone() メソッドを紹介したときに、これは一種の魔法のメソッドであると述べました。 「コンストラクタとデストラクタ」でも挙げたコンストラクタとデストラクタは、コンストラクタ、デストラクタとも呼ばれ、マジックメソッドの一種でもあります。では、魔法のメソッドとは何でしょうか?一般的に使用される方法は何ですか?どのように使用されますか?次に見てみましょう。

PHP マジック メソッド


PHP オブジェクト指向プログラミングでは、PHP に一連のマジック メソッドがあります。これらのマジック メソッドについては、次のメソッドを参照してください。前に学習した

__clone\__construct\__destruct 共通点が 1 つ見つかります。それは、すべて 2 つのアンダースコア __ で始まるということです。そしてそれらはすべて、特定の条件下で自動的に呼び出されます。

それでは、よく使われるいくつかのマジックメソッドとその使用方法を例を挙げて見てみましょう。


#__set()<strong><span style="font-size: 18px;"></span></strong>メソッド ##__set()

メソッドは、現在の環境で未定義または非表示のクラス属性に値を割り当てるために使用されます。すべてのマジック メソッドは特定の条件下で自動的に呼び出され、現在の環境に使用されることに注意してください。環境内での未定義または非表示のクラス属性の割り当ては、

__set() メソッドを呼び出すための特定の条件です。 構文形式は次のとおりです。

public function __set(要操作的变量, 要操作变量的值){
    ... ... ;
}
ログイン後にコピー

例は次のとおりです。

<?php
    class father{
        public $study1;
        private $study2;
        public function __set($key, $value){
            echo &#39;为“&#39;.$key.&#39;”赋值“&#39;.$value.&#39;”失败!<br>&#39;;
        }
    }
    $object          = new father();
    $object -> study1  = &#39;好好学习&#39;;
    $object -> study2   = &#39;天天向上&#39;;
    $object -> study3 = &#39;福如东海&#39;;
?>
ログイン後にコピー

出力結果:

## 上記の内容 この例は、現在の環境で未定義または非表示のクラス属性に値が割り当てられると、__set() メソッドが呼び出されることを示しています。

PHP の魔法のメソッドを 5 分で理解できます (詳細な例)

#get()

<strong><span style="max-width:90%"></span>メソッド</strong>自動 __get()
メソッドを呼び出すための特定の条件は、現在の環境で未定義または非表示のクラス属性を呼び出すか取得するときです。このメソッドを定義するための構文形式は次のとおりです:

public function __get($name){
    ... ... ;
}
ログイン後にコピー

パラメータ $ name は、操作対象の変数の名前を表します。__get() メソッドの使い方を例で見てみましょう。例は次のとおりです。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php class father{ public $study = &amp;#39;好好学习&amp;#39;; private $study1 = &amp;#39;天天向上&amp;#39;; public function __get($study1){ echo &amp;#39;获取:“&amp;#39;.$study1.&amp;#39;”失败!&amp;#39;; } } $object = new father(); echo $object -&gt; study.&amp;#39;&lt;br&gt;&amp;#39;; echo $object -&gt; study1.&amp;#39;&lt;br&gt;&amp;#39;; echo $object -&gt; study2.&amp;#39;&lt;br&gt;&amp;#39;; ?&gt;</pre><div class="contentsignin">ログイン後にコピー</div></div>出力結果:


#上記の結果から、現在の環境で未定義または非表示のクラス属性を呼び出したり取得したりするときに、__get() メソッドが自動的に呼び出されることがわかります。

PHP の魔法のメソッドを 5 分で理解できます (詳細な例)

__isset()

<strong><span style="max-width:90%"> メソッド </span></strong>__isset を自動的に呼び出す() メソッドの特定の条件は、アクセスできない属性またはクラス内に存在しない属性に対して isset() または empty()

関数がクラスの外で使用されるとき、このメソッドの構文形式は次のとおりです。 :

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">public function __isset($name){ ... ... ; }</pre><div class="contentsignin">ログイン後にコピー</div></div> 注意する必要があるのは次のとおりです。 パラメータ $name は、アクセスする属性の名前です。

isset()

この関数は、変数が存在するかどうかを確認するために使用され、変数が NULL でないかどうかも判断します。入力された変数が存在する場合は、true が返されます。そうでない場合は true が返され、存在する場合は false が返されます。
  • empty()

    この関数は、変数が空かどうかを確認するために使用されます。変数の値が FALSE に等しい場合、その変数は考慮されます。存在しないこと。
  • isset() 関数または empty() 関数を使用してクラス内のプライベート プロパティを検出する場合は、クラスに __isset() メソッドを追加するだけです。 isset() または empty() 関数がクラス外で使用されると、クラス内の __isset() メソッドが自動的に呼び出されます。

  • 次に、例を通して __isset() メソッドの使用法を見てみましょう。例は次のとおりです。

    <?php
        class father{
            public $study = &#39;好好学习&#39;;
            private $name = &#39;天天向上&#39;;
            public function __isset($name){
                if(property_exists(&#39;Website&#39;, $name)){
                    echo &#39;成员属性:“&#39;.$name.&#39;”存在!<br>&#39;;
                }else{
                    echo &#39;成员属性:“&#39;.$name.&#39;”不存在!<br>&#39;;
                }
            }
        }
        $object = new father();
        isset($object -> mother);
        isset($object -> name);
    ?>
    ログイン後にコピー
  • 出力結果:



注意する必要があるのは、

property_exists()

関数を使用して、プロパティが構文形式は PHP の魔法のメソッドを 5 分で理解できます (詳細な例)

 property_exists($class_name,$property_name)
ログイン後にコピー

ここで、$class_name は文字列形式のクラス名、つまり、property_name 属性がクラス class_name に定義されているかどうかを決定します。

__unset()

<strong><span style="max-width:90%">メソッド</span></strong>自動呼び出し__unset() このメソッドの特定の条件は、アクセスできないプロパティまたはクラスに存在しないプロパティに対してクラスの外で unset() 関数が使用される場合です。このメソッドの構文形式は次のとおりです:

public function __unset($name){
    ... ... ;
}
ログイン後にコピー

其中我们需要注意的是:

  • 参数 $name 为要访问的属性名称。

  • unset() 函数的作用是删除指定的变量,需要传入一个或多个变量作为参数,另外,该函数没有返回值。

  • 可以使用 unset() 函数在类外部去删除类中的成员属性。如果要删除类中的公有属性的话直接使用 unset() 函数即可;

  • 如果要删除类中的私有属性的话,则需要在类中添加一个 __unset() 方法。

接下来我们通过实例来看一下__unset()方法的使用,实例如下:

<?php
    class father{
        public $name = &#39;http://c.biancheng.net/php/&#39;;
        private $study = &#39;C语言中文网&#39;;
        public function __unset($study){
            if(property_exists(&#39;father&#39;, $study)){
                unset($this->$study);
                echo &#39;移除成员属性:“&#39;.$study.&#39;”成功!<br>&#39;;
            }else{
                echo &#39;成员属性:“&#39;.$study.&#39;”不存在!<br>&#39;;
            }
        }
    }
    $object = new father();
    unset($object->name);
    unset($object->study);
    unset($object->study1);
?>
ログイン後にコピー

输出结果:

PHP の魔法のメソッドを 5 分で理解できます (詳細な例)

由上述实例看出当在类外部对类中不可访问或不存在的属性使用 unset() 函数时,__unset() 方法会被自动调用。

上述实例中给大家介绍了一些常用的魔术方法,但这并不是魔术方法的全部,那接下来再给大家列举一些魔术方法:

  • __call()  --- 调用一个不存在的方法时自动调用   

  • __sleep()  ---  使用 serialize 序列化时自动调用    

  • __toString() ---   把对象转换成字符串时自动调用   

  • __invoke()  ---  当尝试把对象当方法调用时自动调用

  • __wakeup()  ---  使用 unserialize 反序列化时自动调用    

  • __callStatic()  ---  调用一个不存在的静态方法时自动调用    

  • __debugInfo()  ---  使用 var_dump() 打印对象信息时自动调用 

  • __set_state()  ---  当使用 var_export() 函数时自动调用,接受一个数组参数    

大家如果感兴趣的话,可以点击《PHP视频教程》进行更多关于PHP知识的学习。

以上がPHP の魔法のメソッドを 5 分で理解できます (詳細な例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート