class_exists仅在调用静态类属性时才有效

时间:2017-08-25 08:24:00

标签: php composer-php

我正在一个作曲家处理自动加载的项目中工作。

我有一个班级:

namespace App\Foo;

use MyCLabs\Enum\Enum;

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

我有一个基本的class_exists检查(实际上它是动态的,所以我不能直接调用Bar :: class):

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

当类确实存在时返回false。

但是,当我执行以下操作时:

$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

因为文件系统区分大小写,所以找不到我的类文件。

但是一旦我使用了我的类静态属性,该类就在自动加载器中注册,这是不区分大小写的!

所以现在我要弄清楚如何检索正确的类名,但这是另一个问题!

感谢您的帮助,抱歉不要发布完整的问题!

1 个答案:

答案 0 :(得分:1)

对于那些遇到问题的人,请注意案件情况。

在我的情况下(huhu)我的班级名字以几个大写字母(BarFOO)结束但我的字符串类名不是(BarFoo)

因此,在第一次尝试时,文件系统找不到我的类文件,因为它区分大小写。

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