Kiểm tra các đặc tính của PHP V5.3.0 dưới kính hiển vi

Vì ngôn ngữ PHP phổ biến tiếp tục tiến hoá, nhiều đặc tính mới nâng cao các khía cạnh hướng đối tượng của nó. Trong bài viết này, các ví dụ PHP V5.3 minh họa về kết buộc tĩnh muộn (late static binding), hỗ trợ vùng tên, nạp chồng phương thức lớp và hỗ trợ phân tích biến và hỗ trợ tài liệu ngay tại chỗ (heredoc).

Stephen B. Morris, Giám đốc Công nghệ, Omey Communications

Stephen Morris là Giám đốc Công nghệ của hãng Omey Communications tại Ai-len. Trong 20 năm qua, ông đã làm nhiều dự án phần mềm cho một số công ty mạng lớn nhất thế giới, bao gồm các hệ thống quản trị mạng dựa trên J2EE/J2SE, các ứng dụng thanh toán, di trú và phát triển các phần tử SNMP, các công nghệ thiết bị mạng, và các ứng dụng mạng điện thoại di động GSM. Ông là tác giả của cuốn Network Management, MIBs and MPLS: Principles, Design and Implementation (Prentice Hall PTR, 2003), cũng như một số bài viết về quản trị mạng và các chủ đề khác cho InformIT và OnJava.com.



28 01 2011

Các yêu cầu đối với bài viết này

Ngoài một sự hiểu biết cơ bản về PHP và HTML, không có yêu cầu nào đáng kể để theo dõi bài viết này. Bất cứ chỗ nào tôi nói về PHP V5.3, là tôi đang nói đến PHP V5.3.0.

Các đặc tính được xem xét lại

Sau đây là các đặc tính chính của PHP V5.3 mà tôi xem xét trong bài viết này:

  • Kết buộc tĩnh muộn
  • Các vùng tên
  • Nạp chồng phương thức lớp
  • Phân tích biến và tài liệu ngay tại chỗ (heredoc)

Tuy nhiên, trước khi đào sâu, bạn cần cài đặt PHP V5.3.


Cài đặt

PHP có tiếng là cài đặt khá khó. Có lẽ đây là do việc cài đặt PHP trên một máy chủ Web (chẳng hạn như Apache) và thường có một kết nối đến một cơ sở dữ liệu ngoài (chẳng hạn như MySQL). Ngoài ra, theo một cách hiểu nào đó, mã lệnh PHP nằm bên trong mã HTML. Nói một cách khác, PHP với tư cách là một công nghệ đứng giữa một số lĩnh vực và ngành kiến thức phức tạp. Do đó, trước khi bạn viết một dòng mã lệnh PHP, bạn phải vượt qua rất nhiều thử thách. Ước gì tôi có thể thay đổi được hết, nhưng nhiều thứ phải làm với công nghệ phần mềm vẫn còn khá khó khăn.

