PHP 8.4.2 Released!

is_callable

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

is_callable Verifica se um valor pode ser chamado como uma função a partir do escopo atual

Descrição

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

Verifica se o valor informado em value é do tipo callable, ou se pode ser chamado usando a função call_user_func().

Parâmetros

value

O valor a ser verificado.

syntax_only

Se definido para true a função apenas verifica se value pode ser uma função ou método. Ela irá rejeitar quaisquer valores que não sejam objetos chamáveis, Closure, strings ou arrays que não tenham uma estrutura válida para ser usado como uma função de retorno. Um array chamável válido tem 2 entradas, a primeira delas é um objeto ou uma string, e a segunda uma string.

callable_name

Recebe o "nome da função chamável", por exemplo, "AlgumaClasse::algumMétodo". Observe, entretanto, que embora a implicação de que AlgumaClasse::algumMétodo() seja um método estático chamável, este não é o caso.

Valor Retornado

Retorna true se value puder ser chamado como função, false caso contrário.

Exemplos

Exemplo #1 Verificando se uma string pode ser chamada como uma função

<?php

function someFunction() {}

$functionVariable = 'someFunction';

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

var_dump($callable_name);

?>

O exemplo acima produzirá:

bool(true)
string(12) "someFunction"

Exemplo #2 Checking whether an array can be called as a function

<?php

class SomeClass
{
function
someMethod() {}
}

$anObject = new SomeClass();

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

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

var_dump($callable_name);

?>

O exemplo acima produzirá:

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

Exemplo #3 Exemplo de is_callable() e contrutores

Apesar do fato que construtores são métodos que são chamados quando um objeto é criado, eles não são métodos estáticos e is_callable() retornará false para eles. Não é possível usar is_callable() para verificar se uma classe pode ser instanciada a partir do escopo atual.

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

?>

O exemplo acima produzirá:

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

Notas

  • Um objeto é sempre chamável se ele implementar o método __invoke(), e este método estiver visível no escopo atual.
  • Um nome de classe é chamável se ela implementa o método __callStatic().
  • Se um objeto implementa o método __call(), então esta função retornará true para qualquer método neste objeto, mesmo se o método não estiver definido.
  • Esta função pode disparar o auto-carregamento se chamada com o nome de uma classe.

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 2 notes

up
35
izharaazmi at gmail dot com
8 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:
<?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
?>
up
19
mohamed dot elidrissi at protonmail dot com
3 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:

<?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)

?>
To Top