W3docs

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.

Связанные функции

Заключение

is_callable() надёжно отвечает на один вопрос: можно ли вызвать это значение? Функция распознаёт имена функций, массивы методов, статические методы, замыкания и объекты с __invoke(), соблюдая правила видимости. Используйте её для защиты вызовов динамических обратных вызовов, применяйте $callable_name для получения читаемого имени в логах, а к $syntax_only обращайтесь только в узком случае, когда цель определяется позже.

Практика

Практика
Какова основная цель функции is_callable() в PHP?
Какова основная цель функции is_callable() в PHP?
Was this page helpful?