【发布时间】:2017-08-25 08:23:59
【问题描述】:
我正在一个由 composer 处理自动加载的项目中工作。
我有一堂课:
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
所以由于文件系统区分大小写,所以没有找到我的类文件。
但是,一旦我使用了我的类静态属性,该类就被注册在不区分大小写的自动加载器中!
所以现在我要弄清楚如何检索正确的类名,但这是另一个问题!
感谢您的帮助,很抱歉没有发布完整的问题!
【问题讨论】:
-
不确定是否会有所不同(可能不会),但字符串类名始终是绝对的,因此引用该类的正确方法是
'App\Foo\Bar',不带前导反斜杠。跨度> -
谢谢你们的帮助,我想通了,不幸的是,我错过了我的类名以许多大写字母结尾而字符串变量没有的事实!
-
@deceze 它适用于两种情况,但我确实更喜欢你的方式
标签: php composer-php