|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
怎么样出来了吧,怎么样自己也可以写出php程序了,虽然离职业和专业的人还有很远,但是好的开始是成功的一半。这个时候改怎么做了呢。现在就是拿1本高手推荐的书,重头到尾读1遍,我说的这个读是自己看。日前宣布的PHP 5.3中,最主要的一个新特征就是定名空间的到场。本文引见了PHP定名空间的一些术语,其解析划定规矩,和一些初级功效的使用,但愿可以匡助读者在项目中真正利用定名空间。 在这里中咱们引见了PHP定名空间的用处和namespace关头字,在这篇文章中咱们将引见一下use号令的利用和PHP若何解析定名空间的名字的。
为了便于对照,我界说了两个几近一样的代码块,只要定名空间的名字分歧。
- < ?php
- // application library 1
- namespace App\Lib1;
- const MYCONST = 'App\Lib1\MYCONST';
- function MyFunction() {
- return __FUNCTION__;
- }
- class MyClass {
- static function WhoAmI() {
- eturn __METHOD__;
- }
- }
- ?>
lib2.php
- < ?php
- // application library 2
- namespace App\Lib2;
-
- const MYCONST = 'App\Lib2\MYCONST';
-
- function MyFunction() {
- return __FUNCTION__;
- }
-
- class MyClass {
- static function WhoAmI() {
- eturn __METHOD__;
- }
- }
- ?>
入手下手之前先要了解几个PHP定名空间相干术语。
◆完整限制称号(Fully-qualified name)
任何PHP代码都可以援用完整限制称号,它是一个以定名空间反斜线开首的标识符,如\App\Lib1\MYCONST,\App\Lib2\MyFunction( )等。
完整限制称号是没有任何歧义的,开首的反斜线和文件途径的感化有点相似,它暗示“根”全局空间,假如咱们在全局空间中完成了一个分歧的MyFunction( ),可使用\MyFunction( )从lib1.php或lib2.php挪用它。
完整限制称号对一次性函数挪用或对象初始化十分有效,但当你发生了大批的挪用时它们就没有适用价值了,鄙人面的会商中咱们将会看到,PHP供应了其它选项以消除咱们为定名空间打字的懊恼。
◆限制称号(Qualified name)
最少有一个定名空间分隔符的标识符,如Lib1\MyFunction( )。
◆非限制称号(Unqualified name)
没有定名空间分隔符的标识符,如MyFunction( )。
在不异的定名空间内任务
细心思虑上面的代码:
myapp1.php
- < ?php namespace App\Lib1; require_once('lib1.php'); require_once('lib2.php'); header('Content-type: text/plain'); echo MYCONST . "\n"; echo MyFunction() . "\n"; echo MyClass::WhoAmI() . "\n"; ?>
复制代码
即便咱们同时包含了lib1.php和lib2.php,MYCONST,MyFunction和MyClass标识符只能在lib1.php中援用,这是由于myapp1.php的代码在不异的App\Lib1定名空间内。
履行了局:
- App\Lib1\MYCONST
- App\Lib1\MyFunction
- App\Lib1\MyClass::WhoAmI
定名空间导入
可使用use操作符导入定名空间,如:
myapp2.php
- < ?php
- use App\Lib2;
-
- require_once('lib1.php');
- require_once('lib2.php');
-
- header('Content-type: text/plain');
- echo Lib2\MYCONST . "\n";
- echo Lib2\MyFunction() . "\n";
- echo Lib2\MyClass::WhoAmI() . "\n";
- ?>
可以界说恣意数目的use语句,或利用逗号分隔成自力的定名空间,在这个例子中咱们导入了App\Lib2定名空间,但咱们依然不克不及直接援用 MYCONST,MyFunction和MyClass,由于咱们的代码还在全局空间中,但假如咱们添加了“Lib2\”前缀,它们就酿成限制称号 了,PHP将会搜刮导入的定名空间,直到找到婚配项。
履行了局:
- App\Lib2\MYCONST
- App\Lib2\MyFunction
- App\Lib2\MyClass::WhoAmI
定名空间别号
定名空间别号多是最有效的构思了,别号答应咱们利用较短的称号援用很长的定名空间。
myapp3.php
- < ?php
- use App\Lib1 as L;
- use App\Lib2\MyClass as Obj;
-
- header('Content-type: text/plain');
- require_once('lib1.php');
- require_once('lib2.php');
-
- echo L\MYCONST . "\n";
- echo L\MyFunction() . "\n";
- echo L\MyClass::WhoAmI() . "\n";
- echo Obj::WhoAmI() . "\n";
- ?>
第一个use语句将App\Lib1界说为“L”,任何利用“L”的限制称号在编译时城市被翻译成“App\Lib1”,因而咱们就能够援用L\MYCONST和L\MyFunction而不是完整限制称号了。
第二个use语句界说了“obj”作为App\Lib2\定名空间中MyClass类的别号,这类体例只合适于类,不克不及用于常量和函数,如今咱们就能够利用new Obj( )或象下面那样运转静态办法了。
履行了局:
- App\Lib1\MYCONST
- App\Lib1\MyFunction
- App\Lib1\MyClass::WhoAmI
- App\Lib2\MyClass::WhoAmI
PHP定名解析划定规矩
PHP标识符称号利用以下定名空间划定规矩停止解析,请参考PHP用户手册懂得更具体的信息:
1.在编译时挪用完整限制函数、类或常量;
2.非限制称号和限制称号依据导入划定规矩停止翻译,例如,假如A\B\C导入为C,挪用C\D\e( )就会被翻译成A\B\C\D\e( );
3.在PHP定名空间内,一切限制称号还没有依据导入划定规矩转换,例如,假如在定名空间A\B中挪用C\D\e( ),那末会被翻译成A\B\C\D\e( );
4.非限制类称号依据以后的导入划定规矩停止转换,利用全名交换导入的短称号,例如,假如类C在定名空间A\B中被导入为X,那末new X( )就会被翻译为new A\B\C( );
5.在定名空间中非限制函数挪用在运转时解析,例如,假如MyFunction( )在定名空间A\B中被挪用,PHP起首会查找函数\A\B\MyFunction( ),假如没有找到,然后会在全局空间中查找\MyFunction( );
6.挪用非限制或限制类名在运转时被解析,例如,假如咱们在定名空间A\B中挪用new C( ),PHP将会查找类A\B\C,假如没有找到,PHP会测验考试主动载入A\B\C。
PHP定名空间初级特征
接上去让咱们看一看PHP定名空间的一些初级特征。
__NAMESPACE__常量
__NAMESPACE__是一个PHP字符串,它老是前往以后定名空间的称号,在全局空间中它是一个空字符串。
- < ?php namespace App\Lib1; echo __NAMESPACE__; // outputs: App\Lib1 ?>
复制代码
这个值在调试时十分有效,它也可因为静态生成一个完整限制类名,如:
- < ?php namespace App\Lib1; class MyClass { public function WhoAmI() { return __METHOD__; } } $c = __NAMESPACE__ . '\\MyClass'; $m = new $c; echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI ?>
复制代码
namespace关头字
namespace关头字可以用于明白援用一个以后定名空间或子定名空间中的项目,它等价于类中的self定名空间:
- < ?php namespace App\Lib1; class MyClass { public function WhoAmI() { return __METHOD__; } } $m = new namespace\MyClass; echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI ?>
复制代码
主动载入定名空间类
PHP 5中最省时省力的特征是主动载入,在全局(横死名空间)PHP代码中,可以写一个尺度主动载入函数:
- < ?php $obj= new MyClass1(); // classes/MyClass1.php is auto-loaded $obj= new MyClass2(); // classes/MyClass2.php is auto-loaded // autoload function function __autoload($class_name) { require_once("classes/$class_name.php"); } ?>
复制代码
在PHP 5.3中,你可以创立一个定名空间类的实例,在这类情形下,完整限制定名空间和类名传递给__autoload函数,例如,$class_name的值可 能是App\Lib1\MyClass。你可以在不异的文件夹下放置一切的PHP类文件,从字符串中提取定名空间,但那样会招致文件名抵触。
别的,你的类文件条理布局会依照定名空间的布局从头组织,例如,MyClass.php文件可以创立在/classes/App/Lib1文件夹下:
/classes/App/Lib1/MyClass.php
- < ?php namespace App\Lib1; class MyClass { public function WhoAmI() { return __METHOD__; } } ?>
复制代码
在根文件夹下的文件就利用上面的代码了:
myapp.php
- < ?php use App\Lib1\MyClass as MC; $obj = new MC(); echo $obj->WhoAmI(); // autoload function function __autoload($class) { // convert namespace to full file path $class = 'classes/' . str_replace('\\', '/', $class) . '.php'; require_once($class); } ?>
复制代码
注释:
1.类App\Lib1\MyClass的别号是MC;
2. new MC( )在编译时被翻译成new App\Lib1\MyClass( );
3.字符串App\Lib1\MyClass被传递给__autoload函数,利用文件途径正斜线交换一切定名空间中的反斜线,然后修正字符串,classes\App\Lib1\MyClass.php文件被主动载入;
总结
有关PHP定名空间的利用就引见到这里,但愿您可以对PHP的定名空间有一个新的熟悉,并但愿你能在新项目中真正利用定名空间。
没有人会喜欢和见异思迁的人交朋友,因为这种人太不安分,太不可靠,因此,你必须要强迫自己完成自己的目标,哪怕可能会很难受,也得坚持,毅力就是这么锻炼出来的。 |
|