PHP 5.4正式版重要新特性

PHP一直是在Web开发领域中十分重要而快捷方便的开发语言,深受广大开发人员的青睐。现在PHP 5.4的正式版本已经发布,其中增加了大量新的特性,官方声称性能提高20%,并且占用更少的资源。在本文中,我将带领大家学习PHP 5.4的一些新的特性。
  在PHP 5.4中,首先是修复了多达100多处的bug,并且在内存及性能优化上做的更好了,而且去掉了一些之前版本的方法,比如register_globals,magic_quotes,safe_mode等,而且要注意的是,PHP 5.4中,默认的编码方式已经改变为了,这很有利于开发者开发多语言的版本应用。
  Traits介绍
  首先来介绍下PHP 5.4中新加入的功能Traits。其实该功能在其他语言中也见到其踪影,这里可以简单理解为一系列的方法的集合,在组织结构上跟类有点象(但不能象类那样实例化),能让开发者可以在不同的类中重用这组方法。由于php是单继承的语言,所以一个类中是不能同时继承多个类的。这个时候,Traits就派上用场了。
  Traits是一个方案集合,它不属于任何实际类。用户没法创建Trait实例或直接调用Trait中的方法,相反,用户必须将Traits合并到实际的类当中方能使用它们。在优先级方面,Trait方法会覆盖继承而来的同名方法,而当前合并类中的同名方法则会覆盖Trait方法。
  下面举个例子来说明Traits的用途。假设我们正在构建的网站中,需要同时调用Facebook和Twitter的API,而在这两个API的调用过程中,都需要调用curl方法进行一系列的操作,获得两者API接口返回的内容,为了不在这两个类中重复编写相同的方法,可以使用php 5.4中的Traits实现,如下代码所示:
  /** cURL wrapper trait */
  trait cURL
  public function curl($url)
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec($ch);
  curl_close($ch);
  return $output;
  /** Twitter API 类 */
  class Twitter_API
  use cURL; //调用Traits
  public function get($url)
  return json_decode($this->curl("http://api.twitter.com/".$url));
  /** Facebook API 类 */
  class Facebook_API
  use cURL; //调用Traits
  public function get($url)
  return json_decode($this->curl("http://www.owjee.com/".$url));
  $facebook = new Facebook_API();
  echo $facebook->get("name; //这里会调用API输出该facebook的用户名
  /** 演示php 5.4中的新特性 */
  echo (new Facebook_API)->get("name;
  $foo = "get";
  echo (new Facebook_API)->$foo("name;
  echo (new Twitter_API)->get("name;
  在上面的代码中,首先通过关键字trait定义了一个功能集合,其名称为Curl,其中包含一个方法名为curl,该方法中是根据url的参数值,调用php内置的cur方法返回该url对应的页面输出内容。然后在Twitter_API类和Facebook_API
  类中,分别使用use cURL去调用了这个Traits,并且在各自的get方法中,都调用了Traits中的的curl方法。
  注意在上面的代码中,我们除了用new Facebook_API()来生成facebook对象的实例外,还演示了使用php 5.4中新的特性,即:
  可以在实例化时访问类成员,即:
  echo (new Facebook_API)->get("name;
  $foo = "get";
  echo (new Facebook_API)->$foo("name;
  看到了么?其中对$foo变量赋值为get,然后在类中企图调用get方法时,是通过(new Facebook_API)->$foo("500058753")->name;去实现调用的。
  我们再举个例子来说明下Traits的使用,可能这个例子更加简单,比如如下代码:
  trait Net
  public function net()
  return "Net";
  trait Tuts
  public function tuts()
  return "Tuts";
  class NetTuts
  use Net, Tuts;
  public function plus()
  return "+";
  $o = new NetTuts;
  echo $o->net(), $o->tuts(), $o->plus();
  echo (new NetTuts)->net(), (new NetTuts)->tuts(), (new NetTuts)->plus();
  以上的结果都输出NetTuts。此外,顺便说下,在php 5.4中traits的魔术常量为__TRAIT__。
  内置的调试服务器
  在以往的php 开发中,一般是需要跟如Apache HTTP Server进行配合开发的。在php 5.4中,新内置了一个简单的Web服务器,以方便开发者不用通过复杂的配置也可以完成开发工作。下面分步骤讲解下如何在windows环境下,使用php 5.4中的内置服务器完成相关工作。
  步骤1) 首先在c盘根目录下建立一个目录,为public_html,并且在文件中建立一个router.php文件,代码如下:
  php
  // router.php
  if (preg_match("#\.php$#", $_SERVER["REQUEST_URI"]))
  require basename($_SERVER["REQUEST_URI"]); // serve php file
  else if (strpos($_SERVER["REQUEST_URI"], ".") !== false)
  return false; // serve file as-is
  >
  然后再建立一个简单的PHP文件,名字为index.php,如下:
  // index.php
  echo "Hello Nettuts+ Readers!";
  >
  然后打开php 5.4的安装目录,找到php.ini,然后在include_path中加入如下这行:
  include_path = ".;C:\php\PEAR;C:\public_html"
  步骤2 运行内置的web服务器
  首先进行命令行模式下,并且进入php目录,输入如下命令:
  php -S 0.0.0.0:8080 -t C:\public_html router.php
  其中这里指定了任何机器都可以访问这台服务器,并且指定了8080端口,指定了工作监听的路由文件为c:\public_html下的router,php文件,在上面的命令行输入后按回车,会出现如下信息提示
  则证明内置的服务器已经正确启动了。
  这个时候,可以在浏览器中输入http://localhost:8080/index.php进行访问了。
  更简洁的数组语法
  在php 5.4中,对一些语法上的支持更加显得简洁,比如数组中的声明,现在
  支持使用中括号的方法来声明,如下:
  $fruits = array("apples", "oranges", "bananas"); // 旧的声明方式
  $fruits = ["apples", "oranges", "bananas"]; //php 5.4中新的支持声明方式
  // 新的关联数组访问
  $array = [
  "foo" => "bar",
  "bar" => "foo"
  ];
  当然,在php 5.4中,同样支持旧的数组声明方式。
  直接对函数返回值进行数组取值
  在php 5.4中,支持直接对函数返回值进行数组取值。看个例子,比如:
  $tmp = explode(" ", "Alan Mathison Turing");
  echo $tmp[1]; // Mathison
  在这个例子中,如果是php 5.4之前,要取出上面的字符串中的Mathison的话,必须先用explode函数先返回相关的值,然后再对数组进行取值。而在php 5.4中,可以直接对返回值进行数组进行取值,如下:
  echo explode(" ", "Alan Mathison Turing")[1];
  这样就方便多了。再比如,加入要获得上面这个字符串的最后一个字符串部分Turing,在php 5.4中可以这样做:
  echo end(explode(" ", "Alan Mathison Turing"));
  再给出一个复杂点的例子,如下:
  function foobar()
  return ["foo" => ["bar" => "Hello"]];
  echo foobar()["foo"]["bar"]; //输出 Hello
  闭包中能使用$this指针
  以前的php 版本中,是不能在匿名方法中(也称为闭包)使用$this指针的,而php 5.4中是可以了,例子如下:
  class Foo
  function hello() {
  echo "Hello Nettuts!";
  function anonymous()
  return function() {
  $this->hello(); //这在以前的版本中是不能实现
  };
  class Bar
  function __construct(Foo $o)
  $x = $o->anonymous(); // 实际上调用Foo::hello()
  $x(); // 执行的是 Foo::hello()
  new Bar(new Foo); //输出 Hello Nettuts!
  以上的实现方法有点复杂,在php 5.4中,可以更方便写为如下:
  function anonymous()
  $that = $this;
  return function() use ($that) {
  $that->hello();
  };
  现在,不管php.ini中的short_tag标记如何设置,在模板中可以随时使用这样的方式了,从而代替 这样的方式。采用“0b”前缀标识二进制数,现在,如果要使用二进制数,请在前面加上0b的前缀,比如:
  echo 0b11111
  函数类型提示的增强
  由于php是弱类型的语言,因此在php 5.0后,引入了函数类型提示的功能,其含义为对于传入函数中的参数都进行类型检查,举个例子,有如下的类:
  class bar {
  function foo(bar $foo) {
  其中函数foo中的参数规定了传入的参数必须为bar类的实例,否则系统会判断出错。同样对于数组来说,也可以进行判断,比如:
  function foo(array $foo) {
  foo(array(1, 2, 3)); // 正确,因为传入的是数组
  foo(123); // 不正确,传入的不是数组
  而在php 5.4中,则支持对callable类型的支持。在以前, 我们如果希望一个函数接受一个回调函数作为参数, 那需要做很多额外的工作来检查是否是可调用的正确的回调函数,例子如下:
  function foo(callable $callback) {
  则:
  foo("false"); //错误,因为false不是callable类型
  foo("printf"); //正确
  foo(function(){}); //正确
  class A {
  static function show() {
  foo(array("A", "show")); //正确
  遗憾的是,PHP 5.4中,依然不支持对基本类型如字符,整形等的类型提示。
  对时间统计的增强
  在PHP 5.4中,其中新增加了$_SERVER["REQUEST_TIME_FLOAT"],这个是用来统计服务请求时间的,并用ms来表示,大大方便了开发者,比如:
  echo "脚本执行时间 ", round(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"], 2), "s";
  总结:
  本文简单小结了PHP 5.4中的一些新的特性,可以看到PHP 5.4中比较明显的特性改进主要是Traits以及内置调试服务器,默认支持等,详细的新特性介绍请参考PHP 5.4的用户手册
来源地址:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0427/10323.html

版权及转载说明

本站原创、转载文章欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区

本站转载文章版权归原作者所有,如发现本站文章涉嫌侵权请点击「联系我们」反馈,本站将立即给予删除

转载请注明:文章转载自:全分享社区 「http://www.aweb.cc

本文标题: PHP 5.4正式版重要新特性

本文地址:http://www.aweb.cc/article/detail/id/32.html

php vc9|vc6线程与非线程讲解 <<上一篇 下一篇>> 比RBAC更好的权限认证方式(Auth