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,如需转载请自行联系原作者


相关文章
|
9月前
|
设计模式 存储 架构师
ThinkPHP5源码阅读-类的自动加载register与autoload的实现
PHP快速入门与实战ThinkPHP是国内最流行的一款PHP框架,是国人自主研发的框架,起源于2006年,经过了十几年的不断发展。已经成为了一款被PHP广泛认可的性能开发效率兼具的利器。阅读框架源码有助于我们更好的学习语言基础,拓展设计模式等相关能力。同时很多设计与编码的思想也能更好的指导我们日常工作,尤其是想成为资深程序员或者架构师方面的同事,这是一个必须要学习的过程。今天是ThinkPHP5源码第一讲,关于类的自动加载,看看源码底层是怎么实现的。怕迷路的同学,先给个关注吧。
|
9月前
.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
94 0
.Net6新版本的AssemblyLoadContext 加载程序集和卸载程序集
如何创建一个新的 Zend Framework 项目?具体步骤是怎样的?
如何创建一个新的 Zend Framework 项目?具体步骤是怎样的?
【ThinkPHP5.1】如何引用extend的类库
【ThinkPHP5.1】如何引用extend的类库
517 0
|
C# 图形学 C++
Unity与 DLL文件 ☀️| 怎样使用 C# 类库 生成一个DLL文件 并 调用!
📢前言 🎬生成DLL文件 🎥使用 C#类库 将Unity中的脚本打包成 DLL文件 并调用 🏳️‍🌈第一步:打开Visual Studio之后,新建一个项目 🏳️‍🌈第二步:选择类库(.NET Framework),改个名字,选择一个位置路径 🏳️‍🌈第三步:然后在创建的脚本中简单写一点代码,如下所示 🏳️‍🌈第四步:然后在解决方案资源管理器右键这个脚本 -> 添加 -> 引用 🏳️‍🌈第五步:然后点击浏览,找到Unity安装路径 -> Editor -> Data -> Managed 下的这两个DLL 文件,点击添加!
Unity与 DLL文件 ☀️| 怎样使用 C# 类库 生成一个DLL文件 并 调用!
|
SQL 架构师 Java
C#&.net系列之——C#如何动态加载调用C++动态链接库?非常简单!!!
今天介绍动态调用的方法。很多时候,Dll库的目录可能是变化的,或是有些场景,需要根据具体的情况,来动态加载这些Dll库。这样使用静态调用的方式就很不方便,C#中我们经常通过配置动态的调用托管Dll,那么是不是也可以这样动态调用C++动态链接呢? 只要通过LoadLibrary, GetProcess, FreeLibrary这几个函数是可以动态调用动态链接的(它们包含在kernel32.dll中)。
C#&.net系列之——C#如何动态加载调用C++动态链接库?非常简单!!!
|
PHP
手动添加第三方vendor类,laravel自动加载
手动添加第三方vendor类,laravel自动加载
1990 0
|
C#
【ABP杂烩】Extensions后缀扩展方法
原文:【ABP杂烩】Extensions后缀扩展方法 1.Extensions介绍 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
974 0