Hướng dẫn dùng rasmus lerdorf trong PHP

PHP 5.4 ra đời là một bước tiến quan trọng kể từ phiên bản 5.3- các tính năng mới sẽ được giữ lại trong phiên bản PHP 6 sau này (được hỗ trợ đầy đủ Unicode). Bản nâng cấp mang ý nghĩa quan trọng gần đây nhất là hoàn thiện tính năng cùng với việc bỏ hẳn các chức năng bị phản đối, kết quả là tận dụng triệt để runtime (tăng 20% tốc độ và giảm bộ nhớ sử dụng).

Những cải tiến và tính năng mới

Những tính năng mới quan trọng bao gồm các trait, cú pháp array rút gọn, webserver nhúng sẵn cho phép test code nhanh chóng, sử dụng từ khóa $this trong các closure, truy cập các lớp thành viên vào trong hiện thể, short_open_tag luôn được bật sẵn và còn nhiều hơn thế nữa!

Đáng nói ở đây, PHP 5.4.0 đã nâng cấp hiệu suất, memory footprint và chỉnh sửa trên 100 bug. Bỏ các tính năng  đáng chú ý bao gồm register_globals, magic_quotes (về thời gian) và safe_mode. Điều đáng chú ý ở đây nữa là thực tế sự hỗ trợ multibyte đã được kích hoạt mặc định và default_charset đã thay đổi từ ISO-8859 thành UTF-8.

"Content-Type: text/html; charset=utf-8 thì luôn được gởi đi, vì vậy không cần thiết phải cài đặt thẻ HTML meta hoặc gởi thêm các header để tương thích với UTF-8"

Traits

Thế mạnh của các trait thể hiện rõ khi nhiều class dùng chung một nhóm chức năng.

Trait (chuyển sang phong cách kế thừa hàng ngang thay vì kiểu phả hệ trước đây) là một tập hợp các phương thức với các cấu trúc tương tự như một class (nhưng không thể được khởi tạo), nó cho phép các nhà phát triển có thể dùng lại các tập hợp phương thức một cách tự do ở trong các class độc lập. PHP là một ngôn ngữ đơn kế thừa, do vậy một subclass có thể thừa hưởng từ một superclass duy nhất; đó là lí do vì sao trait xuất hiện.

Cách dùng tối ưu nhất của traits được thể hiện khi nhiều class dùng chung một nhóm chức năng. Ví dụ, hình ảnh chúng ta tạo ra trên các website và cần sử dụng cả API của Facebook lẫn Twitte. Chúng ta sẽ tạo 2 class và có một cURL bao gồm chức năng/phương thức. Thay vì thường sử dụng phương thức thực hiện copy & paste ở 2 class, chúng ta sẽ sử dụng Trait (copy & paste, cách trình biên dịch). Theo cách này, chúng ta sẽ tận dụng code và làm theo đúng quy tắc DRY (Don’t Repeat Yourself).

Dưới đây là ví dụ:

/** 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 */

class Twitter_API
{
    use cURL; // use trait here

    public function get($url)
    {
        return json_decode($this->curl('http://api.twitter.com/'.$url));
    }
}

/** Facebook API Class */

class Facebook_API
{
    use cURL; // and here

    public function get($url)
    {
        return json_decode($this->curl('http://graph.facebook.com/'.$url));
    }
}
 
$facebook = new Facebook_API();
echo $facebook->get('500058753')->name; // Rasmus Lerdorf

/** Now demonstrating the awesomeness of PHP 5.4 syntax */

echo (new Facebook_API)->get('500058753')->name; // Rasmus Lerdorf
$foo = 'get';
echo (new Facebook_API)->$foo('500058753')->name; // and again, Rasmus Lerdorf
echo (new Twitter_API)->get('1/users/show.json?screen_name=rasmus')->name;
// and yet again, Rasmus Lerdorf

// P.S. I'm not obsessed with Rasmus :)

Bạn vẫn chưa hiểu? Ví dụ này sẽ đơn giản và dễ hiểu hơn!

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();

Gợi ý : Hằng số bất biến của các trait là __TRAIT__.

Nhúng sẵn webserver CLI

Trong phát triển web, người bạn thân thiết của PHP là Apache HTTPD Server. Dù đôi lúc nó có thể bị hủy để cài đặt httpd.conf cho việc sử dụng trong môi trường phát triển, khi bạn thật sự cần web server nhỏ mà có thể khởi động nó chỉ bằng một dòng lệnh đơn giản. May mắn thay, PHP 5.4 ra đời cùng với việc nhúng sẵn webserver CLI.

