PHP自动加载器无法正常工作

时间:2013-05-24 11:19:26

标签: php php-5.3

我似乎对自动加载在PHP中的工作原理有一些误解,我根本无法解释。

我有一个名为glue的课程,其主要功能中有spl_autoload_register,此处称为run,如下所示:

class glue{
    public static function run(){
        spl_autoload_register(array('glue','autoload'));
    }
}

自动加载功能通过PSR-0标准加载,并从绝对路径开始工作。这都是在工作等情况下测试的。请注意glue未命名。

自动加载功能涵盖名为glue的命名空间。在这个命名空间中,我有一个名为\glue\ErrorHandler的错误处理程序。

当我触发错误时,glue类将根据存储的\glue\ErrorHandler常量定义的根目录中的PSR-0表示法自动加载ROOT。这已经在\glue\User\glue\Session等课程中进行了测试。

所以现在问题。我在Call-time pass-by-reference has been deprecated内导致\glue\Validation错误,但似乎没有运行我的自动加载功能。

我可以看到它是如何进入我的自动加载功能的,但是当我在该类中调用此错误时,它似乎跳过我的自动加载器并挽救说它无法找到我的错误处理程序类。

通常我会说这是我的编程,但我已经尝试了一切。对于这一个错误,我无法解释如何。令我进一步混淆的是,如果我造成:

syntax error, unexpected T_ISSET in /media/server_ws/xxxxxxx/glue/Validation.php on line 47

错误有效。似乎是因为一个错误它不会自动加载我的错误处理程序。

我认为这可能是因为我的spl_autoload_register没有绑定到该命名空间(因为有效的错误处理程序实际上是从glue内调用的)以及某些如何,它可能是随机工作的。所以从\glue\Validation开始我调用了一个我从未看过的课程:\glue\util\Crypt但是它可以正常进入自动加载器。

当我在Call-time pass-by-reference has been deprecated课程中调用此错误:glue时,它的效果非常好。

任何人都可以对此有所了解吗?

修改

根据要求提供Validation.php

的简化版本
namespace glue;

use glue,
    \glue\Exception,
    \glue\Collection;

class Validation extends \glue\Component{
    private function validateRule($rule){
        // This is the line, notice the pass by reference down there?
        $valid = $validator($field,$field_value,$params,&$this->model) && $valid;
    }
}

1 个答案:

答案 0 :(得分:0)

在脚本编译期间抛出Call-time pass-by-reference has been deprecated错误,并且在编译期间禁用自动加载。它被禁用是因为编译器无法同时开始编译多个脚本(即它不可重入),并且自动加载可能会加载某些脚本,这可能需要对其进行编译。

来源:https://github.com/php/php-src/blob/76ad52ccc501c02aeb068d2eb4f119ef6f0c2b6a/Zend/zend_execute_API.c#L1058