2012-03-02 39 views
30

Đồng nghiệp của tôi và tôi đã gặp phải một số hành vi khá kỳ quặc. Môi trường của chúng tôi là Ubuntu 11.10, PHP 5.3.6-13ubuntu3.6 với Suhosin-Patch và Windows 7 PHP 5.3.5.Hành vi của is_callable trên '/'

Trên máy của chúng tôi, đoạn code sau chạy như người ta mong đợi:

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

Với kết quả:

bool(false) 

Trên một trong các máy chủ của chúng tôi, CentOS phát hành 5,7 (Final), PHP 5.3 .8, cùng mã sản xuất:

bool(true) 

Nếu không có chức năng t(), is_callable hoạt động như mong đợi. Lưu ý rằng is_function hoạt động giống như is_callable trong các thử nghiệm này.

Có ai có bất kỳ ý tưởng nào có thể gây ra điều này không?

Sửa:

Nó dường như chỉ xảy ra khi một hàm có tên t là hiện nay, bất cứ điều gì khác, như b, c vv, và đầu ra được như mong đợi.

Edit - thử nghiệm với nhiều ký tự:

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

đầu ra sau trên máy chủ:

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) 

On môi trường của chúng tôi, đầu ra là như mong đợi:

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

Chỉnh sửa - mo tái thông tin về bình luận cbuckley của:

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

Tạo đầu ra: Call to undefined function /()

+0

Đó là thực sự kỳ lạ. Nó chỉ dành cho ''/''? – Hamish

+0

@Hamish Tôi đã cập nhật câu hỏi của mình với kiểm tra mã 'is_callable' trên nhiều ký tự –

+0

Điều gì xảy ra khi bạn thực hiện' $ v = '/'; $ v(); '? – cmbuckley

Trả lời

0

Là một công việc xung quanh bạn có thể thử này:

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