我很难让psysh实例化类。
我正在尝试使用PSR-4名称空间,并在这样的作曲家中注册了一个psr-4自动加载:
"autoload": {
"psr-4": {
"System\\": "phpclasses/"
}
},
phpclasses \ Test.php 中有一个类,类名Test
有一个名为hello()
的静态方法。
我打开命令shell,启动psysh,psysh似乎正常工作。
如果我尝试运行Test::hello();
它会失败,除非我先这样称呼它:echo System\Test::hello();
这实际上是失败的消息:
PHP致命错误:Class' System \ Test'在第1行的eval()' d代码中找不到
然后我可以成功运行:echo Test::hello();
echo System\Test::hello();
永远无法运作
我尝试使用System;
并使用System\Test;
没有任何有益效果。
我使用的每个类,我都必须经历这个例程,这是一种拖累,因为有些类使用静态方法,并且每个类只有在每个类都经历了失败的第一个例程时才会起作用。 / p>
基本上,必须对静态或非静态方法使用相同的技术。
我在Windows 10,xampp(php 5.6),composer(current)安装的命令shell中运行psysh。
对于我做错了什么或需要采取哪些不同的建议?
答案 0 :(得分:3)
这里的麻烦在于你没有关注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自动加载器将其转换为文件名,但根据您的配置,没有为非命名空间类定义生存,因此无法找到要加载的文件,并且最终没有加载任何内容。在自动加载器有机会之后,PHP仍然不知道该类,所以它引发了错误。
当您尝试呼叫System\Test::hello()
时,您的PSR-4自动加载器会在配置中查找并将其转换为文件名(phpclasses/Test.php
),这次确实存在,因此它加载了该文件。 PHP然后尝试调用方法,但它不知道该类,所以它引发了一个错误。
第三次,它已经加载了你的文件并发现了非命名空间的Test类。因此,当您再次尝试调用它时,它甚至没有使用自动加载器,只是执行了您的方法。