電子書籍の厳選無料作品が豊富!

いつもお世話になっています。
PHPの勉強を始めた初心者です。
is_callable()の第二引数の使い方がよく分りません。
true に設定すると、$name が文字列型である場合には、常に bool(true)を返します。
どういう時に、役に立つのでしょうか?
お教えいただければ幸いです。


<?php
// http://php.net/manual/ja/function.is-callable.php
/*
bool is_callable ( callback $name [, bool $syntax_only = false [, string &$callable_name ]] )


syntax_only
TRUE の場合、この関数は単に name が関数またはメソッドであるかどうかだけを調べます。
文字列以外の型の変数や不正な形式の配列は、引数として受け付けられません。
*/

class someClass {
function someMethod() {
print "hello from someMethod\n";
}
}

$varInt = 1;
$varString = "string";
$varObject = new someClass();
$varMethod = array($varObject, 'someMethod');

var_dump(is_callable($varInt, true)); // bool(false)
var_dump(is_callable($varInt, false)); // bool(false)

var_dump(is_callable($varString, true)); // bool(true)
var_dump(is_callable($varString, false)); // bool(false)

var_dump(is_callable($varMethod, true)); // bool(true)
var_dump(is_callable($varMethod, false)); // bool(true)

$varObject->someMethod();



[study_php@localhost ch05]$ php is_callable_Test.php
bool(false)
bool(false)
bool(true)
bool(false)
bool(true)
bool(true)
hello from someMethod
[study_php@localhost ch05]$

A 回答 (3件)

PHP のソースアーカイブに zend_API.c というファイルがあります。

ここに実際の処理内容が記述されていますので、こちらをご覧になるとよいでしょう。

当たり前の回答になりますが、速度に違いが出るので確認対象の数が多いときに使うのだと思います。

それ以外では、第3引数で呼び出し名を受け取る変数を設定したいとき、端折れないので false と書くぐらいでしょうか。こちらは HTML_QuickForm2_Rule_Callback クラス定義中の記述で確認できます。

ここを true で呼び出している例は、見つけることが出来ませんでした。
    • good
    • 0

すみません、説明不足でした。



is_callableの第二引数をtrueにする使い方に対して、
先に挙げた関数などもあるので、
「意識して使う必要もあまり無い気がします」
ということが言いたかっただけでした。

第二引数をfalseにしての使い道は、質問者さんも分かってらっしゃると思います。
    • good
    • 0

マニュアルに、シンタックスのみを見る、と書いてあるとおり、


array('文字列', '文字列')
'文字列'
array('オブジェクト', '文字列')
という形式になっているものは全部通しますね。(でも'1'とかしても通るのはちょっとダメなんじゃないかとは思います)

呼び出し可能かを調べる方法としては、
function_exists
method_exists
class_exists
など、他のものもあるので、意識して使う必要もあまり無い気がします。

今のところ何に使うかはパッと思いつきませんが、とりあえず知ってさえいれば、
それを使わなくてはならないような何らかの案件があったときに、使えるのではないでしょうか。

この回答への補足

回答ありがとうございます。

>呼び出し可能かを調べる方法としては、
>method_exists

method_exists() だと、private や protected なメソッドを引数に渡したときも bool(true) を返してしまうので、callback を行う際に、そのメソッドが callable であるかどうかのチェックが出来ないのではないでしょうか?

補足日時:2010/11/25 23:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!