Welcome to rocktonam

Tuesday, April 25, 2006

Happy birthday to you!

Vậy là một sinh nhật nữa lại đến!
Thực ra mình chẳng mong mỏi sinh nhật gì cả, nhiều năm qua sinh nhật chẳng có gì vui! Tất cả chỉ là những phút để nhìn lại mình, xem năm qua đã làm được gì và chưa làm được gì, trong tuổi mới sẽ phải làm gì. Những ngày sinh nhật, chỉ muốn ngồi một mình, nghĩ về những gì đã qua, niềm vui dường như là quá ít, lúc nào cũng là những cố gắng, những khó khăn, những vấp váp, những vững vàng, những cô đơn, những rock,...và rock!
Cuộc sống đã mang lại cho mình nhiều bài học, có những bài học đến một cách giản dị, nhưng cũng những bài học đến một cách đắt giá. 25 năm trên cuộc đời, có lẽ không có một năm nào đặc biệt cả, hoặc là có thể có ở những năm bé thơ mà mình không thể nào nhớ được. Tuy là không có gì đặc biệt, nhưng bản thân nó cũng là điều đặc biệt rồi.
Trong 25 năm qua, mình đã trải qua những thành công nho nhỏ, nhưng cũng đã trải qua nhiều thất bại lớn hơn! Thật là trớ trêu! Nhưng cũng từ những thất bại đó mà giúp mang lại cho mình sự bình thản, sự kiên cường, sự cứng cỏi, sự lạnh lùng, niềm tin, lòng quyết tâm, sự cô đơn, sự nhàm chán và ... rock.
25 năm là một chặng đường dài của cuộc đời, trong 5 năm tới sẽ có nhiều việc phải làm, rất nhiều. Dù thành công hay thất bại, dù một mình hay có ai khác, tất cả vẫn phải cố gắng để làm những công việc đó.
Chúc mừng sinh nhật!

Thursday, April 13, 2006

Khám phá PHP 5

Không ai có thể nói trước được rằng liệu PHP 5 có thành công được như PHP 3 và PHP 4 hay không nhưng phải khẳng định một điều chắc chắn rằng lần cập nhật ngôn ngữ đánh dấu một bước tiến rất dài của PHP để tiếp tục duy trì vị thế dẫn đầu của nó như là một ngôn ngữ viết kịch bản web phổ biến nhất trên thế giới. Bài viết này cố gắng cung cấp cho bạn một cái nhìn tổng thể về những điểm cải tiến của PHP 5 trên các phương diện:tính năng ngôn ngữ, các phần mở rộng mới và những thay đổi đáng ghi nhận khác.

CÁC TÍNH NĂNG NGÔN NGỮ
- Mô hình hướng đối tượng mới
Khi Zeev Suraski đưa cú pháp hướng đối tượng vào PHP từ cái thời của PHP3 thì những lập trình viên chuyên nghiệp có thể dễ dàng nhận ra chúng giống như một thứ gia vị để truy cập vào các collection. Mô hình hướng đối tượng này cũng hỗ trợ kế thừa và cho phép một lớp (và đối tượng) gộp cả phương thức và các thuộc tính lại với nhau, nhưng không đầy đủ. KhiZeev và Andi viết lại phần mềm xử lý kịch bản cho PHP 4, thì đó là một phần mềm xử lý hoàn toàn mới, chạy nhanh hơn, ổn định hơn và nhiều tính năng hơn. Tuy nhiên, mô hình hướng đối tượng tồn dư từ PHP 3, thì hầu không được chú ý đến. Mặc dù mô hình đối tượng này cực kì hạn chế song chúng vẫn được sử dụng hết sức rộng rãi trên thế giới thậm chí là ngay cả trong các ứng dụng PHP rất lớn. Nhu cầu sử dụng rất cao đối với mô hình lập trình kém của nó đã khiến cho các nhà kiến tạo ngôn ngữ quyết định chọn nó làm mục tiêu chính để nâng cấp PHP 4 lên PHP 5.

Vậy đâu là những giới hạn của PHP 3 và 4?

