【问题标题】:class_exists only works when the static class property is calledclass_exists 仅在调用静态类属性时有效
【发布时间】: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


【解决方案1】:

遇到问题的人,请注意案情。

就我而言 (huhu),我的类名以几个大写字母 (BarFOO) 结尾,但我的字符串类名不是 (BarFoo)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 2015-08-13
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多