Мой коллега и я столкнулись с некоторым довольно странным поведением. Наша среда 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 /()