1

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

我有一个名为的类,它的主函数中有一个,这里glue这样调用:spl_autoload_registerrun

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

自动加载功能通过 PSR-0 标准加载并从绝对路径工作。这一切都被测试为工作等。请注意,glue它没有命名空间。

autoload 函数覆盖了一个名为glue. 在这个命名空间中,我有一个名为\glue\ErrorHandler.

当我触发错误时,glue该类将通过 PSR-0 表示法从存储常量\glue\ErrorHandler定义的根目录自动加载。这已经过测试,在和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

错误它的工作原理。似乎是因为一个错误,它不会自动加载我的错误处理程序。

我认为这可能是因为 myspl_autoload_register没有绑定到该名称空间(因为工作的错误处理程序实际上是从 inside 调用的glue)以及某些方式,也许它是随机工作的。因此,\glue\Validation我调用了一个我从未看过的类:\glue\util\Crypt但这可以正常工作并正确进入自动加载器。

当我调用这个错误时:Call-time pass-by-reference has been deprecatedglue课堂上它工作得很好。

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

编辑

按照这里的要求是一个简短的版本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;
    }
}
4

1 回答 1

0

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

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

于 2013-05-24T11:29:21.900 回答