我的同事和我遇到了一些相当奇怪的行为。我们的环境是Ubuntu 11.10,带有Suhosin-Patch的PHP 5.3.6-13ubuntu3.6和Windows 7 PHP 5.3.5。
在我们的计算机上,以下代码按预期运行:
<?php
function t() { }
var_dump(is_callable('/'));
输出:
bool(false)
在我们的一台服务器上,CentOS发行版5.7(最终版),PHP 5.3.8,相同的代码产生:
bool(true)
如果没有t()
函数,is_callable
会按预期执行。请注意,is_function
在这些测试中的行为与is_callable
相同。
有没有人知道造成这种情况的原因是什么?
修改:
似乎只有在存在名为t
的函数时才会发生,其他任何事情,如b
,c
等,输出都是预期的。
编辑 - 使用更多字符进行测试:
<?php
function t() { }
foreach(str_split('/abcdefghijkmnopqrstuvwxyz023456789ABCDEFGHIJKLMNOPQRSTUVXYZ!@#$%^&*()-_+=`~;:[]{}\\|\'"?.>,<') 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 /()
答案 0 :(得分:0)
作为一种解决方法,你可以试试这个:
$name = '/';
$actual = null;
if (is_callable($name, false, $actual) && $name === $actual) {
// Method is actually callable
}