PHP 自动加载类无法找到的问题解决的总结

来源:互联网 发布:app开放端口什么意思 编辑:程序博客网 时间:2024/05/17 05:59

这周利用公司的PHP框架,开发类,但是自动加载该类后,总是找不到该类。本文将对记录如何尝试解决这个问题和最后的一些总结思考。


问题描述:

在ActivationService.php定义类ActiveService,在Autoload.php注册回调spl_autoload_register自动将ActiveService.php中ActiveService类加载到内存,然后写一个测试类ActivationServiceTest,在ActivationServiceTest中调用ActiveService这个类的公用方法。运行ActiveServiceTest,结果显示无法找到ActiveService这个类。

错误输出: ?PHP Fatal error:  Class 'ActiveService' not found in /path/to/ActivationServiceTest.php line 18

可能原因分析:

1. 可能是Autoload.php中,ActiveService.php文件的路径或者文件名写错了。仔细检查后,排除该可能性。

2. spl_autoload_register调用失败。var_dump(spl_autoload_register())的结果,显示ture,排除这种可能。

3.  strace -f -o log php ActivationServiceTest.php 跟踪ActivatonServiceTest.php的调用过程发现:




KidsConfig和ActiveService类都是相似的类,从上面两个图可以看出来,都能够正常加载KidsConfig.php和ActiveService.php文件至内存,但是ActiveService.php加载完后,会执行write(1, "?", 1) 就是向标准输出一个问号"?",从上面的问题描述可以看到(红色的问号"?")。很困惑为什么会输出一个问号。

4. 在ActiveService的__construct()方法中,加入语句echo "construct ActiveSerivce";。再次运行,结果屏幕上没有输出这个行提示信息。因此可以判断,程序根本没有初始化类ActiveService。这是什么原因呢?应该是这个类有语法错误,但是在PhpStorm中,没有发现错误的提示,而且这个类的编码风格和其他的类极为统一,一般来说不会出现语法错误。

5. 尝试将ActiveService的代码拷贝到ActivationServiceTest.php文件中执行,结果也是一样,也输出一个问号。

6. 实在没办法解决,求助同事。同事在她的机器上新建了ActiveService的代码拷贝到新建的ActivationServiceTest1.php文件中执行,居然成功了。

diff了一下ActivationServiceTest.php和ActivationServiceTest1.php的区别。


难道只是这个常量定义不同,导致我的无法执行,而她的可以?我尝试将下ActivationServiceTest.php修改成ActivationServiceTest1.php完全一致,运行果然可以执行。

因此,估计可能是这个常量定义有问题,想想这个常量里面的汉字“首次绑定(激活)”是我直接copy过来的,可能字符集不一致,导致虽然从Phpstorm上看其来没什么问题,但是实际上不是这么回事。我用Pspad纯文本模式打开文件,果然发现问题了:


难怪会根本无法初始化这个类啊。这是类的定义本身就有语法错误,只是从Phpstorm看不出来。

重新定义常量后,问题得到解决。

总结:

1. 编码方式和字符集导致的程序问题较为隐蔽,因此,当出现特别诡异的输出的时候,要特别小心。
2. 程序的中文字符最好不要从其他地方直接copy过来,本文所出的问题也是直接拷贝过来导致的。
3. 文件一般采用UTF-8编码,对于中文字符可以转换成16进制的UTF-8格式再使用,这样就能够做到跨平台使用。


0 0
原创粉丝点击