is_callable()
Функция is_callable() в PHP проверяет, можно ли вызвать переменную как функцию или метод. Узнайте о параметрах и практическом применении.
Введение
Функция is_callable() проверяет, можно ли значение вызвать как функцию, и возвращает true или false соответственно. Значение считается вызываемым, если PHP может его выполнить: имя встроенной или пользовательской функции, метод, замыкание или объект, реализующий __invoke().
На этой странице рассматривается, что считается вызываемым, три параметра функции (включая часто упускаемые $syntax_only и $callable_name), многочисленные формы callable, а также типичные ловушки. Основная причина использовать is_callable() — защита вызова: убедиться, что значение вызываемо, прежде чем его вызывать, чтобы при ошибке получить корректный сбой, а не фатальную ошибку.
Синтаксис
is_callable(mixed $value, bool $syntax_only = false, string &$callable_name = null): bool| Параметр | Описание |
|---|---|
$value | Проверяемое значение. Может быть строкой (имя функции), массивом [object, 'method'] или ['Class', 'staticMethod'], Closure или вызываемым объектом. |
$syntax_only | Если true, проверяет только, что $value выглядит как допустимый callable (строка или двухэлементный массив нужной формы) без проверки фактического существования функции/метода. По умолчанию false выполняет полную проверку. |
&$callable_name | Передаётся по ссылке. После вызова получает разрешённое имя, например "strlen" или "TestClass::testMethod". |
Возвращает bool: true, если $value вызываемо, false в противном случае.
Базовый пример
Четыре наиболее распространённые формы callable — имя функции, метод экземпляра, статический метод и невызываемая строка:
<?php
function testFunction()
{
echo "Hello world!";
}
class TestClass
{
public function testMethod() {}
public static function staticMethod() {}
}
$var1 = "testFunction"; // function name
$var2 = [new TestClass(), "testMethod"]; // [object, method]
$var3 = ["TestClass", "staticMethod"]; // [class, static method]
$var4 = "not_a_callable"; // nothing by this name
var_dump(is_callable($var1)); // bool(true)
var_dump(is_callable($var2)); // bool(true)
var_dump(is_callable($var3)); // bool(true)
var_dump(is_callable($var4)); // bool(false)
?>Здесь используется var_dump() вместо echo, потому что echo для boolean выводит 1 при true и пустую строку при false — что легко неверно интерпретировать. var_dump() явно показывает тип.
Замыкания и вызываемые объекты
Closure (анонимная функция) всегда является вызываемой. То же справедливо для любого объекта, в классе которого определён магический метод __invoke() — такие объекты можно использовать с синтаксисом $obj():
<?php
$closure = function () { return "called"; };
class Multiplier
{
public function __invoke($n) { return $n * 2; }
}
var_dump(is_callable($closure)); // bool(true)
var_dump(is_callable(new Multiplier())); // bool(true)
var_dump(is_callable("strlen")); // bool(true) — built-in functions count too
?>Защита вызова перед его выполнением
Основное практическое применение: сначала проверить, затем вызвать, чтобы некорректное значение никогда не вызвало фатальную ошибку.
<?php
function runIfPossible($maybeCallback)
{
if (is_callable($maybeCallback)) {
return $maybeCallback();
}
return "Nothing to run.";
}
echo runIfPossible(fn() => "It ran!") . "\n"; // It ran!
echo runIfPossible("missing_function") . "\n"; // Nothing to run.
?>$syntax_only: форма против существования
При $syntax_only = true функция is_callable() проверяет только, что значение имеет форму callable — она не подтверждает существование цели. Это быстрее, но менее надёжно:
<?php
// "ghost" is not a real function:
var_dump(is_callable("ghost")); // bool(false) — full check, fails
var_dump(is_callable("ghost", true)); // bool(true) — syntax only, just "is a string"
?>Используйте значение по умолчанию (false), когда собираетесь реально вызвать значение. Оставьте true для случаев, когда цель будет определена позже (например, регистрация обратных вызовов до загрузки их функций).
$callable_name: получение разрешённого имени
Третий параметр заполняется по ссылке каноническим именем callable — удобно для логирования или сообщений об ошибках:
<?php
class Greeter
{
public function hello() {}
}
is_callable([new Greeter(), "hello"], false, $name);
echo $name . "\n"; // Greeter::hello
is_callable("trim", false, $name2);
echo $name2 . "\n"; // trim
?>Типичные ловушки
echoскрывает boolean-значения.echo is_callable($x)выводит1дляtrueи ничего дляfalse. Предпочтительнееvar_dump()или конструкцияif.- Приватные/защищённые методы не вызываемы извне.
is_callable()учитывает видимость — пара[object, 'privateMethod']возвращаетfalseпри проверке вне области видимости класса. is_callable()— это неfunction_exists().function_exists()принимает только строку с именем функции;is_callable()принимает любую форму callable (замыкания, массивы методов, вызываемые объекты) — используйте её, когда значение может быть любым из них.- Синтаксис callable первого класса (PHP 8.1+).
strlen(...)создаётClosure, которуюis_callable()вернёт какtrue.
Связанные функции
- callable тип — полный справочник по тому, что PHP принимает как callable.
- Функции обратного вызова — передача функций в качестве аргументов.
- PHP функции — определение и вызов функций.
- Статические методы — форма callable
Class::method. - is_object() — проверка вызываемых объектов.
Заключение
is_callable() надёжно отвечает на один вопрос: можно ли вызвать это значение? Функция распознаёт имена функций, массивы методов, статические методы, замыкания и объекты с __invoke(), соблюдая правила видимости. Используйте её для защиты вызовов динамических обратных вызовов, применяйте $callable_name для получения читаемого имени в логах, а к $syntax_only обращайтесь только в узком случае, когда цель определяется позже.