Tuy nhiên, đối với những độc giả may mắn nào đang sử dụng máy Mac của Apple, việc cài đặt lại đơn giản như bất cứ ai có thể hy vọng:

  1. Nhận một bản trình cài đặt nhị phân PHP (http://www.entropy.ch/software/macosx/php/).
  2. Tắt phần Web Sharing trong System Preferences.
  3. Tìm đến tệp tin /etc/apache2/httpd.conf.
  4. Đánh dấu chú thích (để làm mất tác dụng – N.D.) dòng lệnh sau trong tệp tin httpd.conf: LoadModule php5_module.
  5. Chạy trình cài đặt PHP V5.3 (bạn có thể xây dựng từ mã nguồn nếu thích).
  6. Bật Web Sharing trong System Preferences.

Tôi không muốn bài viết này chỉ nói về cài đặt, cho nên nếu nền hệ thống của bạn là Microsoft® Windows® hay Linux®, thì hãy xem một trong nhiều sách tham khảo tuyệt vời về PHP đang sẵn có (xem phần Tài nguyên để đọc khuyến cáo của tôi).

Để kiểm tra xem PHP đã được cài đặt hay chưa và bạn đang chạy đúng phiên bản hay không, hãy tạo ra một tệp tin có tên phpinfo1.php trong thư mục /Library/WebServer/Documents. Liệt kê 1 minh họa nội dung của tệp kịch bản lệnh cần có. Tất cả các kịch bản lệnh trong bài viết này đều sẵn có như là một phần của tệp tin nén (ZIP) trong phần Tải về do đó thực tế bạn không phải tạo ra bất kỳ tệp tin nào nếu bạn muốn làm theo.

Liệt kê 1. phpinfo1.php
<?php
phpinfo();
?>

Sau khi bạn đặt tệp kịch bản lệnh trong thư mục /Library/WebServer/Documents, hãy chuyển đến http://localhost/phpinfo1.php. Bạn sẽ thấy một cái gì đó hơi giống đoạn trích minh họa trong Hình 1. Bạn có thể phải thay thế từ "localhost" trong URL bằng địa chỉ IP của máy chủ của bạn.

Hình 1. PHP V5.3.0 được cài đặt thành công
PHP V5.3.0 được cài đặt thành công

Kết buộc tĩnh muộn

PHP V5.3 mở rộng việc sử dụng từ khoá static (tĩnh). Các phương thức tĩnh và thuộc tính lớp tĩnh có thể truy cập được mà không cần khởi tạo một cá thể của lớp. Điều này có thể là thuận tiện cho các tình huống khi mà một đối tượng của lớp không có sẵn hoặc không mong đợi. Liệt kê 2 minh họa một ví dụ về kết buộc tĩnh muộn.

Liệt kê 2. Kết buộc tĩnh muộn
<?php
class A {
    public static function who() {
        echo 'Calling who method from class '.__CLASS__;
    }
    public static function test() {
        static::who();
    }
}

class B extends A {
    public static function who() {
         echo 'Calling who method from class '.__CLASS__;
    }
}

B::test();
?>

Mã trong Liệt kê 2 tạo ra kết quả sau đây:

Calling who method from class B

Định hướng đối tượng được cải thiện

Bất kỳ sự thay đổi nào đối với PHP mà nâng cao được phía hướng đối tượng của ngôn ngữ đều được khuyến khích vì điều này dẫn đến một thiết kế vững chắc hơn và mã lệnh dễ bảo trì hơn. Tôi đã thực hiện một ngụy biện nhỏ với mã lệnh trong Liệt kê 2, đó là việc mã lệnh của phương thức who() bị sao chép lại trong lớp cơ sở (A) cũng như lớp dẫn xuất (B). Sẽ hay hơn nếu có thể không phải sao chép mã trong lớp B, nhưng dường như cú pháp của __CLASS__ trong PHP V5.3.0 đòi hỏi điều này. Nghĩa là, __CLASS__ không hỗ trợ kết buộc muộn.

Việc sử dụng __CLASS__ của tôi trong Liệt kê 2 có thể hơi mưu tính từ trước, nhưng nó thực sự đã phục vụ cho việc minh họa một vấn đề nhỏ với PHP V5.3.0. Hiển nhiên là đối với thí dụ trong Liệt kê 2, đó không phải là một chuyện lớn, nhưng việc này sẽ không còn đúng nữa đối với một địa chỉ Web với hàng nghìn dòng mã PHP. Sao chép lại mã thường có nghĩa là công việc nhân đôi.

Trước PHP V5.3.0, phương thức trong lớp A hẳn đã được định nghĩa là self::who(). Thật không may là việc này đã dẫn đến kết quả là triệu gọi hàm từ lớp A, không phải là hàm trong lớp con lớp B. Việc sử dụng từ khóa static:: trong PHP V5.3.0 đã sửa chữa lỗi này bằng cách cho phép bạn tham chiếu vào lúc chạy phương thức lớp đã được triệu gọi ban đầu. Đây rõ ràng là ý định của mã trong Liệt kê 2.


Các vùng tên

PHP V5.3 cung cấp vùng tên để nâng cao sức mạnh bao gói của ngôn ngữ. Các vùng tên khá phổ biến trong các ngôn ngữ hiện đại, chẳng hạn như C# và XML. Ưu điểm chính của vùng tên là ở chỗ chúng cho phép bạn định nghĩa các thùng chứa biệt lập dành cho các ký hiệu mã (các lớp, hàm, và hằng), mà dường như có vẻ khó hơn như nó vốn nó. Liệt kê 3 cho thấy một ví dụ về việc sử dụng các vùng tên PHP để định nghĩa các hằng chuỗi ký tự cục bộ và toàn cục s.

Liệt kê 3. Các vùng tên PHP
<?php
namespace test;
define('ASTRING', 'Hello World!');
define('test\ASTRING', 'Hello World from my namespace!');

echo "<p>My string is: ";
echo ASTRING;
echo "</p>";

echo "<p>My string is ";
echo \ASTRING;
echo "</p>";
?>

Mã trong Liệt kê 3 tạo ra kết quả sau đây:

My string is: Hello World from my namespace!
My string is: Hello World!

Vậy thì những gì đang diễn ra trong mã này? Câu lệnh define đầu tiên tạo ra một hằng chuỗi ký tự có tên là ASTRING trong vùng tên test Sau đó khi bạn tham chiếu đến chuỗi ASTRING, máy sẽ tìm kiếm trước tiên trong vùng tên test cục bộ. Đây là lý do tại sao bạn nhìn thấy các chuỗi ký tự được định nghĩa cục bộ xuất hiện đầu tiên. Sau đó, khi bạn muốn xem chuỗi ký tự được định nghĩa toàn cục, bạn chỉ cần sử dụng cú pháp \ASTRING. Các quy tắc đơn giản này cho phép bạn hụp lặn trong bất kỳ số lượng vùng tên nào mà không cần phải lo lắng về xung đột tên.

Tiện ích vùng tên cho phép tách biệt ở mức độ mã lệnh rõ rệt hơn trước đây. Điều này, đến lượt nó, sẽ giúp tạo điều kiện cho việc tích hợp mã trong các môi trường nhóm phát triển. Nói cách khác, các nhóm khác nhau có thể cấp phát vùng tên của chính mình, và khi mà quy ước đó được tất cả các thành viên của nhóm tôn trọng, số lượng các xung đột về tên sẽ giảm về không. Một lần nữa, đây là một kiểu cải tiến hướng đối tượng trong ngôn ngữ PHP có trong V5.3.0.


Nạp chồng phương thức lớp

Thuật ngữ nạp chồng (overloading) trong PHP hơi khác một chút so với ngữ cảnh hướng đối tượng thông thường. Trong ngôn ngữ Java™ hay C#, một phương thức “được nạp chồng” là một phương thức cung cấp mã cho một dải các danh sách tham số khác nhau. Thí dụ, nếu tôi có một phương thức có tên là draw(String str), một phiên bản nạp chồng có thể có dạng sau đây: draw(String str, int i). Việc sử dụng tên biểu tượng phương thức như thế này được gọi là chữ ký của phương thức, và nhằm các mục đích về nạp chồng, kiểu trả về được bỏ qua.

Trong PHP, "nạp chồng" được dùng để nói về các phương thức và thuộc tính được tạo ra một cách động. Điều này trên thực tế là mã động, và bất kỳ một thực thể động nào như vậy sẽ được xử lý bằng cái gọi là các phương thức kỳ diệu (magic methods). Bạn có thể tạo ra các phương thức kỳ diệu này trong một lớp dành cho nhiều kiểu hoạt động. Sau đó, các phương thức nạp chồng được gọi ra tại một điểm trong mã của bạn, nơi mà bạn tương tác với các thuộc tính hay phương thức không nhìn thấy được hay chưa được khai báo. Kiểu ngôn ngữ nạp chồng này cung cấp cho bạn một mức độ linh hoạt đáng kể.

Toàn bộ điều này nghe có vẻ phức tạp, cho nên hãy xem một thí dụ để cụ thể hoá nó hơn. Liệt kê 4 minh họa việc sử dụng nạp chồng PHP để gọi ra các đối tượng và phương thức lớp.

Liệt kê 4. Nạp chồng PHP
<?php
class OverloadedMethodTest {
    public function __call($name, $arguments) {
        // The value of $name is case sensitive.
        echo "Calling object method '$name' "
             . implode(', ', $arguments). "\n";
    }

    /**  As of PHP 5.3.0  */
    public static function __callStatic($name, $arguments) {
        // The value of $name is case sensitive.
        echo "Calling static method '$name' "
             . implode(', ', $arguments). "\n";
    }
}

$obj = new OverloadedMethodTest;
$obj->runOverloadedTest('in an object context');

OverloadedMethodTest::runOverloadedTest('in a static context');  // As of PHP 5.3.0
?>

Mã trong Liệt kê 4 tạo ra kết quả sau đây:

Calling object method 'runOverloadedTest' in an object context
Calling static method 'runOverloadedTest' in a static context

Lưu ý trong Liệt kê 4 cách mà mã nạp chồng đã suy ra được các tên phương thức và tham số của phương thức từ mã triệu gọi như sau:

$obj->runOverloadedTest('in an object context');

OverloadedMethodTest::runOverloadedTest('in a static context');  // As of PHP 5.3.0

Quyền lực kiểu này thực sự đòi hỏi một mức trách nhiệm lớn về phía lập trình viên. Tiện ích nạp chồng mang lại mã linh hoạt, nhưng nó cũng cung cấp miền đất màu mỡ cho các lỗi. Do đó việc nạp chồng phải được sử dụng thận trọng, đi cùng với một kỷ luật kiểm thử mã lệnh chặt chẽ.


Phân tích biến và tài liệu ngay tại chỗ (heredoc)

Một trong những sức mạnh to lớn của PHP là phân tích chuỗi ký tự. PHP không có giới hạn về kích thước của một chuỗi, chỉ trừ lượng bộ nhớ máy chủ có sẵn. Liệt kê 5 cho thấy một thí dụ về tính linh hoạt mà bạn có được khi sử dụng phân tích cú pháp PHP.

Liệt kê 5. Phân tích cú pháp PHP
<?php
$beverage = 'coffee';
// The following works; "'" is an invalid 
character for variable names echo "$beverage's taste is great"; // The following won't work; 's' is a valid
character for variable names but the echo "He drank a number of $beverages"; variable is "$beverage" echo "He drank some ${beverage}s"; // works echo "He drank some {$beverage}s"; // works ?>

Mã trong Liệt kê 5 tạo ra kết quả sau đây:

coffee's taste is great
He drank a number of 
He drank some coffees
He drank some coffees

Mã trong Liệt kê 5 không phải là mới đối với PHP V5.3.0. Nó được gộp vào chỉ đơn giản là để nhắc bạn về việc hỗ trợ xử lý chuỗi ký tự và một số quy tắc phân tích cú pháp. Tuy nhiên, PHP V5.3.0 bổ sung hỗ trợ cú pháp tài liệu ngay tại chỗ được cải tiến. Liệt kê 6 trình bày một thí dụ đơn giản.

Liệt kê 6. Tài liệu ngay tại chỗ trong PHP V5.3.0 được sử dụng
<?php
echo >>>"FOOBAR"
Hello World!
FOOBAR;
?>

Mã trong Liệt kê 6 tạo ra kết quả ngoạn mục sau đây:

Hello World!

Vậy có gì đặc biệt ở Liệt kê 6? Sự hỗ trợ tài liệu ngay tại chỗ trong PHP V5.3.0 cho phép sử dụng dấu nháy kép. Việc này có ích lợi gì? Chủ yếu đó là nội dung bên trong cặp dấu nháy kép không được phân tích cú pháp, nó cung cấp cho bạn sự linh hoạt nhiều hơn. Về cơ bản, điều này chỉ bổ sung thêm một chút sự linh hoạt vào hỗ trợ chuỗi ký tự vốn đã mạnh từ trước. Các tham chiếu trực tuyến về PHP V5.3.0 bao gồm nhiều tư liệu hơn về việc này và các chủ đề khác liên quan đến PHP V5.3.0.


Kết luận

PHP là một công nghệ hấp dẫn. Nó tạo điều kiện cho một mô hình chọn-và-trộn (pick-and-mix model) để phát triển trang Web. Bạn có thể bổ sung một cơ sở dữ liệu vào trang Web của bạn và ngôn ngữ PHP có các kết buộc cần thiết để đạt được điều này một cách dễ dàng. Bạn không cần các máy chủ ứng dụng hạng nặng hay công nghệ servlet. Nói cách khác, bạn nắm quyền điều khiển môi trường này với một đầu tư tối thiểu — cả về tài chính và trí tuệ.

Ngôn ngữ PHP tiếp tục tiến hoá, và tôi lấy làm sung sướng thấy rằng nhiều cải tiến của V5.3.0 là những nâng cao một cách hiệu quả cho các khía cạnh hướng đối tượng. Điều này giúp cho PHP cạnh tranh với các cách tiếp cận thiết kế Web hạng nặng hơn (và đắt tiền hơn).

Trong bài này, tôi đã xem xét các vấn đề kết buộc tĩnh muộn, hỗ trợ vùng tên, nạp chồng phương thức lớp, và hỗ trợ tài liệu ngay tại chỗ. Đây chỉ là một bộ phận nhỏ bé của thế giới PHP V5.3.0. Có nhiều chủ đề khác, chẳng hạn như việc di trú đến V5.3.0. Xem phần Tài nguyên để tìm các chi tiết về lĩnh vực này và các lĩnh vực khác.


Tải về

Mô tảTênKích thước
Scripts for this articleos-php-v5.3ftrs-PHPScripts.zip2KB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=619713
ArticleTitle=Kiểm tra các đặc tính của PHP V5.3.0 dưới kính hiển vi
publish-date=01282011