is_callable

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

is_callable Verify that a value can be called as a function from the current scope

Опис

is_callable(mixed $value, bool $syntax_only = false, string &$callable_name = null): bool

Verifies that value is a callable, or that it can be called using the call_user_func() function.

Параметри

value

The value to be checked.

syntax_only

If set to true the function only verifies that value might be a function or method. It will reject any values that are not invokable objects, Closure, strings, or arrays that do not have a valid structure to be used as a callback. A valid callable array has 2 entries, the first of which is an object or a string, and the second a string.

callable_name

Receives the "callable name", e.g. "SomeClass::someMethod". Note, however, that despite the implication that SomeClass::someMethod() is a callable static method, this is not the case.

Значення, що повертаються

Returns true if value is callable, false otherwise.

Приклади

Приклад #1 Checking whether a string can be called as a function

<?php

function someFunction() {}

$functionVariable = 'someFunction';

var_dump(is_callable($functionVariable, false, $callable_name));

var_dump($callable_name);

?>

Поданий вище приклад виведе:

bool(true)
string(12) "someFunction"

Приклад #2 Checking whether an array can be called as a function

<?php

class SomeClass
{
public function
someMethod() {}
}

$anObject = new SomeClass();

$methodVariable = [$anObject, 'someMethod'];

var_dump(is_callable($methodVariable, true, $callable_name));

var_dump($callable_name);

?>

Поданий вище приклад виведе:

bool(true)
string(21) "SomeClass::someMethod"

Приклад #3 is_callable() and constructors

Despite the fact that constructors are the methods that are called when an object is created, they are not static methods and is_callable() will return false for them. It's not possible to use is_callable() to check if a class can be instantiated from the current scope.

<?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']));

?>

Поданий вище приклад виведе:

bool(false)
bool(false)
bool(true)

Примітки

  • An object is always callable if it implements __invoke(), and that method is visible in the current scope.
  • A class name is callable if it implements __callStatic().
  • If an object implements __call(), then this function will return true for any method on that object, even if the method is not defined.
  • This function may trigger autoloading if called with the name of a class.

Прогляньте також

add a note

User Contributed Notes 2 notes

up
34
izharaazmi at gmail dot com
9 years ago
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:<?phpclass 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: TRUEecho is_callable(array($t, 'testingOther'));  // Output: TRUEecho is_callable(array($t, 'working'));       // Output: TRUE, expected: FALSE?>
up
17
mohamed dot elidrissi at protonmail dot com
4 years ago
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:<?phpclass Test{    public function method1() { }    public static function method2() { }}// Pre PHP 8var_dump(is_callable(array('Test', 'method1'))); // bool(true)var_dump(is_callable(array('Test', 'method2'))); // bool(true)// Post PHP 8var_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)?>
To Top