Pages

Chủ Nhật, 7 tháng 9, 2014

PHP những điều cần biết

Những điều cần biết về học PHP 5.4


PHP 5.4 là 1 phiên bản kế tiếp kể từ PHP 5.3 ( hãy chuẩn bị cho sự ra đời PHP 6(hỗ trợ full Unicode) ngay từ bây giờ ).

PHP 5.4 được tăng cường gỡ bỏ những hàm bị phản đối và tăng 20% tốc độ chạy, cùng với việc giảm bộ nhớ sử dụng !!!

Tìm hiểu về 1 số tính năng và cải tiến :
Một vài tính năng và cải tiếng quan trọng nhất mà mình sẽ trình bày là : traits, cú pháp giản đơn về mảng, thiết lập webserver sử dụng với vài câu lệnh đơn giản, sử dụng $this và truy cập các thành viên của class, kí hiệu <?= và 1 số tính năng khác sẽ xuất hiện trong PHP 5.4 

PHP 5.4 cải thiện 1 cách đáng kể khả năng xử lý và sửa hơn 100 lỗi . Những tính năng đã được gỡ bỏ như : register_globals, magic_quotes ( về thời gian) và safe_mode . Và 1 cải tiến giá trị khác là : khả năng hỗ trợ multibyte sẽ được bật mặc định và default_charset sẽ được thay đổi từ ISO-8859-1 to UTF-8

Content-Type: text/html; charset=utf-8 sẽ luôn được bao hàm . Vì thế không cần phải sử dụng nó cũng như thêm 1 số header để có được sự tương thích UTF-8. 

Traits
Trait (horizontal reust/multible inheritance) là 1 bộ methods được cấu trúc như class ( nhưng hok thể instantiate ). Trait giúp các nhà phát triển sử dụng lại 1 bộ methods tự các class độc lập 1 cách tự do . Bởi vì PHP là 1 ngôn ngữ thừa kế đơn (single inheritance), 1 subclass có thể thừa kế từ chỉ 1 superclass, đó là nơi Trait phát huy tác dụng !

Ứng dụng lớn nhất của trait là khi nhiều class share cùng 1 hàm. Ví dụ, giả sử bạn đang build 1 website, và cần cả 2 Facebook và Twitter APIs . Chúng ta xây dựng 2 class có chung 1 function/method tên là cURL . Thay vì copy & paste đơn thuần method đó ( để có thể sử dụng trong 2 class) , chúng ta sẽ sử dụng Trait ( copy & paste, theo cách của compiler ). Bằng cách này, chúng ta đã tạo ra 1 source code dễ sử dụng, và tuân thủ nguyên tắc DRY (Don’t Repeat Yourself ).

