php 5.3新特性介绍_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

php 5.3新特性介绍

作者:黑客防线网安PHP教程基地 来源:黑客防线网安PHP教程基地 浏览次数:0

本篇关键词:介绍特性CODE:定义
黑客防线网安网讯:  之前陆续介绍了php5.3的一些新特性,正好上周看到ZendCon关于5.3的ppt,介绍的更为详细,那么这里做个归总或者说翻译:)    Namespaces    php5.3最大的改动,毫无疑问就是Names...
  之前陆续介绍了php5.3的一些新特性正好上周看到ZendCon关于5.3的ppt介绍的更为详细,那么这里做个归总或者说翻译:)
  
  Namespaces
  
  php5.3最大的改动,毫无疑问就是Namespaces(此前有一篇相关的PHPNamespacesFAQ)这给php开发人员带来的好处不少,广为人们所诟病的函数命名问题也得到了解决
  
  代码更清晰
  
  5.3之前常见的代码,需要自定义前缀区分函数和类名
  
  PLAINTEXT
  
  CODE:
  
  functionMY_wrapper(){}
  
  classMY_DB{}
  
  define('MY_CONN_STR','');
  
  MY_wrapper();
  
  newMY_DB();
  
  MY_CONN_STR;
  
  使用名称空间之后,代码看上去更加clean。
  
  PLAINTEXT
  
  CODE:
  
  namespaceMY;
  
  functionwrapper(){}
  
  classDB{}
  
  constCONN_STR='';
  
  useMYASMY;
  
  wrapper();
  
  newDB();
  
  CONN_STR;
  
  一个文件中定义了多个namespace
  
  如果一个文件中定义了多个namespace,应该怎样处理?
  
  PLAINTEXT
  
  CODE:
  
  namespaceLIB;
  
  classMySQL{}
  
  classSQLite{}
  
  $b=newSQLite();
  
  namespaceLIB_EXTRA;
  
  classMScrypt{}
  
  $a=newMScrypt();
  
  var_dump(
  
  get_class($a),
  
  get_class($b)
  
  );
  
  以上代码输出为:
  
  PLAINTEXT
  
  CODE:
  
  string(18)"LIB_EXTRA::MScrypt"
  
  string(11)"LIB::SQLite"
  
  php是解释执行的语言,以上结果合情合理。
  
  namespace的优先级
  
  namespace中定义的函数,类和常量优先,其次才是全局的。
  
  PLAINTEXT
  
  CODE:
  
  namespacefoo;
  
  functionstrlen($foo){returnhtmlentities($foo);}
  
  echostrlen("test");//test
  
  echo::strlen("test");//4
  
  echonamespace::strlen("test");//test
  
  namespace和autoload的友情
  
  autoload会根据namespace名称以及class名称来解析类文件位置
  
  仅当namespace和全局范围都没找到class定义的情况下,autoload才会被触发
  
  在namespace中定义的__autoload不会被自动调用
  
  PLAINTEXT
  
  CODE:
  
  function__autoload($var){var_dump($var);}//LIB::foo
  
  require"./ns.php";/*
  
  <?php
  
  namespaceLIB;
  
  newfoo();
  
  */
  
  namespace一些辅料
  
  PLAINTEXT
  
  CODE:
  
  namespacereally::long::pointlessly::verbose::ns;
  
  __NAMESPACE__;//新增的魔法常量,表示当前namespace名称
  
  classa{}
  
  get_class(newa());//really::long::pointlessly::verbose::ns::a
  
  usereally::long::pointlessly::verbose::ns::aASb;//从名称空间中引用一个类
  
  注:这里的内容节选自pdfIntroductiontoPHP5.3Slides,后文不再复述。
  
  性能提升
  
  php5.3的总体性能提升了5-15%
  
  md5()快了10-15%
  
  Betterstackimplementationintheengine
  
  Constants移到read-only内存里
  
  exception处理过程改进(简化,opcodes更少)
  
  (require/include)_once改进,去掉重复open
  
  Smallerbinarysize&startupsizewithgcc4
  
  新语言特性
  
  __DIR__
  
  在5.3以前,为了获得当前脚本的目录,需要一次函数调用
  
  PLAINTEXT
  
  CODE:
  
  echodirname(__FILE__);//<PHP5.3
  
  在5.3,只需要一个魔术常量__DIR__就解决了。
  
  PLAINTEXT
  
  CODE:
  
  echo__DIR__;//>=PHP5.3
  
  ?:操作符
  
  便捷的?:操作符,可以从两个值/表达式中快速取得非空值。
  
  PLAINTEXT
  
  CODE:
  
  $a=true?:false;//true
  
  $a=false?:true;//true
  
  $a=""?:1;//1
  
  $a=0?:2;//2
  
  $a=array()?:array(1);//array(1);
  
  $a=strlen("")?:strlen("a");//1
  
  __callStatic()
  
  新增了魔术方法__callStatic,功能和__call类似,但是仅对static方法有效。
  
  PLAINTEXT
  
  CODE:
  
  classhelper{
  
  staticfunction__callStatic($name,$args){
  
  echo$name.'('.implode(',',$args).')';
  
  }
  
  }
  
  helper::test("foo","bar");//test(foo,bar)
  
  动态调用static方法
  
  动态的调用静态方法?动静结合。
  
  PLAINTEXT
  
  CODE:
  
  classhelper{
  
  staticfunctionfoo(){echo__METHOD__;}
  
  }
  
  $a="helper";
  
  $b="foo";
  
  $a::$b();//helper::foo
  
  LateStaticBinding
  
  不知道怎么译,可能留个原文更容易理解。静态方法的事件处理时机有变化,以前是在编译期处理,现在是执行期间处理。
  
  在php5.3之前,下面的代码会输出一个A,但是这不是咱们要的,whoami方法已经在classB中重新定义,它本该输出B才符合咱们想当然的思维。
  
  PLAINTEXT
  
  CODE:
  
  classA{
  
  publicstaticfunctionwhoami(){
  
  echo__CLASS__;
  
  }
  
  publicstaticfunctionidentity(){
  
  self::whoami();
  
  }
  
  }
  
  classBextendsA{
  
  publicstaticfunctionwhoami(){
  
  echo__CLASS__;
  
  }
  
  }
  
  B::identity();//A<--PHP<5.3
  
  下面代码中使用了static::whoami()来调用静态方法。php5.3之后,由于__CLASS__是在执行期被处理,那么这个例子中能顺利抓到classB。
  
  PLAINTEXT
  
  CODE:
  
  classA{
  
  publicstaticfunctionwhoami(){
  
  echo__CLASS__;
  
  }
  
  publicstaticfunctionidentity(){
  
  static::whoami();
  
  }
  
  }
  
  classBextendsA{
  
  publicstaticfunctionwhoami(){
  
  echo__CLASS__;
  
  }
  
  }
  
  B::identity();//B<-->=PHP5.3
  
  mysqlnd
  
  见mysqlnd成为php5.3中的默认mysql驱动
  
  但是PDO_MySQL暂时还不支持mysqlnd,目前只有mysql(i)扩展可以用到
  
  之前介绍的php5.3的新特性,都是方便开发人员的东东。下面介绍个很讨虚拟主机提供商喜欢的特性。
  
  增强的ini文件支持
  
  CGI/FastCGI支持类似.htaccess的INI配置
  
  每个目录下都可以有INI设置,ini的文件名取决于php.ini的配置,但是[PATH=/var/www/domain.com],[HOST=www.domain.com]段落的设置用户不能修改。
  
  增强的errorhandling
  
  允许在ini文件中定义变量和常量,可以在程序中直接调用。
  
  附上一段ini文件的例子
  
  PLAINTEXT
  
  CODE:
  
  #用户自定义的php.ini文件名(.htaccess).默认是".user.ini"
  
  user_ini.filename=".user.ini"
  
  #如果要禁用这个特性,设置为空值即可
  
  user_ini.filename=
  
  #用户自定义的php.ini文件TTL时长(time-to-live),单位为秒,我理解为缓存过期时间。默认为300秒
  
  user_ini.cache_ttl=300
  
  [PATH=/var/www/domain.com]
  
  variables_order=GPC
  
  safe_mode=1
  
  [myvariables]
  
  somevar=“1234”
  
  anothervar=${somevar};anothervar==somevar
  
  [iniarrays]
  
  foo[bar]=1
  
  foo[123]=2
  
  foo[]=3
  
  
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-17500-1.html
网站维护教程更新时间:2012-09-21 05:20:10  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer