为啥我收到 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 致命错误:未捕获的错误:即使在调用 autoload.php 后也找不到类“Google_Service_Gmail_Resource_Users”?