Giới hạn lớn nhất (làm nền cho các giới hạn khác) là ở chỗ ngữ nghĩa của việc sao chép (copy) trên các đối tượng không khác gì so với các kiểu native. Vậy thì điều này có tác động ra sao đến các nhà phát triển PHP? Khi bạn gán một biến (trỏ đến một đối tượng) vào một biến khác, thì một bản sao của đối tượng đó sẽ được tạo ra. Điều này không chỉ tác động đến tốc độ xử lý mà nó còn thường xuyên dẫn tới những cách hoạt động và những lỗi không thể giải thích trong các ứng dụng PHP 4 bởi vì nhiều nhà phát triển nghĩ rằng cả hai biến đều sẽ trỏ đến cùng một đối tượng mà điều này thì lại không hề xảy ra trên thực tế. Chúng lại trỏ đến các bản sao riêng rẽ của cùng một đối tượng, và dĩ nhiên việc thay đổi một bản sao sẽ không làm thay đổi bản sao còn lại.
Ví dụ:
class Person {
var $name;
function getName() {
return $this->name;
}
function setName($name) {
$this->name = $name;
}
function Person($name) {
$this->setName($name);
}
}
function changeName($person, $name) {
$person->setName($name);
}
$person = new Person(“Andi”);
changeName($person, “Stig”);
print $person->getName();

