2012-04-09 133 views
1

我想知道這是否是一個bugwrong implementation .....我嘗試檢查,如果class_existPHP類奇怪的行爲

我的班級

namespace servers\testing ; 

class HelloWord 
{ 
    function hello() 
    { 
     echo "hello World" ; 
    } 
} 

測試

use servers\testing\HelloWord as OkWorld ; 

$okWolrd = new OkWorld() ; 
$helloWorld = new \servers\testing\HelloWord() ; 

var_dump($okWolrd); //object(servers\testing\HelloWord)[1] 
var_dump(class_exists('servers\testing\HelloWord')); //true 
var_dump(class_exists('OkWorld')); //false 


$declearedClasses = get_declared_classes() ; 

var_dump(in_array('servers\testing\HelloWord', $declearedClasses)); //true 
var_dump(in_array('OkWorld', $declearedClasses)); //false 


var_dump($okWolrd instanceof $helloWorld); //true but OkWolrd needed to be initiated before it works 

問題

是否表示OkWord是不是有效的PHP類?請注意0​​工作正常。

如何驗證OkWord存在沒有減速?

編輯1

我知道OkWorldalias但其servers\testing\HelloWord這是一個有效類的引用...

感謝

+1

如果任何人有負面投票,請給出評論。謝謝 – Baba 2012-04-09 23:17:53

回答

3

我認爲這是沒有錯誤,也不是一個錯誤的執行。

OKWorld不是一個類,它是一個別名,只要它存在,解釋器就會用HelloWord替換它。但解釋器不會搜索字符串,所以函數class_exists將得到字符串OKWorld並搜索相應的類,該類實際上不存在!實際存在的是一個別名。

0

OkWorld不是類;這是一個名稱空間別名。實際班級是HelloWord

+1

我知道......問題是如何驗證該別名是否存在......因爲它被視爲有效的類 – Baba 2012-04-09 22:55:23

+0

@Baba:爲什麼要測試別名是否存在?你想達到什麼目的? AFAIK這隻能用反射來完成。 – FtDRbwLXw6 2012-04-09 22:58:20

+0

映像您有一個REST服務,用戶需要遠程指向一個類...而不必將命名空間..其清理器使用別名... ...另一個示例如果您要開發和自動加載的分類..和別名被用來代替完整的路徑..會發生什麼 – Baba 2012-04-09 23:06:08

2

返回因爲如果OkWorld檢查錯誤是是有效的,因爲OkWorld是一個別名,而不是一個實際的類。您可以嘗試使用instanceof代替:

// Not sure if this works (haven't used namespace aliases yet) 
//var_dump('OkWorld' instanceof HelloWorld); // No GOOD - Throws fatal 

// This will work 
$okWorld = new OkWorld(); 
var_dump($okWorld instanceof HelloWorld); 
+0

我同意是一個別名,但你的代碼只有在'OKWord'有效並且被初始化時纔有效 – Baba 2012-04-09 22:54:36

+0

@Baba:謝謝,發現並更新了。 – 2012-04-09 22:55:16

+0

@MikePurcell第一個投擲致命(instanceof期望實例) – poncha 2012-04-09 22:56:30