我很难得到心理实例化类。
我正在尝试使用PSR-4名称空间,并在作曲家中注册了psr-4自动加载,如下所示:
"autoload": {
"psr-4": {
"System\\": "phpclasses/"
}
},phpclasses\Test.php中有一个类,类名为Test,它有一个名为hello()的静态方法。
我打开一个命令外壳,启动了心理学,并且内核看起来正常工作。
如果我尝试运行Test::hello();,它将失败,除非我首先这样称呼它:echo System\Test::hello();
这个消息实际上失败了:
PHP致命错误:在第1行的eval()'d代码中找不到'System\Test‘类
但是,我可以成功地运行:echo Test::hello();
echo System\Test::hello();永远不会起作用
我试过使用System;,而使用System\Test;没有任何好处。
我使用的每个类,我都必须遍历这个例程,这有点拖拉,因为有些类使用静态方法,而每个类只有在每个类都经历了失败的第一个例程时才能工作。
基本上,同样的技术必须用于静态或非静态方法。
我正在windows 10、xampp (php 5.6)、composer (当前)安装的命令shell中运行心理学。
对于我做错了什么或者需要做什么有什么建议吗?
发布于 2016-08-11 21:31:32
这里的问题是你没有遵循PSR-4。使用您提供的配置,它希望在您的System文件夹中的phpclasses命名空间中找到类。因此,例如,文件Test.php将有类System\Test。
要修复它,可以将自动加载设置中的前缀更改为"",或者将namespace System;添加到Test.php文件中。如果您想了解为什么它是这样的,那么您必须了解一下PHP中自动加载是如何工作的:
PHP允许您注册一个自动加载程序来查找尚未遇到的类。自动加载器被赋予了一个类名,并给了它一个找到它的机会。通常,它们以某种方式将类名映射到文件。当他们被要求要一个未知的类时,他们会将类名转换成一个文件名,并尝试要求该文件。
PSR-4是设置这样一个自动加载器的标准,而Composer提供了一个符合PSR-4标准的自动加载器。要使它正常工作,您必须像PSR-4所期望的那样布局类和名称空间。如果你不这样做,你会遇到一些奇怪的问题,就像你遇到的一样。
当您第一次尝试调用Test::hello()时,没有定义该类。PSR-4自动加载器将其转换为文件名,但根据配置,没有为非命名空间的类定义生命,因此它找不到要加载的文件,因此它最终没有加载任何文件。在autoloader有机会之后,PHP仍然不知道这个类,所以它抛出了一个错误。
当您尝试调用System\Test::hello()时,PSR-4自动加载程序在配置中查找它,并将其转换为文件名(phpclasses/Test.php),这一次文件确实存在,因此它加载了该文件。然后PHP尝试调用这个方法,但是它不知道这个类,所以它抛出了一个错误。
第三次,它已经加载了您的文件并发现了非名称空间的Test类。所以,当您再次调用它时,它甚至不需要使用自动加载程序,而只是执行了您的方法。
https://stackoverflow.com/questions/38902916
复制相似问题