Web server CLI PHP được thiết kế dành cho các mục đích phát triển và không nên dùng để chạy các hệ thống đã hoàn thiện.

Chú ý : Hướng dẫn dưới dây dành cho Window

Bước 1 – Tạo thư mục gốc Document, File Router và File Index

Vào thư mục ổ cứng chính (thường là C:\). Tạo một đường dẫn/thư mục, có tên gọi là public_html. Tạo một file mới trong thư mục có tên gọi là router.php. Copy nội dung dưới đây và paste nó vào trong file vừa tạo mới.

// 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
}

Bây giờ, tạo một file khác, gọi là index.php. Copy nội dung ở dưới và lưu file.

// index.php
echo 'Hello Nettuts+ Readers!';

Mở file php.ini (nó nằm trong đường dẫn cài đặt PHP –ví dụ: C:\php).

Tìm phần cài đặt include_path (nó nằm ở vào khoảng dòng thứ 708). Thêm C:\public_html vào cuối chuỗi giữa các dấu nháy, cách nhau bởi dấu phẩy. Kết quả cuối cùng sẽ giống như vậy:

include_path = ".;C:\php\PEAR;C:\public_html"

Lưu và đóng file. Chuyển qua bước tiếp theo.

Bước 2 – Chạy web server

Mở bảng gõ lệnh (Windows + R, gõ vào CMD và nhấn Enter); tùy thuộc vào phiên bản Windows, bạn sẽ thấy dòng như dưới đây,

Microsoft Windows XP [Version 5.1.2600]

