设为首页 收藏本站
查看: 933|回复: 0

[经验分享] [连载] PHP 5.3.0 alpha3 中的名字空间(namespace)改进 (一)

[复制链接]

尚未签到

发表于 2017-4-12 12:56:57 | 显示全部楼层 |阅读模式
  
近日,PHP官方已将拥有众多新特性的PHP5.3放到A3版本. 在更新日志中强调了这一版本的名字空间部份变化较大.
  正好前段时间我开发的工业快捷框架SmartYU用到了5.3 A2中的不少特性,其中就包括了名字空间.所以将两者做了一些比较.
  发现不得不对之前的名字空间部份全部推翻重写 :( (看来在发行版本未稳定之前,最好还是不要轻易尝试用其做项目).
  首先说定义.
创建一个名字空间,都是通过在文件头部 使用namespace保留关键字定义.
A2版的定义方式是 namespaces SYU::Kernel::Module 的形式
A3版的定义方式是 namespaces SYU\Kernel\Module 的形式

相较而言,A2版的子空间分隔符是 :: 比A3的 \ 多一个字符,另外在使用类静态方法时会跟静态方法的操作符:: 相同,容易引起一些不必要的麻烦.
比如 SYU::DB::Connect( ) 的形式,时常会让人分不清到底该是调用SYU::DB类的Connect( )方法,还是该调用SYU::DB::Connect类的构造函数.

A3使用 \ 符 类似于win下的路径分隔符,好处就是__autoload自动载入的时候 :-) .但不好的地方在于如果名字空间出现在字符串中,须注意转义. 一会儿两根斜线,一会儿用一根斜线.感觉还是有些混乱.

一但定义了名字空间.自定义以下的部份,函数,类,都属于此名字空间



  • <?php
  • namespacetest;
  • functionstrlen(){return"i'mhere!";};//跟php自带的strlen同名.但不会报错,因为实际访问名字空间是\test\strlen
  • classpdo{};//跟php扩展里的pdo类同名.但不会报复重定义类错误,因为实际访问名字空间是\test\pdo
  • echostrlen();//调用名字空间内的函数.
  • echo\strlen(strlen());//调用全局空间,直接加\符

  • ?>

  定义名字空间时,需要注意的地方是 namespace定义必须在脚本文件的顶部声明(同一脚本文件可以申明多个名字空间,但第一个申明必须在脚本文件的头部,)
例如

唯一能在namespace前的例外是控制结构中的declare和不起任何作用的原子语句


  • <?php
  • declare(encoding='GB2312');
  • namespacetest;
  • ?>
  • <?php
  • 1;
  • namespacetest;
  • ?>


  其次,A3增加了名字空间内的const ,这在A2版中是没有的.

  • <?php
  • namespacetest\sayhello;
  • constt='hello';
  • ........
  • ?>

  那么在其它的程序里可以使用 echo \test\sayhello\t 这样的方式来显示 t的值.结果将打印出 hello
这跟类中的const定义是差不多的..

再者,A2版中,同一脚本文件只能定义一次名字空间,而从A3开始,允许在同一个PHP脚本文件内,定义多个名字空间,
定义的方法有好种:
1是简单定义

  • <?php
  • namespacen1;
  • constn1_const=1;
  • functiontest(){echo"n1";}

  • namespacen2;
  • constn2_const=1;
  • functiontest(){echo"n2";}

  • \n1\test();
  • \n2\test();
  • ?>



  2是花括号界定

  • <?php
  • //定义n1名字空间,注意,使用花括号后,定义语句不再带;号
  • namespacen1
  • {
  • constn1_const=1;
  • functiontest(){echo"n1";}
  • }
  • namespacen2
  • {
  • constn2_const=1;
  • functiontest(){echo"n2";}
  • Functionstrlen(){}//在n2空间里,这样定义不会报错,跟全局空间的strlen不冲突
  • }
  • //如果namespace没有指定名字,则视为全局global空间
  • namespace
  • {
  • \n1\test();
  • \n2\test();
  • //Functionstrlen(){}在全局空间里,这样定义就会报错.跟全局空间的strlen函数重复定义.
  • }
  • ?>


  着重注意的一点时.一但一个脚本文件被定义了名定空间,那么不允许有任何代码是在名字空间之外.
除了在第一部份讲的declare结构,连空格都不允许.
如果用的第一种简单定义法.没有花括号界定.那么最后一个namespace定义将一直延伸到整个脚本文件结束.
但如果用花括号界定名字空间.则千万要注意在PHP结束(而不是整个脚本文件结束)的后面.不能再有其它东西.
比如下例就是错误的演示

  • <?php
  • namespacetest
  • {
  • //dosth...
  • }
  • ?><spaces>


  未完待续........
  本文章由syu于csdn首发
  QQ:19179816
  MSN:peteryu@live.cn
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-363999-1-1.html 上篇帖子: 用x-sendfile解决discuz+php-cgi下的lighttpd内存占用暴增的问题 下篇帖子: 新Eclipse插件为Java 、PHP应用添加云托管功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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