- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Zend Framework教程之Loader以及PluginLoader用法详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例分析了Zend Framework中Loader以及PluginLoader用法。分享给大家供大家参考,具体如下:
Zend Framework提供了Zend_Loader,用来动态加载文件.
以下是具体用法,以及具体实现:
1.加载文件 。
使用方法:
1
|
Zend_Loader::loadFile(
$filename
,
$dirs
=null,
$once
=false);
|
具体实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
/**
* Loads a PHP file. This is a wrapper for PHP's include() function.
*
* $filename must be the complete filename, including any
* extension such as ".php". Note that a security check is performed that
* does not permit extended characters in the filename. This method is
* intended for loading Zend Framework files.
*
* If $dirs is a string or an array, it will search the directories
* in the order supplied, and attempt to load the first matching file.
*
* If the file was not found in the $dirs, or if no $dirs were specified,
* it will attempt to load it from PHP's include_path.
*
* If $once is TRUE, it will use include_once() instead of include().
*
* @param string $filename
* @param string|array $dirs - OPTIONAL either a path or array of paths
* to search.
* @param boolean $once
* @return boolean
* @throws Zend_Exception
*/
public
static
function
loadFile(
$filename
,
$dirs
= null,
$once
= false)
{
self::_securityCheck(
$filename
);
/**
* Search in provided directories, as well as include_path
*/
$incPath
= false;
if
(!
empty
(
$dirs
) && (
is_array
(
$dirs
) ||
is_string
(
$dirs
))) {
if
(
is_array
(
$dirs
)) {
$dirs
= implode(PATH_SEPARATOR,
$dirs
);
}
$incPath
= get_include_path();
set_include_path(
$dirs
. PATH_SEPARATOR .
$incPath
);
}
/**
* Try finding for the plain filename in the include_path.
*/
if
(
$once
) {
include_once
$filename
;
}
else
{
include
$filename
;
}
/**
* If searching in directories, reset include_path
*/
if
(
$incPath
) {
set_include_path(
$incPath
);
}
return
true;
}
|
参数规则:
正如实现方法,有如下参数 。
$filename参数指定需要加载的文件,注意$filename不需要指定任何路径,只需要文件名即可。ZF会对文件作安全性检查。$filename 只能由字母,数字,连接符-,下划线_及英文句号.组成(半角)。$dirs参数则不限,可以使用中文等.
$dirs 参数用来指定文件所在目录,可以是一个字符串或者数组。如果为 NULL,则程序将会到系统的 include_path 下寻找文件是否存在(include_path可在php.ini中设置--Haohappy注),如果是字符串或数组,则会到指定的目录下去找,然后才是 include_path.
$once 参数为布尔类型,如果为 TRUE,Zend_Loader::loadFile() 使用 PHP 函数 » include_once() 加载文件,否则就是 PHP 函数 » include()。(本参数只能是true或false,两者区别就和include()和include_once()的区别一样。) 。
2.加载类 。
具体使用:
1
2
3
4
5
6
|
Zend_Loader::loadClass(
'Container_Tree'
,
array
(
'/home/production/mylib'
,
'/home/production/myapp'
)
);
|
具体实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
/**
* Loads a class from a PHP file. The filename must be formatted
* as "$class.php".
*
* If $dirs is a string or an array, it will search the directories
* in the order supplied, and attempt to load the first matching file.
*
* If $dirs is null, it will split the class name at underscores to
* generate a path hierarchy (e.g., "Zend_Example_Class" will map
* to "Zend/Example/Class.php").
*
* If the file was not found in the $dirs, or if no $dirs were specified,
* it will attempt to load it from PHP's include_path.
*
* @param string $class - The full class name of a Zend component.
* @param string|array $dirs - OPTIONAL Either a path or an array of paths
* to search.
* @return void
* @throws Zend_Exception
*/
public
static
function
loadClass(
$class
,
$dirs
= null)
{
if
(
class_exists
(
$class
, false) ||
interface_exists
(
$class
, false)) {
return
;
}
if
((null !==
$dirs
) && !
is_string
(
$dirs
) && !
is_array
(
$dirs
)) {
require_once
'Zend/Exception.php'
;
throw
new
Zend_Exception(
'Directory argument must be a string or an array'
);
}
// Autodiscover the path from the class name
// Implementation is PHP namespace-aware, and based on
// Framework Interop Group reference implementation:
// http://groups.google.com/group/php-standards/web/psr-0-final-proposal
$className
= ltrim(
$class
,
'\\'
);
$file
=
''
;
$namespace
=
''
;
if
(
$lastNsPos
=
strripos
(
$className
,
'\\'
)) {
$namespace
=
substr
(
$className
, 0,
$lastNsPos
);
$className
=
substr
(
$className
,
$lastNsPos
+ 1);
$file
=
str_replace
(
'\\'
, DIRECTORY_SEPARATOR,
$namespace
) . DIRECTORY_SEPARATOR;
}
$file
.=
str_replace
(
'_'
, DIRECTORY_SEPARATOR,
$className
) .
'.php'
;
if
(!
empty
(
$dirs
)) {
// use the autodiscovered path
$dirPath
= dirname(
$file
);
if
(
is_string
(
$dirs
)) {
$dirs
=
explode
(PATH_SEPARATOR,
$dirs
);
}
foreach
(
$dirs
as
$key
=>
$dir
) {
if
(
$dir
==
'.'
) {
$dirs
[
$key
] =
$dirPath
;
}
else
{
$dir
= rtrim(
$dir
,
'\\/'
);
$dirs
[
$key
] =
$dir
. DIRECTORY_SEPARATOR .
$dirPath
;
}
}
$file
=
basename
(
$file
);
self::loadFile(
$file
,
$dirs
, true);
}
else
{
self::loadFile(
$file
, null, true);
}
if
(!
class_exists
(
$class
, false) && !
interface_exists
(
$class
, false)) {
require_once
'Zend/Exception.php'
;
throw
new
Zend_Exception(
"File \"$file\" does not exist or class \"$class\" was not found in the file"
);
}
}
|
$class 类名将会根据下划线(作为目录分隔线)对应到相应目录下的PHP文件,并加上'.php',比如Container_Tree会指向Container\\Tree.php。 $dir 可以是数组或者字符串。目录是除去类名包含的目录的路径.
3.判断某个文件是否可读 。
具体使用:
1
2
3
|
if
(Zend_Loader::isReadable(
$filename
)) {
// do something with $filename
}
|
具体实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
/**
* Returns TRUE if the $filename is readable, or FALSE otherwise.
* This function uses the PHP include_path, where PHP's is_readable()
* does not.
*
* Note from ZF-2900:
* If you use custom error handler, please check whether return value
* from error_reporting() is zero or not.
* At mark of fopen() can not suppress warning if the handler is used.
*
* @param string $filename
* @return boolean
*/
public
static
function
isReadable(
$filename
)
{
if
(
is_readable
(
$filename
)) {
// Return early if the filename is readable without needing the
// include_path
return
true;
}
if
(
strtoupper
(
substr
(PHP_OS, 0, 3)) ==
'WIN'
&& preg_match(
'/^[a-z]:/i'
,
$filename
)
) {
// If on windows, and path provided is clearly an absolute path,
// return false immediately
return
false;
}
foreach
(self::explodeIncludePath()
as
$path
) {
if
(
$path
==
'.'
) {
if
(
is_readable
(
$filename
)) {
return
true;
}
continue
;
}
$file
=
$path
.
'/'
.
$filename
;
if
(
is_readable
(
$file
)) {
return
true;
}
}
return
false;
}
|
具体参数:
$filename参数指定了要检查的文件名,包括路径信息。这个方法是将 PHP 函数» is_readable()封装而成的,is_readable() 不会自动查找 include_path 下的文件,而 Zend::isReadable() 可以.
4.Autoloader 。
这个类的Autoloader功能已经不推荐使用了,所以不再讲述。还有其他的Autoloader,以后具体说明.
5.插件加载器 。
帮助文章给出的具体实例如下,可参考使用:
很多 Zend Framework 组件支持插件,允许通过指定类的前缀和到类的文件(不需要在 include_path或不需要遵循传统命名约定的文件)的路径动态加载函数。Zend_Loader_PluginLoader 提供了普通的函数来完成这个工作.
PluginLoader 的基本用法遵循 Zend Framework 的命名约定(一个文件一个类),解析路径时,使用下划线作为路径分隔符。当决定是否加载特别的插件类,允许传递可选的类前缀来预处理。另外,路径按 LIFO 顺序来搜索。由于 LIFO 搜索和类的前缀,允许命名空间给插件,这样可以从早期注册的路径来覆盖插件.
基本用例 。
首先,假定下面的目录结构和类文件,并且根(toplevel)目录和库目录在 include_path 中:
application/ modules/ foo/ views/ helpers/ FormLabel.php FormSubmit.php bar/ views/ helpers/ FormSubmit.php library/ Zend/ View/ Helper/ FormLabel.php FormSubmit.php FormText.php 。
现在,创建一个插件加载器来使各种各样的视图助手仓库可用:
1
2
3
4
5
6
|
<?php
$loader
=
new
Zend_Loader_PluginLoader();
$loader
->addPrefixPath(
'Zend_View_Helper'
,
'Zend/View/Helper/'
)
->addPrefixPath(
'Foo_View_Helper'
,
'application/modules/foo/views/helpers'
)
->addPrefixPath(
'Bar_View_Helper'
,
'application/modules/bar/views/helpers'
);
?>
|
接着用类名中添加路径时定义的前缀后面的部分来加载一个给定的视图助手:
1
2
3
4
5
6
7
8
|
<?php
// load 'FormText' helper:
$formTextClass
=
$loader
->load(
'FormText'
);
// 'Zend_View_Helper_FormText';
// load 'FormLabel' helper:
$formLabelClass
=
$loader
->load(
'FormLabel'
);
// 'Foo_View_Helper_FormLabel'
// load 'FormSubmit' helper:
$formSubmitClass
=
$loader
->load(
'FormSubmit'
);
// 'Bar_View_Helper_FormSubmit'
?>
|
类加载后,就可以实例化了.
Note: 为一个前缀注册多个路径 。
有时候,多个路径使用相同的前缀,Zend_Loader_PluginLoader 实际上为每个给定的前缀注册一个路径数组;最后注册的被首先检查,当你使用孵化器里的组件时,这相当有用.
Note: 实例化时定义路径 。
你可以提供给构造器一个可选的“前缀/路径”对(或“前缀/多个路径”)数组参数:
1
2
3
4
5
6
7
|
<?php
$loader
=
new
Zend_Loader_PluginLoader(
array
(
'Zend_View_Helper'
=>
'Zend/View/Helper/'
,
'Foo_View_Helper'
=>
'application/modules/foo/views/helpers'
,
'Bar_View_Helper'
=>
'application/modules/bar/views/helpers'
));
?>
|
Zend_Loader_PluginLoader 在不需要使用单态实例的情况下,也可选地允许共享插件,这是通过静态注册表来完成的,在实例化时需要注册表名作为构造器的第二个参数:
1
2
3
4
|
<?php
// Store plugins in static registry 'foobar':
$loader
=
new
Zend_Loader_PluginLoader(
array
(),
'foobar'
);
?>
|
其它使用同名注册表来实例化 PluginLoader 的组件将可以访问已经加载的路径和插件.
处理插件路径 。
上节的例子示例如何给插件加载器添加路径,那么如何确定已经加载的路径或删除他们呢?
如果没有提供 $prefix,getPaths($prefix = null) 以“前缀/路径”对返回所有的路径;或者如果提供了 $prefix,getPaths($prefix = null) 返回为给定的前缀注册的路径.
clearPaths($prefix = null) 将缺省地清除所有的已注册路径,或者如果提供了 $prefix 并放在堆栈里,只清除和那些和给定前缀关联的路径.
removePrefixPath($prefix, $path = null) 允许有选择地清除和给定前缀相关的特定的路径。如果没有提供 $path ,所有的和前缀相关的路径被清除,如果提供了 $path 并且相应的前缀存在,只有这个相关的路径被清除。 测试插件和获取类的名字 。
有时候你想确定在执行一个动作之前是否插件类已经加载,isLoaded() 返回插件名的状态.
PluginLoader 的另一个普通用例是确定已加载类的完全合格的插件类名,getClassName() 提供该功能。一般地,这个和 isLoaded() 联合使用:
1
2
3
4
5
6
|
<?php
if
(
$loader
->isLoaded(
'Adapter'
)) {
$class
=
$loader
->getClassName(
'Adapter'
);
$adapter
= call_user_func(
array
(
$class
,
'getInstance'
));
}
?>
|
具体插件加载器的实现可以参考Zend_Loader_PluginLoader和Zend_Loader。这里不在累述.
希望本文所述对大家PHP程序设计有所帮助.
最后此篇关于Zend Framework教程之Loader以及PluginLoader用法详解的文章就讲到这里了,如果你想了解更多关于Zend Framework教程之Loader以及PluginLoader用法详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
最近我在用 RestSharp消耗我的 Restful 资源。并期望在服务器和客户端之间与 JSon 交换数据。下面是我的 C# 代码。 var client = new RestSharp.Rest
我正在阅读 Bartosz Milewski 的一篇文章,其中他定义了以下函数: instance Applicative Chan where pure x = Chan (repeat x)
‘…' 其实是go的一种语法糖。 它的第一个用法主要是用于函数有多个不定参数的情况,可以接受多个不确定数量的参数。 第二个用法是slice可以被打散进行传递。 实例:
前言 在算face_track_id map有感: 开始验证 data={"state":[1,1,2,2,1,2,2,2],"pop":[&quo
本文实例讲述了php访问数组最后一个元素的函数end()用法。分享给大家供大家参考。具体分析如下: end()函数在PHP中用于检索数组中的最后一个元素。end()函数需要一个数组作为其唯一参数,
我使用的是 jdk1.8.0_92。我的虚拟机如下所示。 $java -version java version "1.8.0_92" Java(TM) SE Runtime Environment
我的情况是我需要将所有匹配 http://mywebsite.com/portfolio/[anyname] 的请求定向到 http://mywebsite.com/portfolio.php?用户名
我正在尝试在 NLTK 中使用语音标记并使用了以下命令: >>> text = nltk.word_tokenize("And now for something completely differe
#include typedef QList IntList; qRegisterMetaType("IntList"); error C2909: 'qRegisterMetaType':
来自 here我知道 BN_CTX 是一个保存 BIGNUM 临时变量的结构。这些 BIGNUM 变量什么时候会进入 BN_CTX 的 BN_POOL?如果我有一个 bignum_ctx BN_CTX
尝试为 ABPersonRef 创建对象例子:ABpersonRef 引用; 已包含Addressbook和AddressBookUI框架即使这样,当我编译时,它仍显示“ABPersonRef”未声明
我无法使用 GetAltTabInfo。可能是一个愚蠢的错误,但这有什么问题呢? HWND taskSwitcher = FindWindow(L"TaskSwitcherWnd", L"Task S
JSLint4Java 是 JSLint 的 Java 包装器。我需要这样的东西在我的 GWT 项目中使用,但使用 JSLint4Java 的唯一方法似乎是从命令行或通过 ANT 任务。有谁知道是否有
我有一个持久化实体对象的方法 persistData() 。我有另一个方法 findData() ,它对同一实体类执行 find() 操作以获取持久的主键值。当我在实体类的@PostPersist中调
下面是我的代码。请查看。 1. bool isUnavailable = db.Deploys.Where(p => p.HostEnvironmentId == Guid.Parse(h
这个问题已经有答案了: Why can't a Generic Type Parameter have a lower bound in Java? (6 个回答) 已关闭 9 年前。 我试图理解为什
我正在尝试使用 scala 编译器 Y 警告,但我认为我做得不对。在下面的示例中,nums 未使用,因此我希望 -Ywarn-value-discard 打印一个警告。有两个 if 条件,一个嵌套在另
用户被要求从某个给定的集合中选择一个 ID。我检查该 ID 是否存在于我的集合中,如果不存在,我会抛出 IndexOutOfBoundsException 并稍后捕获它。我实际上可以使用该异常来达到这
我正在尝试减少从 OSM 路径数据生成的形状文件。我正在使用 VTS 的 DouglasPeuckerSimplifier 实现。我想为特定 GTFS(通用交通提要规范)构建路线图的 geojson。
我明白了?!是排除某个模式,例如 a(?!b) 表示如果“a”后面没有“b”,它将匹配“a”。我的问题是,假设我有一个包含以下内容的文件: a cat is a cat, a dog is a dog
我是一名优秀的程序员,十分优秀!