ホームページ バックエンド開発 PHPチュートリアル PHP の is_callable() 関数と method_exists() 関数を調べる

PHP の is_callable() 関数と method_exists() 関数を調べる

Sep 06, 2017 pm 04:24 PM
callable exists method

多くの製品アプリケーションでは、オブジェクト内のメソッドが存在するかどうかを確認するために使用される次のような使用法がよく見られます。

<?php
    if (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
    }
?>
ログイン後にコピー

このコードの目的は、$object というオブジェクトがあるので、SomeMethod というメソッドがあるかどうかを知りたいのです。

このコードは正しく見え、ほとんどの場合問題なく動作します。しかし、この $object オブジェクトのメソッドが現在の実行環境から見えない場合でも、プログラムは正常に実行できるのでしょうか?この関数名メソッドが存在するのと同様に、提供したクラスまたはオブジェクトに期待するメソッドがあるかどうかを確認するだけであり、存在しない場合は FALSE を返します。可視性の問題はここでは考慮されません。したがって、プライベート メソッドまたはプロテクト メソッドを偶然決定した場合、正しい戻り値を取得できますが、実行時に「致命的エラー」エラー警告が表示されます。

上記のコードの本当の意図は、提供されたクラスまたはオブジェクトに対して、現在のスコープでその SomeMethod メソッドを呼び出すことができるかどうかということです。そして、これがまさに is_callable() 関数の目的です。 is_callable() 関数はコールバック パラメーターを受け取り、関数名またはメソッド名とオブジェクトを含む配列を指定できます。現在のスコープで実行できる場合は、TRUE を返します。 is_callable()函数存在的目的。is_callable()函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE。

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
        $object->SomeMethod($this, TRUE); 
    }
?>
ログイン後にコピー

下面来举个例子来说明两者的区别

