2017-08-25 67 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)

因此,在第一次尝试时,文件系统并没有发现我的类文件因为它是区分大小写的。

但是,一旦我使用类的静态属性,不区分大小写的自动加载器能够找到我的类,由前一个调用加载!

相关问题