Zend Framework 自动加载类的实现方法

简介:

Zend Framework中实现自动加载类。网上查了很多,有好几种。本文收集了常用的3种,

第一种如下:

E0FD4B173A4E45AA9F26C3AFC6D84587

方法很简单,举例说明。比如想要在models目录下的类可以自动加载。

先在index.php中修改include path。

1
2
3
4
5
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR,  array (
     realpath (APPLICATION_PATH .  '/../library' ),
     get_include_path(), realpath (APPLICATION_PATH .  '/models' )
)));

上述代码里,添加包含了models的目录。

然后在Bootstrap.php文件下,实现一个资源方法。

1
2
3
4
5
protected  function  _initAutoload()
{
             $autoloader  = Zend_Loader_Autoloader::getInstance();
             $autoloader ->setFallbackAutoloader(true);         
}

然后在models里可以加一个类。注意文件名和类名的关系(类名要加上路径名,用_隔开。下有示例),不然自动加载会失败。比如加一个Nav.php的文件。内容如下:

1
2
3
4
5
6
7
<?php
class  Nav  {
public  static  function  getNav() {
    echo  "pfpf" ;
}
}
?>

在某个controller中,直接使用Nav类。

Nav::getNav();

如果models中需要加文件夹,那么相应的类名也要有更改。举例:

412A0F3703C3416683E6FAB52D3C637A

在models下有新建一个newFolder文件夹,在该文件夹下面新建一个文件MKA,那么这个文件中的类名就应该是newFolder_MKA这种约定。

1
2
3
4
5
6
7
<?php
class  newFolder_MKA  {
public  static  function  getNav() {
echo  "<br>MKA" ;
}
}
?>

默认的,index.php中已经包含了 realpath(APPLICATION_PATH . '/../library')这个路径,即可以直接把类放到这个文件夹中,既可以实现自动加载。

————————————————————————————————————————————————

