难以在psysh

时间:2016-08-11 17:45:20

标签: php composer-php

我很难让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。

对于我做错了什么或需要采取哪些不同的建议?

1 个答案:

答案 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类。因此,当您再次尝试调用它时,它甚至没有使用自动加载器,只是执行了您的方法。