为啥我收到 PHP 致命错误:未捕获的错误:找不到类“MyClass”? [复制]

Posted

技术标签:

【中文标题】为啥我收到 PHP 致命错误:未捕获的错误:找不到类“MyClass”? [复制]【英文标题】:Why am I getting PHP Fatal error: Uncaught Error: Class 'MyClass' not found? [duplicate]为什么我收到 PHP 致命错误:未捕获的错误:找不到类“MyClass”? [复制] 【发布时间】:2017-02-20 17:54:51 【问题描述】:

这行得通:

class MyClass 
    public $prop = 'hi';


class Container 
    static protected $registry = [];
    public static function get($key)
        if(!array_key_exists($key, static::$registry))
            static::$registry[$key] = new $key;
        
        return static::$registry[$key];
    


$obj = Container::get('MyClass');
echo $obj->prop;

但是当我尝试将其分解为单独的文件时,我得到了一个错误。

php 致命错误:未捕获的错误:在 /nstest/src/Container.php:9 中找不到类“MyClass”

这是第 9 行:

static::$registry[$key] = new $key;

疯狂的是我可以对其进行硬编码,而且它可以工作,所以我知道命名空间是正确的。

static::$registry[$key] = new MyClass;

显然我不想硬编码它,因为我需要动态值。我也试过:

$key = $key::class;
static::$registry[$key] = new $key;

但这给了我这个错误:

PHP 致命错误:编译时不允许使用动态类名 ::class fetch

我很茫然。 Clone these files to reproduce:

.
├── composer.json
├── main.php
├── src
│   ├── Container.php
│   └── MyClass.php
├── vendor
│   └── ...
└── works.php

别忘了自动加载器。

composer dumpautoload

composer.json


    "autoload": 
        "psr-4": 
            "scratchers\\nstest\\": "src/"
        
    

main.php

require __DIR__.'/vendor/autoload.php';
use scratchers\nstest\Container;

$obj = Container::get('MyClass');
echo $obj->prop;

src/Container.php

namespace scratchers\nstest;

class Container 
    static protected $registry = [];
    public static function get($key)
        if(!array_key_exists($key, static::$registry))
            static::$registry[$key] = new $key;
        
        return static::$registry[$key];
    

src/MyClass.php

namespace scratchers\nstest;

class MyClass 
    public $prop = 'hi';

【问题讨论】:

new ClassName 查找相对于当前命名空间的类,new $classname 不查找。 @tkausl 嗯,有道理,那么解决方案是什么? 在变量中使用完整的类名(即\scratchers\nstest\MyClass)或更好的MyClass::class(产生完整的类名) @tkausl 谢谢!这成功了:) 【参考方案1】:

Thanks to @tkausl,我可以通过将完全限定名称作为变量传递来绕过动态相对命名空间。

require __DIR__.'/vendor/autoload.php';
use scratchers\nstest\Container;
use scratchers\nstest\MyClass;

$obj = Container::get(MyClass::class);
echo $obj->prop;

【讨论】:

另外,请确保您的使用声明大写或小写有所不同。 @prosti 实际上类名在 php 中不区分大小写 ***.com/a/33273959/4233593

以上是关于为啥我收到 PHP 致命错误:未捕获的错误:找不到类“MyClass”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP致命错误:未捕获错误:找不到类

PHP 致命错误:未捕获的错误:即使在调用 autoload.php 后也找不到类“Google_Service_Gmail_Resource_Users”?

Laravel - 致命错误:未捕获的错误:找不到类'Auth'

致命错误:未捕获的错误:找不到类“App\Config”

PDO:未捕获的 PDOException:找不到驱动程序

xampp和PHP致命错误:未捕获错误:找不到类'DOMDocument'