还有一种方法,和上述方法类似,只不过在资源方法中实现注册命名空间(这里命名空间的概念和C#中命名空间概念不太一样,这里指的是类名前面的前缀和包含类的文件夹)。假设要自动加载的类在library中,默认的index.php中的includepath已经包含了。

E4A273299421470DA005954200E29941

那么这些类名也要按约定加上命名空间前缀,在My目录下的加上My_,没有目录的就加_。这样的话,资源方法中只需注册一下命名空间就行了。

1
2
3
4
5
6
protected  function  _initAutoload ()
{
     Zend_Loader_Autoloader::getInstance()
     ->registerNamespace( 'My_' )
     ->registerNamespace( '_' );
}

然后就可以直接调用My_Book类和_Pen类了。

My_Book::show();

_Pen::show();

甚至,你也不需要在资源方法中加代码,只需在配置文件application.ini中加入如下指令即可:

1
2
autoloaderNamespaces[] =  "My_"
autoloaderNamespaces[] =  "_"

————————————————————————————————————————————————

还有一种方法 ,采用Zend_Loader_Autoloader_Resource类。

看例子,在Bootstrap.php文件下,写一个资源方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
         protected  function  _initAutoload()
{
             $loader  new  Zend_Loader_Autoloader_Resource( array (
'basePath'   => APPLICATION_PATH , //这里指定任何路径,指定路径后就在这个路径下找
'namespace'  =>  'Foo' , //这里的命名空间值的是类的前缀,比如这个就是类的前缀是Foo_开头的。
             ));
             $loader ->addResourceType( 'wwww' 'models' 'Modelxxx' ); //这个方法三个参数,分别是资源类型(貌似可以随便填),路径,子命名空间
                //下面是源码中对于这3个参数的说明
                /**
      * Add resource type
      *
      * @param  string $type identifier for the resource type being loaded
      * @param  string $path path relative to resource base path containing the resource types
      * @param  null|string $namespace sub-component namespace to append to base namespace that qualifies this resource type
      * @return Zend_Loader_Autoloader_Resource
      */
}

例如上面的例子,它会在APPLICATION_PATH\models\目录下,自动加载Foo_Modelxxx_这样的类。

具体看下面的例子,目录结构图如下:

ADN0FC$CI[_JCYVGZN(D)F1

那现在的目标是能够自动加载没有folder中的类。

对应的,第一步,指定好自动加载的basepath,即'basePath' => APPLICATION_PATH.'/myfolder',指定一个命名空间Myns。

注意命名空间的首字母大写,不然报错。

接着,加载资源类型,指定更细节的路径和命名空间。

所有的代码如下:

1
2
3
4
5
6
7
8
9
protected  function  _initAutoload()
{
             $loader  new  Zend_Loader_Autoloader_Resource( array (
'basePath'   => APPLICATION_PATH. '/myfolder' ,
'namespace'  =>  'Myns'
             ));
             $loader ->addResourceType( 'mytype' '/' 'Mysubns' )
             ->addResourceType( 'mytype2' 'mysubfolder' 'Mysubns2' );
}

其中注意命名空间首字母大写,路径要指对,然后具体的类名要符合响应的规则。比如例子中的类名的格式就是

命名空间_子命名空间_类名的格式。

具体如下:

1
2
3
4
5
6
7
8
<?php
class  Myns_Mysubns2_Myclass2
{
     public  static  function  show()
     {
echo  "myns_mysubns2_myclass2" , "<br>" ;
     }
}?>
1
2
3
4
5
6
7
8
9
<?php
class  Myns_Mysubns_Myclass
{
     public  static  function  show()
     {
echo  "myns_mysubns_myclass" , "<br>" ;
     }
}
?>

然后调用的是直接

1
2
Myns_Mysubns_Myclass::show();
Myns_Mysubns2_Myclass2::show();

就可以了。













本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1300913,如需转载请自行联系原作者


相关文章
|
6月前
|
PHP 数据库 开发者
深入理解PHP中的命名空间与自动加载机制
在PHP开发实践中,合理利用命名空间和自动加载机制能够显著提升代码的可维护性和效率。本文将详细探讨PHP命名空间的概念、作用以及如何结合自动加载机制来优化代码结构。通过实例分析,我们将了解如何避免常见的命名冲突问题,并掌握自动加载策略在项目中的实际应用。文章的目的是为读者提供一套清晰的指南,帮助其在实际项目中灵活运用这些关键技术,以实现更加模块化和高效的代码管理。
|
6月前
|
PHP 开发者
深入理解PHP的命名空间和自动加载机制
在PHP开发中,合理使用命名空间和自动加载机制可以有效管理代码,提升项目的可维护性和可扩展性。本文将详细解析PHP命名空间的概念、实现原理及其与自动加载机制的协同工作方式,旨在为开发者提供清晰的指导和实践建议,帮助构建更加模块化和高效的PHP应用程序。
|
3月前
|
PHP 开发者
深入理解PHP的命名空间与自动加载机制
【7月更文挑战第56天】 在现代PHP开发实践中,命名空间和自动加载机制是模块化和代码复用的重要工具。本文旨在揭示PHP命名空间的核心概念、实现原理及其与自动加载机制的协同工作方式。通过对PHP内部实现的分析与示例演示,读者将能更深入地理解这两个特性如何优化项目结构,减少代码冗余,并提高开发效率。文章不仅讲解了基础理论,还通过具体案例展示了如何在项目中合理运用这些知识,帮助开发人员构建更加清晰和可维护的代码库。
|
3月前
|
PHP 开发者 容器
深入理解PHP的命名空间和自动加载机制
【7月更文挑战第57天】 在现代PHP开发中,命名空间和自动加载机制是两个核心概念,它们极大地提高了代码的可维护性和复用性。本文将详细探讨PHP命名空间的概念、实现以及如何与自动加载机制协同工作来提升项目的模块化水平。我们将透过对这两个特性的深入分析,了解它们是如何简化代码结构,避免类名和函数名冲突,以及如何通过自动加载提高应用程序的性能。
|
6月前
|
PHP 开发者
PHP中的命名空间与自动加载机制
【5月更文挑战第30天】在PHP开发中,命名空间和自动加载机制是提高代码组织性和运行效率的关键技术。本文将详细解析PHP命名空间的概念、使用方法及其在项目中的实际作用,同时深入探讨自动加载机制的原理、实现方式以及如何高效地整合到项目中。通过理解这些技术点,开发者能够编写更加模块化和易于维护的代码,并且优化应用的性能。
|
6月前
|
PHP
深入理解PHP中的命名空间和自动加载机制
【4月更文挑战第11天】在PHP的编程世界中,命名空间和自动加载机制是两个强大的工具,它们能够有效地解决代码冲突和简化代码的加载过程。本文将深入探讨这两个概念,解释它们是如何工作的,以及如何在实际开发中应用它们来提高代码的可维护性和效率。
|
4月前
|
Linux
查看linux内核版本
在Linux中查看内核版本可使用`uname -r`、`cat /proc/version`、`lsb_release -a`、`cat /etc/*release`、`dmesg | grep Linux`、`hostnamectl`、`kernrelease`(部分系统)、`rpm -q kernel`(RPM系统)或`dpkg -l linux-image-*`(Debian系)。
144 2
|
设计模式 存储 架构师
ThinkPHP5源码阅读-类的自动加载register与autoload的实现
PHP快速入门与实战ThinkPHP是国内最流行的一款PHP框架,是国人自主研发的框架,起源于2006年,经过了十几年的不断发展。已经成为了一款被PHP广泛认可的性能开发效率兼具的利器。阅读框架源码有助于我们更好的学习语言基础,拓展设计模式等相关能力。同时很多设计与编码的思想也能更好的指导我们日常工作,尤其是想成为资深程序员或者架构师方面的同事,这是一个必须要学习的过程。今天是ThinkPHP5源码第一讲,关于类的自动加载,看看源码底层是怎么实现的。怕迷路的同学,先给个关注吧。
102 0
|
6月前
|
存储 Linux 数据安全/隐私保护
Docker环境下安装Portaine管理工具
Docker环境下安装Portaine管理工具
121 3
Docker环境下安装Portaine管理工具
|
关系型数据库 MySQL Windows
MySQL卸载文档-Windows版
MySQL卸载文档-Windows版
904 0