博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zend Framework 自动加载类的实现方法
阅读量:5828 次
发布时间:2019-06-18

本文共 3483 字,大约阅读时间需要 11 分钟。

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

第一种如下:

方法很简单,举例说明。比如想要在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中需要加文件夹,那么相应的类名也要有更改。举例:

在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已经包含了。

那么这些类名也要按约定加上命名空间前缀,在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_这样的类。

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

那现在的目标是能够自动加载没有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,如需转载请自行联系原作者

你可能感兴趣的文章
C++中STRING转为INT (转)
查看>>
ASP.NET上传多个文件
查看>>
学习:UTF-8和GBK的区别
查看>>
Shape parameter 形状参数
查看>>
【求助】小系统组成大系统所遇到的问题
查看>>
js 中英文字符串长度
查看>>
让xp系统(win2003系统)支持搜索文件内容
查看>>
使用ServiceStack构建Web服务
查看>>
[Everyday Mathematics]20150123
查看>>
阿里云客户服务部总经理张颖杰:用心聆听,服务见智
查看>>
(转) Deep Reinforcement Learning: Playing a Racing Game
查看>>
2016年中国最具幸福感城市评选出炉
查看>>
阿里云服务器怎么去掉tomcat的8080端口
查看>>
50.2. Compiling mod_caucho.so
查看>>
入会申请书参考
查看>>
rbac 概念
查看>>
iOS开发网络篇—网络编程基础
查看>>
同一WM仓位下不停工厂301转储不产生传输申请TR和传输订单TO
查看>>
SAP S/4 HANA新变化-主数据:物料主数据
查看>>
House Robber
查看>>