is_callable在'/'上的行为

时间:2012-03-02 00:24:36

标签: php

我的同事和我遇到了一些相当奇怪的行为。我们的环境是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的函数时才会发生,其他任何事情,如bc等,输出都是预期的。

编辑 - 使用更多字符进行测试

<?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 /()

1 个答案:

答案 0 :(得分:0)

作为一种解决方法,你可以试试这个:

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