Zend Framework中遇到的问题和解决方法

来源:互联网 发布:百度网盘vip淘宝 编辑:程序博客网 时间:2024/04/30 15:20

用ZF框架做了一个COO狗音乐,打开网页上面出错误信息但不影响网页的运行,但错误信息如下没法去掉,百度了一下找到下面的解决方法:

问题:

Notice: Zend_Loader::Zend_Loader::registerAutoload is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead in E:\AppServ\www\zendframework\library\Zend\Loader.php on line 266

解决方法:

提示的意思是从1.8.0版本开始不推荐使用Zend_Loader::autoload,Zend_Loader::autoload会在2.0.0版本中移除,推荐使用Zend_Loader_Autoloader来替代Zend_Loader::autoload.
只要把原声明文件中的
require_once “Zend/Loader.php”;
Zend_Loader::registerAutoload();
改为下面两行:
require_once “Zend/Loader/Autoloader.php”;
Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);
后警告信息消失.
Zend_Loader_Autoloader 的作用:提供真正的namespace autoloader (之前是不区分namespace的)提供注冊任意个数的callback 函式作为 autoload function, 其中是以 stack 的方式运行。这是为了克服 PHP 5标准的 spl_autoload 只允许一个 callback function 的问题。
允许最佳化的 namespace 比对方式,提高解析类別的速度。

其它一些相关文章:

ZF 1.8以后autoloader的用法  

文章一

今天将zf更新为1.8以后,页面出现了一行提示:
Notice: Zend_Loader::Zend_Loader::registerAutoload is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead in D:\webroot\zftest\app\library\Zend\Loader.php on line 207
赶紧查看源文件Zend/Loader.php 的207行,代码如下:
trigger_error(__CLASS__ . '::' . __METHOD__ . ' is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead', E_USER_NOTICE);

看这意思是说zf2.0以后将不再使用Zend_Loader::registerAutoload();而将使用一个新的类Zend_Loader_Autoloader,当然在目前1.8下还是可以继续使用,不过会有一个
E_USER_NOTICE级别的报错
查看了一下官方的文档Autoloader的用法.
将之前的代码改为如下:
require('Zend/Loader/Autoloader.php');
//Zend_Loader::registerAutoload();
Zend_Loader_Autoloader::getInstance()->registerNamespace('Zend_');//Zend框架的名字空间
Zend_Loader_Autoloader::getInstance()->registerNamespace('QQ_');//我自己的类的名字空间
Zend_Loader_Autoloader::getInstance()->setFallbackAutoloader(true);//能够载入无名子空间的类,比如models目录下的类。
改完以后即可正常运行了。

Zend_Loader_Autoloader 的功用(目的)
提供真正的namespace autoloader (之前是不区分namespace的)
提供注冊任意个数的callback 函式作为 autoload function, 其中是以 stack 的方式运行。这是为了克服 PHP 5标准的 spl_autoload 只允许一个 callback function 的问题。
允许最佳化的 namespace 比对方式,提高解析类別的速度。
From - http://www.ligaofeng.com/?p=229

还有一个偷懒的办法可以继续沿用之前的Zend_Loader::registerAutoload();就是在报错等级里面过滤掉E_USER_NOTICE。不过不推荐,因为升级到了2.0还是需要改的。 

文章二

“Notice: Zend_Loader::Zend_Loader::registerAutoload is deprecated as of 1.8.0 and will be removed with 2.0.0; use Zend_Loader_Autoloader instead in E:\web\zend\library\Zend\Loader.php on line 258”

初步分析是

require_once 'Zend/Loader.php';  Zend_Loader::registerAutoload(); 

的问题

查了资料才知道需要修改成

require_once 'Zend/Loader/Autoloader.php';  $loader = Zend_Loader_Autoloader::getInstance();  $loader->registerNamespace('App_');  

其中’App_’是对你的include目录名称路径 已在它的类遵循Zend Framework的命名约定,以便适时调整。

如果您需要自动 加载的能力比如通用,因为你的目录是您的模型包含路径,你不你的模型类的命名空间,然后加上这一句:

$loader->setFallbackAutoloader(true);  
$loader->suppressNotFoundWarnings(false);   

Zend Framework 1.8 Zend_Loader_Autoloader 原理分析.

  自动加载的原理是Zend_Application实例了Zend_Loader_Autoloader使其调用了 spl_autoload_register(array(__CLASS__, 'autoload')); 这样如果找不到的类就会调用此对象的autoload方法进行处理. 

  一个名称空间可以有多个加载器,迭代找出符合的自定义加载器后,其余的就不会使用了,一般我们只会针对一个名称空间注册一个自定义加载器或者直接使用默认的加载器. 

注册名称空间方式分为以下两种.

1.只注册了空间的前辍,没有指定任何加载器,注册方法为registerNamespace('空间名称').

2.注册了空间前辍,并指定了加载器.注册方法为pushAutoloader(加载器,'空间名称')或unshiftAutoloader(加载器,'空间名称')两个方法的区别是push将加载器放到指定空间名称的加载器队列之后,unshift是之前. 

当一个类没有找到并要求载入时, 其类名交给Zend_Loader_Autoloader::autoload()处理, 会经历以下几个过程:

1.用已经注册名称空间前辍和此类名进行对比,找出名称空间指定的加载器.

  ①用名称空间注册方式第二种名称前辍和此类名前辍进行对比,找出名称空间指定的加载器.

  ②用名称空间注册方式第一种名称前辍和此类名前辍进行对比,如果存在则用Zend的加载器.

       ③如果没有任何名称空间前辍和此类相等,而确设置了FallbackAutoloader标志则也使用Zend的加载器,否则不返回任何加载器,此类也就不能被载入了.

2.如果加载器是实现了Zend_Loader_Autoloader_Interface接口的类则将类名传给其autoload方法进行加载.如果加载器是一个函数则将类名当做此函数的参数进行加载. 如果加载器是一个数组则用call_user_func回调函数进行加载.

自定义的加载器有以下几种形式:

    1. 一个实现了Zend_Loader_Autoloader_Interface接口的对象.

             $autoloader = Zend_Loader_Autoloader::getInstance();

             $myAutoloader my_Autoloader();

             $autoloader->pushAutoloader($myAutoloaderClass, myNamespace); 

    2.一个函数,

             $autoloader = Zend_Loader_Autoloader::getInstance();

              function myAutoloaderFun(){ //TODO };

             $autoloader->pushAutoloader('myAutoloaderFun', myNamespace); 

    3.以回掉方式(callback)调用一个对象或类的方法.(回掉函数call_user_func)

             $autoloader = Zend_Loader_Autoloader::getInstance();

             $autoloader->pushAutoloader(array('类名', '方法'),  myNamespace); 

Zend加载器对象方法是Zend_Loader_Autoloader::_autoload. 此方法会用call_user_func调用最终的加载方法如默认为array('Zend_Loader', 'loadClass')对当前对象进行加载.

0 0
原创粉丝点击