PHP网站制作之PHP定名空间划定规矩解析及初级功效
怎么样出来了吧,怎么样自己也可以写出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
< ?phpnamespace 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字符串,它老是前往以后定名空间的称号,在全局空间中它是一个空字符串。
< ?phpnamespace App\Lib1;echo __NAMESPACE__; // outputs: App\Lib1?>
这个值在调试时十分有效,它也可因为静态生成一个完整限制类名,如:
< ?phpnamespace 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定名空间:
< ?phpnamespace 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 functionfunction __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
< ?phpnamespace App\Lib1; class MyClass { public function WhoAmI() {return __METHOD__; }}?>
在根文件夹下的文件就利用上面的代码了:
myapp.php
< ?phpuse App\Lib1\MyClass as MC; $obj = new MC();echo $obj->WhoAmI(); // autoload functionfunction __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的定名空间有一个新的熟悉,并但愿你能在新项目中真正利用定名空间。
没有人会喜欢和见异思迁的人交朋友,因为这种人太不安分,太不可靠,因此,你必须要强迫自己完成自己的目标,哪怕可能会很难受,也得坚持,毅力就是这么锻炼出来的。 小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。 本文当是我的笔记啦,遇到的问题随时填充 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。 找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。 学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。 我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。 实践是检验自己会不会的真理。 不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。 建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。 首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。 最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。 小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。 其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。 最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
页:
[1]