2012-03-02 15 views
30

Mi colega y yo hemos encontrado un comportamiento bastante extraño. Nuestros entornos son Ubuntu 11.10, PHP 5.3.6-13ubuntu3.6 con Suhosin-Patch y Windows 7 PHP 5.3.5.Comportamiento de is_callable en '/'

en nuestras máquinas, el siguiente código funciona como cabría esperar:

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

Con la salida:

bool(false) 

En uno de nuestros servidores, CentOS liberar 5,7 (Final), PHP 5.3 0,8, el mismo código produce:

bool(true) 

Sin la función t(), is_callable funciona según lo esperado. Tenga en cuenta que is_function se comporta de la misma manera que is_callable en estas pruebas.

¿Alguien tiene alguna idea de lo que podría estar causando esto?

Editar:

Parece ocurrir sólo cuando una función llamada t está presente, cualquier otra cosa, como b, c etc, y la salida es la esperada.

Editar - prueba con más caracteres:

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

Emite el siguiente en el servidor:

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) 

En nuestro entorno, la salida es el esperado:

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

Editar - mo re información sobre el comentario de cbuckley:

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

produce una salida: Call to undefined function /()

+0

Eso es realmente extraño. ¿Es solo para ''/' '? – Hamish

+0

@Hamish He actualizado mi pregunta con la prueba de código 'is_callable' en más caracteres –

+0

¿Qué sucede cuando' '$ v = '/'; $ v(); '? – cmbuckley

Respuesta

0

Como solución podría intentar esto:

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