Ví dụ : 
PHP Code:
/** cURL wrapper trait */trait cURL{
    public function 
curl($url)
    {
        
$ch curl_init();
        
curl_setopt($chCURLOPT_URL$url);
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
$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// Xuất tên “Rasmus Lerdorf”

/** Bây giờ hãy tìm hiểu về sự tuyệt vời của cú pháp PHP 5.4  */
echo (new Facebook_API)->get('500058753')->name// Xất tên “Rasmus Lerdorf”$foo 'get';
echo (new 
Facebook_API)->$foo('500058753')->name// và lại xuất tên “Rasmus Lerdorf”echo (new Twitter_API)->get('1/users/show.json?screen_name=rasmus')->name// và cũng là xuất Rasmus Lerdorf  
Nếu cảm thấy khó hiểu, bạn có thể xem tiếp đoạn code sau :

PHP Code:
trait Net{
    public function 
net()
    {
        return 
'Net';
    }
}
 
trait Tuts{
    public function 
tuts()
    {
        return 
'Tuts';
    }
}

class 
NetTuts{
    use 
NetTuts;
    public function 
plus()
    {
        return 
'+';
    }
}
 
$o = new NetTuts;
echo 
$o->net(), $o->tuts(), $o->plus();
echo (new 
NetTuts)->net(), (new NetTuts)->tuts(), (new NetTuts)->plus();  
Lưu ý : magic constant trong trait là __TRAIT__ .

Xây dựng CLI Webserver 

Trong web development, người bạn tốt nhất của PHP là Apache HTTPD Server . Thỉnh thoảng, có thể là quá mức cần thiết khi cài đặt httpd.conf chỉ để sử dụng nó trong 1 môi trường phát triển web , khi bạn chỉ cần 1 web server nhỏ được bắt đầu với chỉ 1 dòng lệnh đơn giản ! Và vì thế PHP 5.4 đến với chức năng CLI Web server

Lưu ý : PHP Web server được xây dựng chỉ cho các nhà phát triển, hok được sử dụng trong mục đích thương mại !

Hướng dẫn ở phía dưới dành cho Window :

Bước 1 : tạo Document root directory, router file và index file .

Đến ổ hệ thống ( ví dụ C:\). Tạo 1 folder tên public_html . Tạo 1 file trong folder này, đặt tên là router.php copy đoạn code dưới đây, và paste nó vào file vừa tạo : 

PHP Code:
<?php// router.phpif (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 1 file khác tên index.php . Copy đoạn code sau và save vào file : 

PHP Code:
<?php// index.phpecho 'Hello Nettuts+ Readers!';?>
Mở file php.ini ( nằm ở trong đường dẫn PHP , ví dụ : C:\PHP )
Tìm include_path ( nằm ở dòng thứ 708 ) . Thêm C:\public_html vào cuối chuỗi ở giữa nháy đôi, phân tách bởi dấu chấm phẩy (;) . Kết quả cuối cùng sẽ như thế này :

PHP Code:
include_path ".;C:\php\PEAR;C:\public_html"  
Save file lại và đến bước 2

Bước 2 : chạy web server .

Mở command promt ( Window + R, gõ cmd, nhấn enter ) . Bạn sẽ thấy 1 cái gì đó đại loại như :

Mã:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\nettuts>
Đổi đường dẫn hiện tại đến file cài đặng PHP bằng cú pháp sau :
Mã:
C:\Documents and Settings\nettuts>cd C:\php
C:\php>
Đến đoạn quan trọng nhất : chạy web server . Chép :
Mã:
php -S 0.0.0.0:8080 -t C:\public_html router.php
và paste vào command promt ( click chuột phải , chọn paste ). Nhấn enter . Nếu tất cả chạy đúng, bạn sẽ thấy 1 cái gì đó đại loại như bên dưới ^^ : ( lưu ý hok được đóng command promt, nếu đóng, web server sẽ bị tắt )

Mã:
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ở browser lên và type vào :
Mã:
http://localhost:8080/index.php
bạn sẽ thấy : 

Hello Nettuts+ Readers!

Lưu ý 1 : tạo 1 file php-server.bat với nội dung sau
Mã:
C:\php\php -S 0.0.0.0:8080 -t C:\public_html router.php.
Double click và chúng ta sẽ chạy được web server .
Lưu ý 2 : Sử dụng 0.0.0.0 thay vì localhost nếu bạn dự đoán server của bạn sẽ được truy cập từ internet !

Cú pháp mảng ngắn gọn 

PHP 5.4 cung cấp 1 cú pháp mảng ngắn gọn :

PHP Code:
$fruits = array('apples''oranges''bananas'); // "old" way

// Khai báo mảng như kiểu Javascript
$fruits = ['apples''oranges''bananas'];
 
// Mảng hok tuần tự$array = [
    
'foo' => 'bar',
    
'bar' => 'foo'];  
Lưu ý : hãy nhớ rằng phương pháp cũ sẽ vẫn và mãi được sử dụng, cú pháp mảng ngắn gọn chỉ là 1 sự thay thế khi cần đơn giản !!!

Array dereference
Sẽ hok cần biến tạm khi xử lý với mảng .
Ví dụ chúng ta cần lấy tên ở giữa của chuỗi “Alan Mathison Turing “

PHP Code:
echo explode(' ''Alan Mathison Turing')[1]; // Xuất Mathison  
Nhưng trước bản 5.4, chúng ta phải :

PHP Code:
$tmp explode(' ''Alan Mathison Turing');
echo 
$tmp[1]; // Xuất Mathison  
Bây giờ, nếu chúng ta muốn lấy từ Turing ? 

PHP Code:
echo end(explode(' ''Alan Mathison Turing')); // Xuất Turing  
Câu lệnh trên sẽ chạy tốt, nhưng sẽ hiện ra 1 lỗi E_STRICT (chuẩn Strict : chỉ biến mới được truyền tham trị ) . Bởi vì nó trở thành 1 phần của E_ALL trong error-reporting.

Một ví dụ nâng cao :

PHP Code:
function foobar()
{
    return [
'foo' => ['bar' => 'Hello']];
}
echo 
foobar()['foo']['bar']; // Hello  
$this trong các hàm vô danh 

Bạn có thể trỏ đến các đối tượng từ các hàm vô danh ( được biết với tên closures ) bằng cách sử dụng $this .

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

    function 
anonymous()
    {
        return function() {
            
$this->hello(); // $this kiểu này sẽ hok chạy được trong các phiên bản trước .
        
};
    }
}

