2017-08-25 60 views
0

我正在編寫器處理自動加載的項目中工作。class_exists僅在調用靜態類屬性時才起作用

我有一個類:

namespace App\Foo; 

use MyCLabs\Enum\Enum; 

/** 
* @method static Bar MY_CONST() 
*/ 
class BarFOO extends Enum 
{ 
    const MY_CONST = 'my_const'; 
    ... 
} 

我有一個基本的class_exists檢查(在現實中,它是動態的,所以我cant't直接調用酒吧::類):

$strClass = '\App\Foo\BarFoo'; 
var_dump(class_exists($strClass)); 

返回假如班級確實存在

然而,當我做到以下幾點:

$strClass = '\App\Foo\BarFoo'; 

var_dump(class_exists($strClass)); // false 
var_dump(class_exists(\App\Foo\BarFOO::class)); // true 
var_dump(class_exists($strClass)); // true 

然後同時它是完全一樣的第一個最後的var_dump返回true!

有沒有人有線索?

編輯

我編輯我的問題的答案不是猜測的! 其實我的字符串值不匹配原始的類名:

BarFoo // string value 
BarFOO // Class name 

因此,作爲文件系統是大小寫敏感的,我的類文件沒有被發現。

但是,只要我使用我的類的靜態屬性,類是註冊在不區分大小寫的自動加載器!

所以,現在我要弄清楚如何檢索正確的類名,但這是另一個問題!

感謝您的幫助和抱歉,不要發佈完整的問題!

+2

不知道它會有所作爲(可能不是),但字符串類名始終是絕對的,所以引用該類的正確方法是「App \ Foo \ Bar'',沒有引導反斜槓。 – deceze

+0

謝謝你們的幫助,我想通了,不幸的是,我錯過了我的班名以許多大寫字母結尾,字符串變量沒有結束的事實! – jiboulex

+0

@deceze它在兩種情況下都有效,但我更喜歡你的方式 – jiboulex

回答

0

對於那些遇到問題的人,請注意情況。

在我的情況(忽忽)我的類名轉換爲大寫幾個(BarFOO)結束,但我的串類的名字不是(BarFoo)

因此,在第一次嘗試時,文件系統並沒有發現我的類文件因爲它是區分大小寫的。

但是,一旦我使用類的靜態屬性,不區分大小寫的自動加載器能夠找到我的類,由前一個調用加載!