2016-08-11 35 views
1

我很难获得psysh来实例化类。在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 Fatal error: Class 'System\Test' not found in eval()'d code on line 1

但我可以成功运行:echo Test::hello();

echo System\Test::hello();绝不会工作

我试过使用System;和使用System\Test;没有有益的影响。

我使用的每个类都必须经过这个例程,这是一种拖拽,因为某些类使用静态方法,并且每个类只有在每个类都经历了失败优先例程时才起作用。

基本上相同的技术必须用于静态或非静态方法。

我在Windows 10,xampp(php 5.6),作曲家(当前)安装的命令外壳中运行psysh。

对于我在做什么错误或需要改变的任何建议?

回答

2

这里的麻烦是你没有遵循PSR-4。使用您提供的配置,它期望在phpclasses文件夹内的System名称空间中找到类。因此,例如,文件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类。所以当你试着再次调用它时,它甚至不用自动加载器,只是执行你的方法。

+2

优秀的解释。 感谢您花时间回答。 并感谢您编写psysh! – Kurt