(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\nettuts>

Thay đổi đường dẫn hiện tại đến cài đặt PHP theo ví dụ sau:

C:\Documents and Settings\nettuts>cd C:\php

C:\php>

Phần quan trọng nhất- chạy web-server. Copy đoạn dưới…

php -S 0.0.0.0:8080 -t C:\public_html router.php

…và dán nó vào dòng lệnh ( click chuột phải, chọn Paste để paste). Nhấn Enter. Nếu nó hoạt động, bạn sẽ thấy các dòng giống như ở dưới. Đừng đóng bảng gõ lệnh, nếu bạn làm vậy,  bạn sẽ thoát khỏi web-server.

C:\php>php -S 0.0.0.0:8080 -t C:\public_html router.php

PHP 5.4.0 Development Server started at Fri Mar 02 09:36:40 2012

Listening on 0.0.0.0:8080

Document root is C:\public_html

Press Ctrl-C to quit.

Mở trên trình duyệt của bạn địa chỉ http://localhost:8080/index.php và bạn sẽ thấy:

Hello Nettuts+ Readers!

Mẹo 1: Tạo một file php-server với nội dung sau: C:\php\php -S 0.0.0.0:8080 -t C:\public_html router.php. Click đôi và bây giờ, máy chủ đã được tải lên và hoạt động.

Mẹo 2: Dùng 0.0.0.0 thay cho localhost nếu như bạn đoán trước được máy chủ của bạn sẽ truy cập từ Internet.

Cú pháp Array rút gọn

PHP 5.4 đưa ra một cú pháp array mới ngắn hơn

$fruits = array('apples', 'oranges', 'bananas'); // "old" way

// The same as Javascript's literal array notation

$fruits = ['apples', 'oranges', 'bananas'];

// associative array

$array = [

    'foo' => 'bar',

    'bar' => 'foo'

];

Hãy lưu ý rằng phương thức cũ vẫn được sử dụng và sẽ luôn như vậy. Đây chỉ đơn giản là sự lựa chọn.

Array Dereferencing

Không còn các biến tạm thời khi xử lý với các array!

Hãy tưởng tượng rằng chúng ta muốn gọi tên lót của Alan Mathison Turing:

echo explode(' ', 'Alan Mathison Turing')[1]; // Mathison

Rất hay, nhưng trước đây nó không dễ dàng như vậy. Trước 5.4, chúng ta phải:

$tmp = explode(' ', 'Alan Mathison Turing');

echo $tmp[1]; // Mathison

Những gì chúng ta cần làm bây giờ là lấy họ (thành phần cuối trong array)

echo end(explode(' ', 'Alan Mathison Turing')); // Turing

Câu lệnh này hoạt động tốt tuy nhiên nó lại tạo ra một lỗi E_STRICT (Các tiêu chuẩn Strict: các biến thể chỉ nên được thông qua bằng cách tham chiếu, do đó nó đã trở thành một phần của E_ALL trong error_reporting

Đây là một ví dụ cho ý trên:

function foobar()
{
    return ['foo' => ['bar' => 'Hello']];
}

echo foobar()['foo']['bar']; // Hello

Từ khóa $this trong hàm nặc danh

Bây giờ bạn có thể tham chiếu đến một đối tượng hiện thể từ các hàm nặc danh (được biết đến là các closure) bằng cách dùng $this

class Foo
{
    function hello() {
        echo 'Hello Nettuts!';
    }

    function anonymous()
    {
        return function() {
            $this->hello(); // $this wasn't possible before
        };
    }
}

class Bar
{
    function __construct(Foo $o) // object of class Foo typehint
    {
        $x = $o->anonymous(); // get Foo::hello()

        $x(); // execute Foo::hello()
    }
}

new Bar(new Foo); // Hello Nettuts!

Lưu ý rằng nó có thể được ưu tiên hoàn thành đối với 5.4, nhưng nó cũng có thể bị hủy.

function anonymous()
{
    $that = $this; // $that is now $this

    return function() use ($that) {
        $that->hello();
    };
}

short_open_tag luôn bật sẵn

Không để ý tới cài đặt của php.ini, short_open_tag, = (mở tag và echo PHP) sẽ luôn luôn có sẵn, điều này có nghĩa là an toàn khi sử dụng

Sự biểu diễn số nhị phân 

Chỉ có 0b10 loại người đó chính là hiểu số nhị phân và số còn lại là không hiểu.

Cho đến bây giờ, các số nguyên được chia thành các hệ thập phân (cơ số 10), hệ thập lục phân (cơ số 16), hệ bát phân (cơ số 8) hoặc hệ nhị phân (cơ số 2),  thứ tự tùy chọn bằng các kí hiệu ( -  hoặc +). Để sử dụng hệ bát phân, con số trước phải bắt đầu bằng 0 (số 0). Để sử dụng hệ thập lục phân, con số trước phải bắt đầu bằng 0x.

Để dùng hệ nhị phân, con số trước bắt đầu với 0b.

Ví dụ: biểu diễn số 31 (thập phân)

echo 0b11111; // binary, introduced in PHP 5.4

echo 31; // duh

echo 0x1f; // hexadecimal

echo 037; // octal

Callable Typehint 

Typehint dành cho những ai mong muốn PHP trở thành một ngôn ngữ định kiểu mạnh hơn. Trong PHP 5.1, Type Hint chỉ hỗ trợ object và array . Sang PHP 5.4, có thêm callable. Typehint truyền thống vẫn chưa hỗ trợ kiểu int và string.

function my_function(callable $x)
{
    return $x();
}

function my_callback_function(){return 'Hello Nettuts!';}

class Hello{static function hi(){return 'Hello Nettuts!';}}

class Hi{function hello(){return 'Hello Nettuts!';}}

echo my_function(function(){return 'Hello Nettuts!';}); // anonymous function

echo my_function('my_callback_function'); // callback function

echo my_function(['Hello', 'hi']); // class name, static method

echo my_function([(new Hi), 'hello']); // class object, method name

Tính toán thời gian với độ chính xác cao

$_SERVER['REQUEST_TIME_FLOAT'] đã được thêm vào với độ chính xác một phần triệu của giây (float). Điều này thật sự rất cần thiết khi bạn muốn tính toán thời gian thực thi script.

echo 'Executed in ', round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 2), 's';

__destruct() (hoặc Tóm tắt)

Nhìn chung, PHP 5.4 đã có những cái thiện đáng kể. Vào lúc này đây, tùy thuộc vào bạn nếu bạn muốn một bản copy mới tinh từ trang php.net, hãy lấy về và viết ra những dòng code PHP hướng đối tượng tuyệt vời và chất lượng hơn.

Theo bạn thì PHP 5.5 sẽ mang đến cho chúng ta những chức năng gì mới và bạn đang mong đợi gì từ nó?

Biên dịch: Anhpth

Nguồn: http://net.tutsplus.com/tutorials/php/php-5-4-is-here-what-you-must-know/