Подтвердить что ты не робот

Поведение is_callable на '/'

Мой коллега и я столкнулись с некоторым довольно странным поведением. Наша среда Ubuntu 11.10, PHP 5.3.6-13ubuntu3.6 с Suhosin-Patch и Windows 7 PHP 5.3.5.

На наших машинах работает следующий код:

<?php
function t() { }
var_dump(is_callable('/'));

С выходом:

bool(false)

На одном из наших серверов, CentOS версии 5.7 (Final), PHP 5.3.8, тот же код создает:

bool(true)

Без функции t() is_callable выполняет так, как ожидалось. Обратите внимание, что is_function ведет себя так же, как is_callable в этих тестах.

Кто-нибудь знает, что может быть причиной этого?

Edit

Кажется, что происходит только при наличии функции с именем t, что-нибудь еще, например b, c и т.д., и результат будет таким, как ожидалось.

Изменить - тестирование с большим количеством символов:

<?php
function t() { }
foreach(str_split('/[email protected]#$%^&*()-_+=`~;:[]{}\\|\'"?.>,<') as $character) {
    if (is_callable($character)) var_dump($character, is_callable($character));
}

Выводит на сервер следующее:

string(1) "/"
bool(true)
string(1) "t"
bool(true)
string(1) "T"
bool(true)
string(1) "_" // gettext
bool(true)
string(1) ":" // With the t() function undefined, this remains callable on the server
bool(true)

В нашей среде выход выглядит так, как ожидалось:

string(1) "t"
bool(true)
string(1) "T"
bool(true)

Изменить - дополнительная информация о комментарии cbuckley:

<?php 
ini_set('display_errors', 1);
error_reporting(E_ALL);
function t() { }
$v = '/'; $v();

Производит вывод: Call to undefined function /()

4b9b3361

Ответ 1

Как работа вокруг, вы можете попробовать следующее:

$name = '/';
$actual = null;
if (is_callable($name, false, $actual) && $name === $actual) {
    // Method is actually callable
}