If the target class has __call() magic function implemented, then is_callable will ALWAYS return TRUE for whatever method you call it.
is_callable does not evaluate your internal logic inside __call() implementation (and this is for good).
Therefore every method name is callable for such classes.
Hence it is WRONG to say (as someone said):
...is_callable will correctly determine the existence of methods made with __call...
Example:
<?php
class TestCallable
{
public function testing()
{
return "I am called.";
}
public function __call($name, $args)
{
if($name == 'testingOther')
{
return call_user_func_array(array($this, 'testing'), $args);
}
}
}
$t = new TestCallable();
echo $t->testing(); // Output: I am called.
echo $t->testingOther(); // Output: I am called.
echo $t->working(); // Output: (null)
echo is_callable(array($t, 'testing')); // Output: TRUE
echo is_callable(array($t, 'testingOther')); // Output: TRUE
echo is_callable(array($t, 'working')); // Output: TRUE, expected: FALSE
?>is_callable
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
is_callable
Референца за `function.is-callable.php` со подобрена типографија и навигација.
is_callable
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
is_callable — Проверете дали вредноста може да се повика како функција од тековниот опсег
= NULL
Проверува дека value е callable, или дека може да се повика користејќи
call_user_func() function.
Параметри
value-
Вредноста што треба да се провери.
syntax_only-
Ако е поставено на
trueфункцијата само проверува декаvalueможе да биде функција или метод. Ќе отфрли било какви вредности што не се invokable објекти, Затворање, strings, или arrays што немаат валидна структура за да се користат како повик. Валиден повиклив список има 2 записи, од кои првиот е објект или стринг, а вториот е стринг. callable_name-
Прима "име на повик", на пр.
"SomeClass::someMethod". Имајте предвид, сепак, дека и покрај импликацијата декаSomeClass::someMethod()е статички метод што може да се повика, ова не е случај.
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true if value е повиклив, false
otherwise.
Примери
Пример #1 Проверка дали стринг може да се повика како функција
<?php
function someFunction() {}
$functionVariable = 'someFunction';
var_dump(is_callable($functionVariable, false, $callable_name));
var_dump($callable_name);
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
bool(true) string(12) "someFunction"
Пример #2 Проверка дали список може да се повика како функција
<?php
class SomeClass
{
public function someMethod() {}
}
$anObject = new SomeClass();
$methodVariable = [$anObject, 'someMethod'];
var_dump(is_callable($methodVariable, true, $callable_name));
var_dump($callable_name);
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
bool(true) string(21) "SomeClass::someMethod"
Пример #3 is_callable() и конструктори
И покрај фактот дека конструкторите се методите што се повикуваат кога се создава објект, тие не се статички методи и
is_callable() ќе врати false за нив. Не е можно да се користи is_callable() за да се провери дали класа може да се инстанцира од тековниот опсег.
<?php
class Foo
{
public function __construct() {}
public function foo() {}
}
var_dump(
is_callable(['Foo', '__construct']),
is_callable(['Foo', 'foo'])
);
$foo = new Foo();
var_dump(is_callable([$foo, '__construct']));
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
bool(false) bool(false) bool(true)
Белешки
- Објектот е секогаш повикувачки ако имплементира __invoke(), и тој метод е видлив во тековниот опсег.
- Името на класата е повикувачко ако имплементира __callStatic().
-
Ако објектот имплементира __call(), тогаш оваа функција ќе врати
trueза кој било метод на тој објект, дури и ако методот не е дефиниран. - Оваа функција може да предизвика авто-вчитање ако се повика со името на класата.
Види Исто така
- call_user_func() - Повикајте ја повратната функција дадена од првиот параметар
- function_exists() - Вчитува PHP екстензија во време на извршување
- method_exists() - Проверува дали постои метод на класата
Белешки од корисници 2 забелешки
Note that -- as mentioned in the migration guide-- starting from PHP 8.0, is_callable() will not work with non-static methods if you use a class name, instead an object of the class should be provided:
<?php
class Test
{
public function method1() { }
public static function method2() { }
}
// Pre PHP 8
var_dump(is_callable(array('Test', 'method1'))); // bool(true)
var_dump(is_callable(array('Test', 'method2'))); // bool(true)
// Post PHP 8
var_dump(is_callable(array('Test', 'method1'))); // bool(false)
var_dump(is_callable(array('Test', 'method2'))); // bool(true)
var_dump(is_callable(array(new Test, 'method1'))); // bool(true)
?>