class 
Bar{
    function 
__construct(Foo $o// đối tượng của class Foo typehint
    
{
        
$x $o->anonymous(); // lấy ra Foo::hello()
        
$x(); // chạy Foo::hello()
    
}
}
new 
Bar(new Foo); // Xuất Hello Nettuts!  
Chúng ta vẫn có thể tiếp cận phương pháp này trong các phiên bản trước nhưng dùng câu lệnh quá mức cần thiết :

PHP Code:
function anonymous()
{
    
$that $this// $that is now $this
    
return function() use ($that) {
        
$that->hello();
    };
}  
Tag <?= 
Mặc kệ setting trong php.ini, short_open_tag , <?= (open PHP tag và echo ) sẽ luôn luôn available . Có nghĩa là bạn có thể an toàn dùng :

PHP Code:
<?=$title?>
Thay vì 

PHP Code:
<?php echo $title ?>
Biễu diễn số nhị phân :
Kể từ bản này, số nguyên có thể là số thập phân (cơ số 10 ), số thập lục phân ( cơ số 16), số bát phân ( cơ số 8 ) hay nhị phân ( cơ số 2) , được đặt các kí tự + - ở phía trước . Để ngụ ý số bát phân, đặt trước con số với 0 (zero). Để ngụ ý thập lục phân, đặt trước con số với 0x. Để ngụ ý nhị phân, đặt trước với 0b.

Ví dụ: để diễn tả số 31 chúng ta có 

PHP Code:
echo 0b11111// binary, introduced in PHP 5.4echo 31// duhecho 0x1f// hexadecimalecho 037// octal  
Callable Typehint
Typehint được sử dụng để tăng cường sức mạnh của PHP . Typehint có thể là array, là object từ PHP 5.1 và là callable từ PHP 5.4 . Các kiểu typehint truyền thống : int hay string sẽ hok được hỗ trợ nữa !!
PHP Code:
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 functionecho my_function('my_callback_function'); // callback functionecho my_function(['Hello''hi']); // class name, static methodecho my_function([(new Hi), 'hello']); // class object, method name  
Bộ đếm thời gian độ chính xác cao

$_SERVER[‘REQUEST_TIME_FLOAT’] được thêm vào, với bộ đếm tính tới micro giây ( theo kiểu float ). Điều này rất quan trọng cho các bạn khi muốn tính tg chạy script .
PHP Code:
echo 'Executed in 'round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 2), 's';  
Lời kết
Về mặt tổng thể, PHP 5.4 cung cấp 1 số lượng lớn cải tiến .
Bạn nghĩ PHP 5.5 sẽ mang tới cho chúng ta cải tiến nào và bạn mong đợi điều gì ?

0 nhận xét:

Đăng nhận xét