但行好事,莫问前程

挖了太多坑,一点点填回来

PHP 5.4 新特性

php

安装了 Ubuntu 12.04 之后,我就一直在 PHP 5.3.10 的环境下一直工作了。前段时间,通过 PPA 把 PHP 升级到了 5.4 。

1
2
3
4
5
sudo apt-add-repository ppa:ondrej/php5-oldstable

sudo apt-get update

sudo apt-get upgrade

这个源和 PHP 5.4 的官方 release 同步更新。目前,我机器上的 PHP 版本已经升级到了 PHP 5.4.21。

在这个链接:http://php.net/manual/zh/migration54.new-features.php 可以查询到 PHP 5.4 的新特性,下面这几个链接也对 PHP 5.4 的新特性作出了分析:

http://www.laruence.com/2011/07/02/2097.html http://www.oracle.com/technetwork/cn/articles/dsl/lerdorf-php54-1564639-zhs.html http://tech.it168.com/a2012/0424/1341/000001341278_all.shtml

下面我们来看看有哪些新特性比较有意思?

1
2
3
4
5
6
7
8
9
10
11
12
13
PHP 5.4.0 提供了丰富的新特性:

新增支持 traits 。
新增短数组语法,比如 $a = [1, 2, 3, 4]; 或 $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]; 。
新增支持对函数返回数组的成员访问解析,例如 foo()[0]现在 闭包 支持 $this现在不管是否设置 short_open_tag php.ini 选项,<?= 将总是可用。
新增在实例化时访问类成员,例如: (new Foo)->bar()现在支持 Class::{expr}() 语法。
新增二进制直接量,例如:0b001001101 。
改进解析错误信息和不兼容参数的警告。
SESSION 扩展现在能追踪文件的 上传进度 。
内置用于开发的 CLI 模式的 web server 。

其中第一条新增支持 traits这一条挺有意思的。想起在写 Rails 的时候,经常就在 helper 中写一个 module ,然后在 controller 中 include 进来,比如下面这样:

sessions_helper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
module SessionsHelper

  def sign_in(user)
    remember_token = User.new_remember_token
    cookies.permanent[:remember_token] = remember_token
    user.update_attribute(:remember_token, User.encrypt(remember_token))
    self.current_user = user
  end

  def sign_out
    self.current_user = nil
    cookies.delete(:remember_token)
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    remember_token = User.encrypt(cookies[:remember_token])
    @current_user ||= User.find_by(remember_token: remember_token)
  end

  def current_user?(user)
    user == current_user
  end

  def signed_in?
    !current_user.nil?
  end

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)
  end

  def store_location
    session[:return_to] = request.fullpath if request.get?
  end

end
application_controller.rb
1
2
3
4
5
6
7
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  include SessionsHelper
end

在 ApplicationController 基类中 include 这个 SessionsHelper,之后所有的派生类都自动加上了 SessionsHelper 的方法。而我经常使用的 CakePHP 框架,由于之前 PHP 和 Ruby 的语言特性,没办法像 Rails 一样这么灵活,楞是把 Rails 中的 helper 硬生生拆分成了只能在 controller 里使用的 component 和只能在 view 里使用的 helper。希望在 CakePHP 3.X 里面能加上 traits 的特性,方便开发。

当然,升级 PHP 5.4 的另外一个原因是——性能有了很大的提升,为了更快的速度,强烈要求升级到 PHP 5.4 !看看这个链接:http://developer.51cto.com/art/201207/349607.htm

至于为什么不升级到 PHP 5.5 ?因为我还是比较保守……

Have a nice day!