Trong PHP 4, đoạn mã này sẽ in ra “Andi”. Lý do là ở chỗ chúng ta truyền đối tượng $person vào hàm changeName() theo giá trị, và do vậy, $person được sao chép và changeName() hoạt động trên một bản sao của $person.
Cách hoạt động này không dễ nắm bắt, vì nhiều lập trình viên nghĩ là nó sẽ hoạt động kiểu Java. Trong Java, các biến thực sự nắm giữ một biến điều khiển tức handle (hay còn gọi là pointer chỉ tới đối tượng, và được sao chép mà thôi chứ không phải là toàn bộ đối tượng.
Có hai cấp độ người sử dụng trong PHP 4, một cấp là biết điều này, cấp độ kia thì không. Những người thuộc cấp độ thứ hai thường không để ý đến vấn đề này và trong mã nguồn mà họ viết cũng cho thấy là họ không hề quan tâm đến liệu điều đó có tồn tại hay không. Chắc chắn là những người này sẽ mất rất nhiều công sức để tìm ra nguyên nhân gây ra các lỗi rất lạ lùng mà họ sẽ không thể nào tìm thấy. Những lập trình viên nhận thức được sự khác biệt này của PHP4 đã xử lý vấn đề này bằng cách luôn gán và truyền đối tượng theo tham chiếu. Điều này sẽ ngăn bộ xử lý kịch bản không cho nó sao chép đối tượng.
Mô hình đối tượng trên không chỉ dẫn tới vấn đề trên mà còn dẫn tới các vấn đề cơ bản khác nữa là nó cản trở việc thực thi một số tính năng phụ thêm dựa trên mô hình đối tượng hiện thời.
Trong PHP 5, cơ sở hạ tầng của mô hình hướng đối tượng đã được viết lại để làm việc được với các biến điều khiển đối tượng (object handle). Nếu bạn không nhân bản một đối tượng một cách tường minh bằng cách dùng từ khóa clone thì bạn sẽ không bao giờ sao chép các đối tượng của mình được. Trong PHP 5, chúng ta sẽ không cần truyền các đối tượng theo tham chiếu cũng như không cần gán chúng theo tham chiếu.
Chú ý: Việc truyền theo tham chiếu và gán theo tham chiếu vẫn còn tiếp tục được hỗ trợ, trong trường hợp bạn thực sự muốn thay đổi nội dung của biến (hoặc đối tượng hoặc kiểu khác).

Các tính năng hướng đối tượng mới

PHP 5 đã được bổ sung rất nhiều tính năng mới nhưng do khuôn khổ bài báo có hạn nên chúng tôi chỉ tập trung mô tả sơ lược một số tính năng chính. 1. Các từ khóa điều khiển hướng truy cập public/private/protected dành cho các phương thức và thuộc tính
Cho phép sử dụng các từ khóa điều khiển tầm vực truy cập hướng đối tượng (access modifier) để kiểm soát sự truy cập đến các phương thức và các thuộc tính.

class MyClass {
private $id = 18;
public function getId() {
return $this->id;
}
}
2. Phương thức khởi tạo thống nhất (unified constructor) với tên gọi __construct() Thay vì phương thức khởi tạo có tên trùng với tên lớp, từ nay nó nên được khai báo là __construct(), tạo điều kiện dễ dàng hơn để chuyển các lớp vào bên trong các cây phân cấp lớp.

class MyClass {
function __construct() {
print “Inside constructor”;
}
}
3. Hỗ trợ phương thức hủy đối tượng (object destructor) bằng việc định nghĩa thêm phương thức __destructor()
Cho phép định nghĩa một hàm hủy đối tượng sẽ chạy khi một đối tượng được hủy bỏ.
class MyClass {
function __destruct() {
print “Destroying object”;
}
}
?>
4. Giao diện (interface)
Giúp một lớp có khả năng hiện thực nhiều mối quan hệ là-một (is-a realationship). Một lớp chỉ có thể kế thừa từ duy nhất một lớp nhưng lại có thể thực thi nhiều giao diện mà nó muốn.
interface Display {
function display();
}
class Circle implements Display {
function display() {
print “Displaying circle “;
}
}
5. Toán tử instance of
Đây là sự hỗ trợ ở cấp độ ngôn ngữ để kiểm tra mối quan hệ là-một. Hàm is_a() trong PHP 4 từ nay sẽ được đưa vào danh sách khuyến cáo không nên dùng.

if ($obj instance of Circle) {
print ‘$obj is a Circle’;
}
6. Các phương thức final
Từ khóa final cho phép bạn đánh dấu các phương thức để một lớp kế thừa không nạp chồng (overload)> lên chúng.
class MyClass {
final function getBaseClassName() {
return __CLASS__;
}
}
7. Các lớp final
Sau khi khai báo một lớp là final, thì lớp đó không thể cho lớp khác kế thừa được nữa. Ví dụ sau sẽ gặp lỗi:

final class FinalClass {
}
class BogusClass extends FinalClass {
}
8. Nhân bản đối tượng tường minh
Để nhân bản một đối tượng, bạn cần phải sử dụng từ khóa clone. Bạn có thể khai báo một phương thức __clone() để gọi nó ra trong quá trình nhân bản (sau khi các thuộc tính đã được sao chép từ đối tượng gốc.

class MyClass {

function __clone() { print “Object is being cloned”;
}
}
$obj = new MyClass();
clone $obj;
9. Hằng lớp
Các định nghĩa lớp từ nay có thể chứa các giá trị không thay đổi hay còn gọi là hằng số, và chúng được> tham chiếu bằng cách sử dụng lớp.
class MyClass {
const SUCCESS = “Success”;
const FAILURE = “Failure”;
}
print MyClass::SUCCESS;

10. Các biến thành viên tĩnh
Phần định nghĩa lớp từ nay có thể chứa các biến thành viên tĩnh (thuộc tính), có thể truy cập vào qua lớp. Cách sử dụng phổ biến của các thành viên tĩnh là trong mô hình thiết kế Singleton.
class Singleton {
static private $instance = NULL;
private function __construct() {
}
static public function getInstance() {
if (self::$instance == NULL) {
self::$instance = new Singleton();
}
return self::$instance;
}
}
11. Các phương thức tĩnh
Từ nay bạn có thể định nghĩa các phương thức là tĩnh, điều này cho phép chúng được gọi từ các bộ phận không tĩnh. Các phương thức tĩnh không định nghĩa biến $this vì chúng không bị ràng buộc vào bất cứ một đối tượng cụ thể nào cả.
class MyClass {
static function helloWorld() {
print “Hello, world”;
}
}
MyClass::helloWorld();
?>
12. Các lớp trừu tượng
Một lớp có thể được khai báo là abstract để ngăn không cho nó được khởi tạo. Tuy nhiên, bạn có thể kế thừa từ một lớp trừu tượng.

abstract class MyBaseClass {
function display() {
print “Default display routine being called”;
}
}
13. Các phương thức trừu tượng
Một phương thức có thể được khái báo là abstract, và bằng cách đó nhượng lại phần định nghĩa của nó cho một lớp kế thừa. Một lớp có chứa các phương thức trừu tượng phải được khai báo là abstract.
abstract class MyBaseClass {
abstract function display();
}
14. Ký pháp gợi nhắc (hint) kiểu lớp
Phần khai báo hàm có thể chứa ký pháp gợi nhắc kiểu lớp cho phần tham số của chúng. Nếu các hàm đó được gọi với kiểu lớp không chính xác thì một lỗi sẽ xuất hiện.
function expectsMyClass(MyClass $obj) {
}

15. Hỗ trợ việc hủy tham chiếu đến các đối tượng> mà được trả lại từ các phương thức. Trong PHP 4, bạn không thể nào trực tiếp hủy bỏ tham chiếu đến các đối tượng được trả lại từ các phương thức. Đầu tiên bạn sẽ phải gán đối tượng đó cho một biến dummy nào đó và sau đó hủy tham chiếu đến nó. PHP 4:
$dummy = $obj->method();
$dummy->method2();
PHP 5:
$obj->method()->method2();


16. Phần tử lặp (Iterator)
PHP 5 cho phép các lớp PHP và lớp PHP mở rộng hiện thực giao diện Iterator. Một khi đã hiện thực giao diện này, bạn sẽ có thể lặp trên các thể hiện của một lớp bằng cách dùng cấu trúc foreach() của ngôn ngữ.

$obj = new MyIteratorImplementation();
foreach ($obj as $value) {
print “$value”;
}
17. Hàm _autoload()

Nhiều nhà phát triển viết ứng dụng hướng đối tượng thích tạo một file PHP cho mỗi định nghĩa lớp. Một trong những điều bất tiện nhất là phải viết lại một danh sách dài các file cần include trong mỗi tập tin. Trong PHP 5, điều này là không còn cần thiết nữa. Bạn có thể định nghĩa một hàm _autoload(), hàm này sẽ tự động được gọi trong trường hợp bạn dùng một lớp chưa được định nghĩa. Bằng cách gọi hàm này, chương trình dịch sẽ cố nạp lại lớp trước khi PHP trả về thông báo lỗi.

function __autoload($class_name) {
include_once($class_name . “php”);
}
$obj = new MyClass1();
$obj2 = new MyClass2();


CÁC ĐẶC ĐIỂM MỚI KHÁC CỦA NGÔN NGỮ
1. Quản lý biệt lệ (exeption)
PHP 5 thêm vào chức năng quản lý biệt lệ theo mô hình khá nổi tiếng là try/throw/catch. Bạn chỉ có thể dùng chức năng này cho những lớp dẫn xuất từ lớp Exception.

class SQLException extends Exception {
public $problem;
function __construct($problem) {
$this->problem = $problem;
}
}
try {
...
throw new SQLException(“Couldn’t connect to database”);
...
} catch (SQLException $e) {
print “Caught an SQLException with problem $obj->problem”;
} catch (Exception $e) {
print “Caught unrecognized exception”;
}

Vào thời điểm hiện tại, để bảo đảm khả năng tương thích ngược, hầu hết các hàm nội đều không có phần quản lý biệt lệ. Tuy nhiên, các phần mở rộng mới sẽ có chức năng này và bạn có thể dùng chúng trong mã nguồn. Ngoài ra, giống như hàm set_error_handler(), bạn có thể dùng hàm set_exception_handler() để đón bắt (catch) các biệt lệ ngoài ý muốn.

2. Dùng foreach với các tham khảo. Trong PHP 4, bạn không thể lặp trong một mảng và thay đổi giá trị các phần tử. PHP 5 hỗ trợ khả năng này bằng cách cho phép bạn đánh dấu vòng lặp foreach() với ký hiệu & (tham khảo). Bằng cách này, bạn có thể> thay đổi giá trị các phần tử trong mảng một cách dễ dàng.
foreach ($array as &$value) {
if ($value === “NULL”) {
$value = NULL;
}
}
3. Trị mặc định cho các tham số truyền bằng tham khảo
Trong PHP 4, trị mặc định chỉ có thể dùng cho các tham số truyền bằng trị. Trong phiên bản mới này, việc> truyền trị mặc định cho tham số truyền bằng tham khảo đã được hỗ trợ
function my_func(&$arg = null) {
if ($arg === NULL) {
print ‘$arg is empty’;
}
}
my_func();




NHỮNG THAY ĐỔI CHUNG XML và dịch vụ Web
Trong số những thay đổi trong ngôn ngữ, việc cập nhật tính năng hỗ trợ XML trong PHP 5 là quan trọng và lý thú nhất. Các chức năng XML tăng cường trong PHP 5 đã đặt PHP ngang hàng với các công nghệ web khác và có phần còn vượt trội hơn.
Nền tảng

Trong PHP 4, XML được hỗ trợ thông qua nhiều thư viện XML nền. Hỗ trợ cho SAX được hiện thực bằng thư viện Expat, XSLT được hiện thực dùng thư viện Sablotron (hoặc dùng libxml2 thông qua DOM mở rộng) và DOM được hiện thực dùng thư viện libxml2 của GNOME.

Việc sử dụng quá nhiều thư viện không làm cho PHP 4 mạnh mẽ hơn trong việc hỗ trợ XML. Việc bảo trì là khá vất vả, các chuẩn XML không phải lúc nào cũng được hỗ trợ, tốc độ thực thi cũng không cao và nhất là sự liên kết giữa các phần mở rộng XML chưa được hỗ trợ.
Trong PHP 5, tất cả các phần mở rộng XML đều được viết lại dùng bộ công cụ libxml2 XML toolkit (http://www.xmlsoft.org). Nó có nhiều chức năng, dễ bảo trì và việc hiện thực hiệu quả các chuẩn XML làm cho PHP hỗ trợ XML tốt hơn bao giờ hết. Tất cả các phần mở rộng đề cập ở trên (SAX, DOM và XSLT) đều dùng libxml2 bao gồm cả các phần mở rộng bổ sung như SimpleXML và SOAP.
SAX
Như đã đề cập, hiện thực mới cho SAX đã chuyển từ Expat sang libxml2. Mặc dù phần mở rộng mới vẫn tương thích, nhưng vẫn có một số khác biệt nhỏ. Các nhà phát triển nếu vẫn muốn dùng thư viện Expat có thể cấu hình và build lại PHP (tuy nhiên, cách làm này không được khuyến cáo)
DOM
Mặc dù sự hỗ trợ DOM trong PHP 4 cũng dựa trên libxml2, nhưng việc hiện thực còn khá nhiều lỗi, làm rò rỉ bộ nhớ và một số hàm API vẫn không tương thích với chuẩn W3C. Bộ mặt của DOM trong PHP 5 đã hoàn toàn thay đổi. Không chỉ là do nó đã được viết lại hoàn toàn mà nó còn tương thích với W3C. Ví dụ, các tên hàm được đặt lại theo chuẩn W3C làm cho việc tham khảo các tài liệu chuẩn W3C trở nên dễ dàng hơn và bạn có thể thực hành những gì đã học được ngay trong PHP. Thêm vào đó, phần mở rộng DOM bây giờ hỗ trợ cả 3 loại lược đồ xác nhận XML (DTD, XML Schema và RelaxNG).
Dĩ nhiên, với những thay đổi lớn như vậy, mã PHP 4 dùng DOM sẽ không chạy được trên PHP 5. Tuy nhiên, trong hầu hết các trường hợp, việc thay đổi lại tên hàm theo tiêu chuẩn mới có thể làm mã PHP 4 chạy được trong PHP 5.
XSLT
Trong PHP 4, có 2 phần mở rộng hỗ trợ XSLT. Phần thứ nhất dùng Sablotron và phần thứ hai dùng hỗ trợ XSLT trong phần mở rộng DOM. Trong PHP 5, một phần mở rộng mới đã được viết lại dựa trên phần mở rộng libxml2. XSLT trong PHP 5 không nhận XSLT stylesheet như là tham số mà phụ thuộc vào DOM để tải, stylesheet có thể được cache trong bộ nhớ và dùng cho nhiều tài liệu để tiết kiệm thời gian thực thi.
SimpleXML
Nhìn lại những năm trước đây, chúng ta thấy SimpleXML đã làm thay đổi cách nhà phát triển PHP làm việc với các file XML. Thay vì phải dùng DOM hay SAX, SimpleXML thể hiện file XML như là một đối tượng thành phần của PHP. Bạn có thể đọc, ghi hay lặp trên file XML với các thành phần và thuộc tính dễ truy xuất.
Xem xét file XML sau:


John Doe
87234838


Janet Smith
72384329


Sau đây là đoạn mã in ra tên khách hàng (name) và số tài khoản (account number):
$clients = simplexml_load_file(‘clients.xml’);
foreach ($clients->client as $client) {
print “$client->name has
account number $client->account_
number;
}
Rõ ràng việc sử dụng SimpleXML là khá đơn giản. Và trong một số trường hợp muốn dùng vài tính năng cao cấp mà SimpleXML không hỗ trợ, bạn có thể chuyển nó sang DOM bằng cách gọi hàm dom_import_simplexml(), điều chỉnh nó trên DOM và chuyển kết quả lại cho SimpleXML bằng cách gọi hàm simplexml_import_dom().
SOAP
Hỗ trợ chính thức cho SOAP trong PHP 4 khá hạn chế. Hiện thực thường được dùng của SOAP là PEAR hoàn toàn được viết bằng PHP nên không thể thực thi tốt như các phần mở rộng viết trên C. Ngược lại, các phần mở rộng viết trên C chưa bao giờ đạt được tính ổn định và được sự chấp nhận rộng rãi, nên chúng sẽ không được bao gộp trong bản phân phối chính thức của PHP 5 nữa.
Hỗ trợ cho SOAP trong PHP 5 đã được viết lại hoàn toàn dưới dạng các phần mở rộng C. Dù chúng chỉ được hoàn thành trong giai đoạn cuối của quá trình thử nghiệm beta nhưng nó vẫn được dùng trong bản phân phối chuẩn do hiện thực rất kỹ càng hầu hết các chuẩn SOAP hiện nay.
Lời gọi hàm SomeFunction() được định nghĩa trong một file WSDL như sau:

$client = new SoapClient(“some. wsdl”);
$client->SomeFunction($a, $b,$c)
MySQLi (MySQL tăng cường)

Đối với PHP 5, MySQL AB (http://www.mysql.com) đã viết một phần mở rộng mới cho phép bạn sử dụng tất cả các chức năng mới kể từ phiên bản MySQL 4.1. Khác với phần mở rộng cũ, phiên bản mới cung cấp cho bạn cả giao diện hướng đối tượng và giao diện hướng thủ tục để bạn lựa chọn. Những chức năng mới hỗ trợ trong phiên bản này bao gồm cả chức năng chuẩn bị cho câu lệnh và ràng buộc biến, hỗ trợ SSL và kết nối nén dữ liệu, điều khiển giao dịch, hỗ trợ nhân bản cơ sở dữ liệu và nhiều thứ khác. SQLite Hỗ trợ cho SQLite (http://www.sqlite.com) được giới thiệu lần đầu tiên trong PHP 4.3.x. Đây là một thư viện SQL nhúng không đòi hỏi bất cứ một máy chủ SQL nào, rất thích hợp cho các ứng dụng không đòi hỏi đến sức mạnh của một SQL server hoặc nếu bạn đang triển khai ứng dụng trên một máy chủ không cho phép truy xuất SQL Server.

Không giống như tên gọi, SQLite (SQL Lite – SQL thu gọn) có rất nhiều chức năng và hỗ trợ cả giao dịch, truy vấn con, các view và các file dữ liệu lớn. SQLite được đề cập như là một tính năng của PHP 5 vì nó được giới thiệu khá muộn trong dòng PHP 4 và nó tận dụng được những ưu thế của PHP 5 bằng cách cung cấp một giao diện hướng đối tượng và hỗ trợ vòng lặp.

Tidy
PHP 5 bao gồm phần hỗ trợ cho thư viện Tidy (http://tidy.sf.net) . Nó cho phép nhà phát triển PHP phân tích, chuẩn đoán, sửa chữa tài liệu HTML. Tidy hỗ trợ cả giao diện hướng thủ tục và hướng đối tượng, API của nó dùng cơ chế kiểm soát biệt lệ của PHP 5.

Perl
Mặc dù không được đóng gói trong phiên bản chuẩn của PHP 5, phần mở rộng Perl cho phép bạn gọi mã Perl, sử dụng các đối tượng Perl và dùng các chức năng riêng khác của Perl bên trong mã PHP. Phần mở rộng mới này cùng với PECL (PHP Extension Community Library) có thể được tìm thấy tại http://pecl.php.net/package/ perl.
Một số thứ khác
Trình quản lý bộ nhớ mới Zend Engine giới thiệu một trình quản lý bộ nhớ mới. Hai cải tiến chủ yếu là hỗ trợ môi trường đa luồng tốt hơn, cũng như việc giải phóng bộ nhớ sau khi thực hiện yêu cầu hiệu quả hơn. Vì đây là một cải tiến ở cấu trúc bên trong, nên bạn có thể không nhận thấy một cách rõ ràng khi là người dùng cuối.
Không tiếp tục hỗ trợ Windows 95
Việc thực thi PHP trên Windows 95 không còn được hỗ trợ nữa vì nó không hỗ trợ những chức năng cần thiết cho PHP. Khi Microsoft chính thức tuyên bố ngừng hỗ trợ Windows 95, cộng đồng phát triển PHP đã xem đây là một quyết định sáng suốt.


 

   Copyright © 2005 rocktonam. Contact me at rocktonam@yahoo.com or rocktonam@gmail.com

   Or now you can send your massages to me [rocktonam] -->

   Ghi rõ nguồn rocktonam.blogspot.com khi phát hành lại thông tin từ trang blog này.