我将下面的代码作为自动加载类,但看起来干净方法根本不起作用,它总是回到脏方法.
我错误地使用spl_autoload吗?如果是这样,那么正确(更好)的方式是什么?这效率低下,怎么可以改进?
虽然在使用这种方法时我总是得到诸如底部之类的输出,并且在某些情况下它只是找不到类但是没有抛出任何错误我将显示错误设置为1并检查错误日志但是完全丢失.
代码初始化为
require "vendor/AutoLoader.class.php"; self::setGlobal("autoloader",AutoLoader::init());
课程如下:
public static $instance; private $_src=array('vendor/','lib/',''); private $_sub=array('base/',''); private $_ext=array('.php','class.php','lib.php'); /* initialize the autoloader class */ public static function init(){ if(self::$instance==NULL){ self::$instance=new self(); } return self::$instance; } /* put the custom functions in the autoload register when the class is initialized */ private function __construct(){ spl_autoload_register(array($this,'clean')); spl_autoload_register(array($this,'dirty')); } /* the clean method to autoload the class without any includes,works in most cases */ private function clean($class){ $class=str_replace('_','/',$class); spl_autoload_extensions(implode(',',$this->_ext)); foreach($this->_src as $resource){ foreach($this->_sub as $sub){ echo 'Trying to load ',$class,' via ',__METHOD__,"()<br />"; set_include_path(pegFramework::getGlobal("baseDir") . $resource.$sub); spl_autoload($class); if(class_exists($class)) { echo 'Found and clean included '.$class.' in '.$resource.$sub."<br />"; break 2; } } } } /* the dirty method to autoload the class after including the php file containing the class */ private function dirty($class){ global $docroot; $class=str_replace('_',$class); foreach($this->_src as $resource){ foreach($this->_ext as $ext){ foreach($this->_sub as $sub){ echo 'Trying to load ',"()<br />"; if(@include(pegFramework::getGlobal("baseDir") . $resource . $sub. $class . $ext)) { echo 'Found and dirty included '.$class.' as '.$resource . $sub. $class . $ext."<br />"; break 3; } } } } spl_autoload($class); }
Trying to load pegDatabase via pegAutoloader::clean() ...snip... Trying to load pegDatabase via pegAutoloader::clean() Trying to load pegDatabase via pegAutoloader::dirty() Trying to load pegDatabase via pegAutoloader::dirty() Trying to load basepegDatabase via pegAutoloader::clean() ...snip... Trying to load basepegDatabase via pegAutoloader::clean() Trying to load basepegDatabase via pegAutoloader::dirty() Found and dirty included basepegDatabase as vendor/base/basepegDatabase.php Found and dirty included pegDatabase as vendor/pegDatabase.php Trying to load pegRequest via pegAutoloader::clean() ...snip... Trying to load pegRequest via pegAutoloader::clean() Trying to load pegRequest via pegAutoloader::dirty() Trying to load pegRequest via pegAutoloader::dirty() Found and dirty included pegRequest as vendor/pegRequest.php Trying to load pegFacebook via pegAutoloader::clean() ...snip... Trying to load pegFacebook via pegAutoloader::clean() Trying to load pegFacebook via pegAutoloader::dirty() ...snip... Trying to load pegFacebook via pegAutoloader::dirty() Trying to load Facebook via pegAutoloader::clean() Trying to load Facebook via pegAutoloader::clean() ...snip... Trying to load Facebook via pegAutoloader::dirty() Trying to load Facebook via pegAutoloader::dirty() Trying to load Facebook via pegAutoloader::dirty() ...snip... Trying to load Facebook via pegAutoloader::dirty() Trying to load Facebook via pegAutoloader::dirty() ...snip... Trying to load Facebook via pegAutoloader::dirty()
解决方法
我认为这是对spl_autoload的召唤让你绊倒了.在
php documentation的评论中,我找到了
this:
Note this function will LOWERCASE the class names its looking for,dont be confused when it cant find Foo_Bar.php
因此,使用pegFacebook或Facebook调用spl_autoload只会触发搜索名为pegfacebook.php或facebook.class.php的文件.
但是,如果我是你,我会看一下Symfony的UniversalClassLoader,以获得更简化的类加载处理的例子.您可以调整它以使用特定的扩展,但我至少会考虑找到一种新的方法来处理这个问题.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。