仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 770|回复: 18
打印 上一主题 下一主题

[学习教程] PHP网站制作之PHP定名空间划定规矩解析及初级功效

[复制链接]
飘飘悠悠 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:44:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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
  1. < ?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字符串,它老是前往以后定名空间的称号,在全局空间中它是一个空字符串。
  1. < ?php  namespace App\Lib1;  echo __NAMESPACE__; // outputs: App\Lib1  ?>   
复制代码

这个值在调试时十分有效,它也可因为静态生成一个完整限制类名,如:
  1. < ?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定名空间:
  1. < ?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代码中,可以写一个尺度主动载入函数:
  1. < ?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
  1. < ?php  namespace App\Lib1;   class MyClass {   public function WhoAmI() {  return __METHOD__;   }  }  ?>  
复制代码

在根文件夹下的文件就利用上面的代码了:
myapp.php
  1. < ?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的定名空间有一个新的熟悉,并但愿你能在新项目中真正利用定名空间。

没有人会喜欢和见异思迁的人交朋友,因为这种人太不安分,太不可靠,因此,你必须要强迫自己完成自己的目标,哪怕可能会很难受,也得坚持,毅力就是这么锻炼出来的。
蒙在股里 该用户已被删除
沙发
发表于 2015-2-4 06:27:46 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
小女巫 该用户已被删除
板凳
发表于 2015-2-9 17:38:39 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
冷月葬花魂 该用户已被删除
地板
发表于 2015-2-26 19:06:41 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
飘灵儿 该用户已被删除
5#
发表于 2015-2-26 20:34:05 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
活着的死人 该用户已被删除
6#
发表于 2015-3-1 10:31:33 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
谁可相欹 该用户已被删除
7#
发表于 2015-3-1 20:52:44 | 只看该作者
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
小妖女 该用户已被删除
8#
发表于 2015-3-10 23:28:57 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
若天明 该用户已被删除
9#
发表于 2015-3-16 11:22:56 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
10#
发表于 2015-3-22 22:12:34 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
金色的骷髅 该用户已被删除
11#
发表于 2015-4-3 15:24:08 | 只看该作者
我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。
因胸联盟 该用户已被删除
12#
发表于 2015-4-5 11:17:42 | 只看该作者
实践是检验自己会不会的真理。
admin 该用户已被删除
13#
发表于 2015-4-12 14:42:35 | 只看该作者
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
老尸 该用户已被删除
14#
发表于 2015-4-26 15:21:22 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
第二个灵魂 该用户已被删除
15#
发表于 2015-5-3 02:26:52 | 只看该作者
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
只想知道 该用户已被删除
16#
发表于 2015-6-23 02:56:34 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
海妖 该用户已被删除
17#
发表于 2015-6-24 16:43:06 | 只看该作者
小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
深爱那片海 该用户已被删除
18#
发表于 2015-6-27 03:14:06 | 只看该作者
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
不帅 该用户已被删除
19#
发表于 2015-6-27 21:35:12 | 只看该作者
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-14 13:50

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表