<?phpclass Foo {
    public function PublicMethod(){}    
    private function PrivateMethod(){}    
    public static function PublicStaticMethod(){}    
    private static function PrivateStaticMethod(){}
}
    $foo = new Foo();$callbacks = array(    
    array($foo, &#39;PublicMethod&#39;),    
    array($foo, &#39;PrivateMethod&#39;),    
    array($foo, &#39;PublicStaticMethod&#39;),    
    array($foo, &#39;PrivateStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),
   );
   foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));    
    echo str_repeat(&#39;-&#39;, 10);    
    echo &#39;<br />&#39;;
}
ログイン後にコピー

执行上面的脚本后,我们会清晰地看到两个函数间的差别。

is_callable()还有其他的用法,例如,不检查所提供的类或方法,只检查函数或方法的语法是否正确。像method_exists()一样,is_callable()可以触发类的自动加载。

如果一个对象存在魔术方法__call,在进行方法判断时method_exists()会返回FALSE,而is_callable()会返回TRUE。

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);      
      echo &#39;<br />&#39;;
    }
}$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);
var_dump(method_exists($obj,&#39;runtest&#39;));
var_dump(is_callable(array($obj,&#39;runtest&#39;)));

echo &#39;<br />&#39;;
ログイン後にコピー

运行结果

Calling object method runtest in object context
bool(false) bool(true)

PHP の is_callable() 関数と method_exists() 関数を調べる

在很多产品应用中,我们经常能够看到以下这种用法,它用来检查一个对象里的方法是否存在。

<?phpif (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
}?>
ログイン後にコピー

这段代码的目的比较容易理解,有一个对象为$object,我们想知道它是否有一个方法为SomeMethod,如果有,就调用此方法。

这个代码看起来正确,而且在大部分的时候运行也会正常。但是如果这个$object对象的方法对于当前的运行环境是不可见的,程序还能正常运行吗?正如这个函数名方法存在一样,只是对我们提供的类或对象检查是否有我们所期望的方法,如果有,就返回TRUE,如果没有,就返回FALSE,这里并没有考虑可见性的问题。所以,当你恰好判断一个私有或者受保护的方法时,你能够得到一个正确的返回,但是执行的时候,会得到一个“Fatal Error”错误警告。

上面这段代码的真正意图应该理解为:对于提供的类或者对象,我们能否在当前的作用域中调用它的SomeMethod方法。而这正是is_callable()函数存在的目的。is_callable()函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE。

<?php
    if (is_callable(array($object, &#39;SomeMethod&#39;))) {      
    $object->SomeMethod($this, TRUE); 
    }
?>
ログイン後にコピー

下面来举个例子来说明两者的区别

<?php
    class Foo {
    public function PublicMethod(){}    
    private function PrivateMethod(){}    
    public static function PublicStaticMethod(){}    
    private static function PrivateStaticMethod(){}
}
$foo = new Foo();$callbacks = array(    
    array($foo, &#39;PublicMethod&#39;),    
    array($foo, &#39;PrivateMethod&#39;),    
    array($foo, &#39;PublicStaticMethod&#39;),    
    array($foo, &#39;PrivateStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),    
    array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),
   );
   foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));    
    echo str_repeat(&#39;-&#39;, 10);    
    echo &#39;<br />&#39;;
}
ログイン後にコピー

执行上面的脚本后,我们会清晰地看到两个函数间的差别。

is_callable()还有其他的用法,例如,不检查所提供的类或方法,只检查函数或方法的语法是否正确。像method_exists()一样,is_callable()可以触发类的自动加载。

如果一个对象存在魔术方法__call,在进行方法判断时method_exists()会返回FALSE,而is_callable()

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);      
      echo &#39;<br />&#39;;
    }
}
$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);
var_dump(method_exists($obj,&#39;runtest&#39;));
var_dump(is_callable(array($obj,&#39;runtest&#39;)));
echo &#39;<br />&#39;;
ログイン後にコピー
2 つの違いを説明するために例を挙げてみましょう

rrreee

上記のスクリプトを実行すると、2 つの関数の違いが明確にわかります。


is_callable() には他の用途もあります。たとえば、提供されたクラスやメソッドをチェックするのではなく、関数やメソッドの構文が正しいかどうかだけをチェックします。 method_exists() と同様に、is_callable() はクラスの自動ロードをトリガーできます。

オブジェクトにマジックメソッド __call がある場合、メソッドを判定するときに method_exists() は FALSE を返し、is_callable() は TRUE を返します。 。 PHP の is_callable() 関数と method_exists() 関数を調べるrrreee

実行結果🎜🎜オブジェクトコンテキストでオブジェクトメソッド runtest を呼び出す🎜bool(false) bool(true)🎜🎜🎜🎜
🎜多くの製品アプリケーションでは、次のような使用法がよく見られます。オブジェクト内のメソッドが存在するかどうかを確認するために使用されます。 🎜rrreee🎜 このコードの目的は、$object というオブジェクトがあり、それに SomeMethod というメソッドがあるかどうかを知りたいのです。ある場合は、このメソッドを呼び出します。 🎜🎜このコードは正しく見え、ほとんどの場合問題なく動作します。しかし、この $object オブジェクトのメソッドが現在の実行環境から見えない場合でも、プログラムは正常に実行できるのでしょうか?この関数名メソッドが存在するのと同様に、提供したクラスまたはオブジェクトに期待するメソッドがあるかどうかを確認するだけであり、存在しない場合は FALSE を返します。可視性の問題はここでは考慮されません。したがって、プライベート メソッドまたはプロテクト メソッドを偶然決定した場合、正しい戻り値を取得できますが、実行時に「致命的エラー」エラー警告が表示されます。 🎜🎜上記のコードの本当の意図は、提供されたクラスまたはオブジェクトに対して、現在のスコープでその SomeMethod メソッドを呼び出すことができるかどうかということです。そして、これがまさに is_callable() 関数の目的です。 is_callable() 関数はコールバック パラメーターを受け取り、関数名またはメソッド名とオブジェクトを含む配列を指定できます。現在のスコープで実行できる場合は、TRUE を返します。 🎜rrreee🎜 2 つの違いを説明するために例を挙げてみましょう🎜rrreee🎜 上記のスクリプトを実行すると、2 つの関数の違いが明確にわかります。 🎜🎜is_callable() には他の用途もあります。たとえば、提供されたクラスやメソッドをチェックするのではなく、関数やメソッドの構文が正しいかどうかだけをチェックします。 method_exists() と同様に、is_callable() はクラスの自動ロードをトリガーできます。 🎜🎜オブジェクトにマジックメソッド __call がある場合、メソッドを判定するときに method_exists() は FALSE を返し、is_callable() は TRUE を返します。 。 🎜rrreee🎜実行結果🎜🎜オブジェクトコンテキストでのオブジェクトメソッドruntestの呼び出し🎜bool(false) bool(true)🎜🎜🎜🎜

以上がPHP の is_callable() 関数と method_exists() 関数を調べるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHP 致命的エラーの解決策: メンバー関数 fetch() の呼び出し PHP 致命的エラーの解決策: メンバー関数 fetch() の呼び出し Jun 23, 2023 am 09:36 AM

Web アプリケーション開発に PHP を使用する場合、多くの場合データベースを使用する必要があります。データベースを使用すると、エラー メッセージがよく発生します。その中でも、PHPFatalerror: Calltoamemberfunctionfetch() は、PDO を使用してデータベースをクエリするときに発生する比較的一般的なエラーです。では、このエラーの原因と解決方法は何でしょうか?この記事ではそれについて詳しく説明します。 1. エラーの原因

Java での Synchronized の原理と使用シナリオ、および Callable インターフェイスの使用法と差異分析 Java での Synchronized の原理と使用シナリオ、および Callable インターフェイスの使用法と差異分析 Apr 21, 2023 am 08:04 AM

1. 基本機能 1. 楽観的ロックで開始し、ロック競合が多発する場合は悲観的ロックに変換する 2. 軽量なロック実装で開始し、長時間ロックを保持するとロックを解除する3. 軽量ロックを実装するときに最もよく使用されるスピン ロック戦略 4. 不公平なロックである 5. リエントラント ロックである 6. 読み取り/書き込みロックではない 2. JVMロック プロセスを同期します。 ロックは、ロックなし、バイアスされたロック、軽量ロック、および重量ロックの状態に分類されます。状況に応じて順次バージョンアップしていきます。偏ったロックは男主人公を鍵、女主人公をスレとするもので、このスレッドだけがこのロックを使用すれば、たとえ結婚証明書を取得しなくても男主人公と女主人公は永遠に幸せに暮らせる(高額回避) -コストオペレーション)しかし、女性のサポート役が登場します

C# で File.Exists 関数を使用してファイルが存在するかどうかを確認する方法 C# で File.Exists 関数を使用してファイルが存在するかどうかを確認する方法 Nov 18, 2023 am 11:25 AM

C# で File.Exists 関数を使用してファイルが存在するかどうかを確認する方法 C# のファイル操作では、ファイルが存在するかどうかを確認することが基本的な機能要件です。 File.Exists 関数は、ファイルが存在するかどうかを確認するために使用される C# のメソッドです。この記事では、C# で File.Exists 関数を使用してファイルが存在するかどうかを確認する方法を紹介し、具体的なコード例を示します。名前空間を参照する コードの記述を開始する前に、まず System.IO 名前空間を参照する必要があります。

jQueryでPOSTリクエストメソッドを使用する方法 jQueryでPOSTリクエストメソッドを使用する方法 Feb 28, 2024 pm 09:03 PM

jQuery で POST リクエスト メソッドを使用する方法 Web 開発では、フロントエンド ページとバックエンド サーバー間のデータ対話が頻繁に発生します。中でも POST リクエストはよく使われるメソッドで、POST リクエストを通じてバックエンドサーバーにデータを送信し、対応する戻り結果を取得できます。 jQuery は、AJAX リクエストを行うための便利な方法を提供する人気のある JavaScript ライブラリです。この記事では、jQuery で POST メソッドを使用してデータを送信する方法と具体的な手順を紹介します。

PHP エラー: 呼び出し可能なソリューションとして null を使用してください! PHP エラー: 呼び出し可能なソリューションとして null を使用してください! Aug 19, 2023 pm 05:01 PM

PHP エラー: 呼び出し可能なソリューションとして null を使用してください! PHP の開発プロセス中に、いくつかのエラー メッセージが表示されることがよくありますが、一般的なエラーの 1 つは、「呼び出し可能として null を使用している」です。このエラー メッセージは、呼び出し可能オブジェクトを呼び出すときに null 値がパラメータとして渡されたため、対応する操作が実行できなかったことを示します。このエラーは通常、コールバック関数、メソッド、またはクラスのインスタンスを呼び出すときに発生し、呼び出し可能なオブジェクトをパラメーターとして正しく渡す必要があります。一般的なコード例をいくつか示します。

Java で Callable インターフェイスを実装してスレッド クラスを作成する方法 Java で Callable インターフェイスを実装してスレッド クラスを作成する方法 May 11, 2023 am 11:58 AM

Callable インターフェイスを実装してスレッド クラスを作成すると、Java 5 以降、Callable インターフェイスが提供されます。このインターフェイスは、Runnable インターフェイスの拡張バージョンです。Callable インターフェイスは、スレッドの実行本体として call() メソッドを提供します。call() メソッドは、 call() メソッドで例外を宣言できます。 booleancancel(booleanmay) は、Future に関連付けられた呼び出し可能なタスクをキャンセルしようとします。 Vget() は、Call タスクの call() メソッドの戻り値を返します。このメソッドを呼び出すとスレッドがブロックされるため、戻り値を取得する前に子スレッドが終了するまで待つ必要があります。 Vget(ロングタイムアウト,Ti

JavaのCallableインターフェースの使い方 JavaのCallableインターフェースの使い方 Apr 19, 2023 am 09:58 AM

注 1. Callable インターフェイスは結果を返したり例外タスクをスローしたりでき、実装者はパラメータのない呼び出しメソッドを定義できます。 2. Callable タスクの実行方法は、Thread や Runnable の実行方法とは異なり、call です。 call() は値を返すことができますが、 run() メソッドは値を返すことができません。 call() は ClassNotFoundException などのチェック例外をスローできますが、 run() はチェック例外をスローできません。インスタンス クラスMyCallableimplementsCallable{MyCallable(){}@OverridepublicInteger

MYSQL での EXISTS 関数の使用 MYSQL での EXISTS 関数の使用 Feb 24, 2024 pm 05:15 PM

MYSQL での EXISTS の使用法 (コード例付き) MYSQL データベースでは、EXISTS は非常に便利な演算子であり、サブクエリが少なくとも 1 行のデータを返すかどうかを判断するために使用されます。通常、サブクエリの結果に基づいて条件を満たすデータをフィルタリングするために WHERE 句とともに使用されます。 EXISTS を使用する場合は、次の点に注意する必要があります。 EXISTS 条件では、サブクエリによって返される特定のデータは考慮されず、返されるデータがあるかどうかのみが考慮されます。 EXISTS 条件は、他の条件と組み合わせて使用​​できます。

See all articles