PHP4 hay PHP5 ?

Đọc bài viết này của pcdinh trên Goldenkey Forum:

Việc chuyển từ PHP4 sang PHP5 không hề đơn giản. Những sai lầm trong PHP4 đã khiến cho con đường đi đến thành trì của PHP5 chứa đầy sỏi đá và chẳng bằng phẳng.

  1. Thứ nhất, có quá nhiều ứng dụng PHP viết theo kiểu cấu trúc khiến cho tính OO trong PHP5 không hề hấp dẫn. Viết lại chúng ư? Một công việc khổng lồ. Ai sẽ trả tiền?
  2. Thứ hai, có nhiều ứng dụng xen lẫn cả thủ tục và đối tượng, nhưng là một thứ đối tượng dở người của PHP4. Việc chuyển sang chạy trên PHP5 sẽ tạo ra các điểm break mà phát hiện ra chúng không hề dễ dàng.
  3. Thứ ba, dân lập trình PHP đa phần là dân tài tử. PHP đã tạo nên một hàng rào rất thấp khiến cho ai cũng có thể trở thành một lập trình viên. Không có coding convention thống nhất, API thì phi chuẩn, code mã thì thủ tục, không có tiền lệ sử dụng các design pattern, không có sự khuyến khích dùng lại mã, không khuyến khích các best practice trong lập trình, không khuyến khích test driven… Trở nên chuyên nghiệp hơn với OOP ư? Ai sẽ trả tiền?
  4. Thứ tư, đa số các ứng dụng PHP là viết vì lý do cá nhân hoặc là mã nguồn mở viết vì vui thích hay một nhu cầu trước mắt. Điều này khác với Java, một công nghệ hướng vào thị trường doanh nghiệp, nơi mà người ta khuyến khích dùng lại mã vì… ông chủ không vui khi trả tiền 2 lần để có cùng một đoạn mã và này, các lập trình viên trẻ, hãy viết ra sao để khi các cậu đếch làm cho tôi nữa thì sẽ có người khác gánh vác công việc của cậu vì khách hàng đó còn làm việc với chúng ta dài đấy.
  5. Thứ năm, hướng đối tượng ư? Doanh nghiệp ư? Tại sao không phải là Java mà lại là PHP5? Tôi tưởng PHP chỉ dùng để code forum, mấy trang tin nhỏ nho hay đại loại cái gì đó be bé thôi chứ? Cộng đồng PHP ư? Ôi cộng đồng là một lũ nhăng nhố, nay ở mai đi, ai dám khẳng định họ sẽ cam kết cho sự phát triển kinh doanh của tôi? Mã nguồn mở? Chúa ơi, tôi là một bậc thầy về kinh doanh mà Thượng Đế của tôi lại là lợi nhuận. Xin lỗi nhé ông ta không biết đọc mã nguồn. Hãy chỉ cho tôi ai là người có khả năng đọc nó. Chúng tôi cần tiết kiệm tiền nhưng chúng tôi cũng cần nhanh chóng và rủi ro thấp nữa. Mã nguồn mở không có nghĩa là phi rủi ro.
  6. Thứ sáu, chúa ơi, Andi và Gutman có biết đến câu Tồi hơn là tốt hơn không vậy? Xin đứng bắt tôi học thêm. Tại sao tôi phải học nấu cơm trong khi tôi đã có sẵn mì ăn liền. Lập trình PHP4 dễ như đi câu cá. Xin đừng làm cho tính lãng mạng của tôi bị ảnh hưởng với sự trừu tượng của OOP. Đẳng cấp doanh nghiệp ư? Xin đừng làm tôi mê muội bằng những ngôn ngữ mang tính dịch thuật và marketing của nhóm PHPVietnam. Tôi ngán chúng nó đến tận cổ rồi. Dù có thêm PHP5 hay PHP6 thì tôi vẫn chỉ code PHP cho cá nhân tôi và cái phần mềm của tôi vẫn be bé như thế. 10.000 hay 20.000 request 1 giây ư? Lạy chúa, băng thông của con chỉ có 3GB 1 tháng. Xin chúa rủ lòng thương.

Tóm lại, việc chuyển từ PHP4 sang PHP5 đang bị chi phối rất nhiều vào tầm cỡ cộng đồng (dân PHP không có nhiều người thông minh đâu), tính tương thích của các ứng dụng đang dùng, số ứng dụng mới có khả năng thay thế chạy được trên PHP5, tâm lý chống đối và ngại chuyển đổi, sự đón nhận PHP từ phía doanh nghiệp. Đây là những điều mà tôi đã rút ra sau khi đã lập ra PHPVietnam.

Thời gian sẽ trả lời và việc quyết định là tùy ở bạn

và thêm nữa của lineage

em có đọc một bài của một tiền bối với 30 năm kinh nghiệm làm về software engineering ở Carnegie Mellon University (một trong những trường dạy về Khoa học máy tính danh tiếng nhất nhì thế giới) , ông ấy nói rằng giới trẻ đừng bao giờ nên học .NET trước tiên mặc dù .NET rất là mạnh. Hãy học về Java, Perl hay Python trước để nắm được cái nền tảng về lập trình hướng đối tượng rồi sau đó học .NET sẽ nhanh hơn, hiểu rõ hơn. Ông ấy nói với cách học này ông tin chắc rằng người học sẽ tiến xa hơn rất nhiều, giỏi hơn nhiều so với những anh lười nhác chỉ biết dựa vào những công cụ có sẵn trong .NET. Ông ấy nói Java và .NET không có khác gì nhau xét về nguyên lý vì .NET là một bản sao của Java về mặt ý tưởng + phong cách và những toan tính của Microsoft mà thôi. Microsoft bao giờ cũng là công ty có khả năng tạo ra các công cụ dễ làm việc nhất. Nhưng trong khi tạo điều kiện về mọi thứ thì user lại hòan toàn bị lệ thuộc. Họ chỉ biết kéo và thả hoặc chỉ biết ấn nút chứ đâu có biết cái gì nằm bên dưới. Rồi dần dần, cái ấn nút và kéo thả làm cho họ lười đi, họ quen với cái đó, họ không thể dứt ra được. Họ bị chi phối hòan toàn bởi M$. Chuyển sang một ngôn ngữ mới ư ? Nhiều người chuyên về .NET (không phải tất cả) sẽ hỏi: nó có kéo thả không, nó có tiện ích như Visual Studio không…. Nghĩa là tài năng của họ đang thui chột, tính cơ động và khả năng ứng biến của họ đang giảm sút rõ rệt. Những người như thế khi công nghệ thay đổi họ dễ bị đứt quá vì khả năng học của họ giảm đi quá nhiều. Giống như con gà tre (sống bờ bụi) với con gà công nghiệp ấy mà. Dân .NET nhiều người tự biến họ thành con gà công nghiệp. Các bác không tin ư? Cứ hỏi mấy bác chuyển từ VB 6 sang Java mà xem: luôn miệng hỏi: công cụ nào hỗ trợ kéo và thả để tạo giao diện. Ở Java không có tiền lệ đó mặc dù NetBeans có hỗ trợ kéo và thả. Chính vì thế, giới lập trình luôn coi trọng trình độ của dân Java hơn dân .NET. Do phải suy nghĩ nhiều hơn, làm việc nhiều hơn nên giới công nghệ ở Mĩ gọi dân Java là dân smart (thông minh).

Điều không may là ở giới PHP có nhiều người thiếu chuyên nghiệp, họ viết mã nhưng lại không hiểu gì về software engineering vì họ chẳng quan tâm đến điều đó. Trên các diễn đàn quốc tế, em gặp khối đứa có 12-13 tuổi code PHP ầm ầm. Hi vọng PHP5 sẽ trấn chỉnh lại hàng rào gia nhập đội ngũ PHP coder, yêu cầu họ nghĩ nhiều hơn trước khi viết, buộc họ đánh giá lại PHP và không coi PHP là ngôn ngữ mì ăn liền nữa.

1 thought on “PHP4 hay PHP5 ?”

  1. Có quá nhiều tính năng mới để có thể đưa ra bình luận trong phần mở đầu này. Trong phần 3 “PHP5 ngôn ngữ hướng đối tượng” sẽ đề cập tới từng tính năng. Danh sách dưới đây cho bạn cái nhìn tổng thể các tính năng chính mới.

    public/private/protected các bổ từ kết nối dành cho các phương thức và thuộc tính. Cho phép sử dụng các hướng đối tượng kết nối bổ từ để điều khiển kết nối tới các phương thức và thuộc tính.
    [sourcecode language=”php”]
    class MyClass{
    private $id = 18;
    public function getId(){
    return $this->id;
    }
    }[/sourcecode]

    constructor (Ở đây chúng ta để nguyên bản từ này mà không dịch).
    Thay vì đặt tên constructor trùng với tên của lớp (class), bây giờ nó được đặt bằng cái tên _construct(),
    [sourcecode language=”php”]
    class MyClass{
    function _construct()
    {
    Print “Inside constructor”;
    }
    }[/sourcecode]

    destructor (ở đây chúng ta không dịch từ này, chúng ta có thể hiểu destructor sẽ được triệu gọi khi một đối tượng bị ngưng hoạt động – hủy bỏ). destructor được xác định bằng phương thức _destruct().
    [sourcecode language=”php”]
    class MyClass
    {
    function _destruct()
    {
    Print “Destroying object”;
    }
    }[/sourcecode]

    Giao diện
    Mang lại cho class khả năng có thể thi hành được thêm nhiều hơn một quan hệ “là một”. Một lớp có thể kế thừa duy nhất từ một lớp khác, nhưng có thể bổ xung thêm nhiều “giao diện” bao nhiêu mà nó muốn
    [sourcecode language=”php”]
    interface Display
    {
    function display();
    }

    class Circle implements Display{
    Function display()
    {
    Print “Displaying circle ”;
    }
    }
    [/sourcecode]
    Tóan tử instanceof
    Trong lập trình PHP hỗ trợ việc kiểm tra mối quan hệ “là một”. Trong PHP4 hàm is_a() bây giờ được chuyển thành
    [sourcecode language=”php”]
    if($obj instanceof Circle)
    {
    print “$obj is a Circle”;
    }
    [/sourcecode]
    Phương thức kết thúc
    Từ khóa final cho phép bạn đánh dấu các phương thức mà một lớp kế thừa không thể chồng chất chúng.
    [sourcecode language=”php”]
    class MyClass
    {
    Final function getBaseClassName()
    {
    return _CLASS_;
    }
    }
    [/sourcecode]
    Kết thúc lớp
    Sau khi định vị một lớp là final, nó không thể được kế thừa. Ví dụ sau đây sẽ trả lại lỗi.
    [sourcecode language=”php”]
    final class FinalClass
    {}

    class BogusClass extends FinalClass
    {}
    [/sourcecode]
    “nhái” đối tượng.
    Để nhái lại một đối tượng, bạn phải sử dụng từ khóa clone. Bạn có thể khai báo một phương thức _clone(), phương thức này sẽ được triệu gọi trong quá trình “nhái” (sau khi các thuộc tính đã được sao chép từ một đối tượng ban đầu).
    [sourcecode language=”php”]
    class MyClass{
    function _clone(){
    Print “Object is being cloned”;
    }
    }

    $obj = new MyClass();
    $obj_copy = clone $obj;
    [/sourcecode]
    Các hằng của lớp
    Bây giờ chúng ta có thể đưa các giá trị của hằng vào trong lớp và có thể được sử dụng bằng cách tham chiếu tới nó:
    [sourcecode language=”php”]
    class MyClass()
    {
    const SUCCESS = “Success”;
    const FAILURE = “Failure”;
    }

    print myClass::SUCCESS;
    [/sourcecode]
    Các phương thức tĩnh
    Bây giờ bạn có thể định nghĩa các phương thức tĩnh bằng các cho phép chúng có thể được gọi từ một ngữ cảnh không có đối tượng nào. Các phương thức tĩnh không định nghĩa biến $this bởi vì chúng không hướng tới đối tượng xác định nào:
    [sourcecode language=”php”]
    class MyClass{
    static function helloWorld()
    {
    print “Hello World”;
    }
    }
    [/sourcecode]
    Các bộ phận tĩnh
    Các định nghĩa của lớp bây giừo có thêm các bộ phận tĩnh (các thuộc tính) có thể được kết nối thông qua lớp. Cách sử dụng thông dụng của các bộ phận tĩnh theo mẫu dưới đây:
    [sourcecode language=”php”]
    class Singleton{
    static private $instance = NULL;
    private function _construct()
    {}

    static public function getInstance()
    {
    if(self::$instance == NUL)
    {
    self::$instance = new Singleton();
    }
    return self::$instance;
    }
    }
    [/sourcecode]
    Các lớp trừu tượng
    Một lớp có thể được xác định bằng abstract để ngăn chúng khỏi việc thiết lập (thuyết minh một điều trừu tượng bằng đối tượng cụ thể). Mặc dù vậy bạn có thể kế thừa từ một lớp trừu tượng:
    [sourcecode language=”php”]
    abstract class MyBaseClass{
    function display()
    {
    print “Default display routine being called”
    }
    }
    [/sourcecode]
    Phương thức trừu tượng
    Một phương thức có thể được xác định bằng abstract, bằng cách đó nó sẽ được làm theo định nghĩa của lớp kế thừa. Một lớp có các phương thức trừu tượng phải được xác định bằng abstract:
    [sourcecode language=”php”]abstract class MyBaseClass
    {
    function display()
    {
    abstract function display();
    }
    }
    [/sourcecode]
    Lớp kiểu gợi ý
    Các định nghĩa mà có thể được thêm lớp kiểu gợi ý cho các thông số của chúng. Nếu như hàm được gọi với kiểu của lớp sai thì sẽ đưa ra thông báo lỗi:
    [sourcecode language=”php”]
    function expectsMyClass(MyClass $obj)
    {}
    [/sourcecode]
    Hỗ trợ “phá tham chiếu” các đối tượng được trả lại từ các phương thức
    Trong PHP4, bạn không thể phá tham chiếu trực tiếp các đối tượng được trả lại từ các phương thức. Ban đầu bạn phải khai báo đối tượng cho một biến giả và sau đó phá tham chiếu.
    [sourcecode language=”php”]
    PHP4:
    $dummy = $obj->method();
    $dummy->method2();

    PHP5:

    $obj->method()->method2();
    [/sourcecode]
    Các biến lặp
    PHP5 cho phép cả các lớp và các lớp PHP mở rộng để bổ xung thêm một giao diện biến lặp. Sau khi bạn bổ xung giao diện này, bạn có thể lặp đi lặp lại kiến nghị của lớp bằng cách sử dụng foreach():
    [sourcecode language=”php”]
    $obj = new MyIteratorImplementation();
    foreach($obj as $value)
    {
    print $value;
    }
    [/sourcecode]
    Để có ví dụ tổng quan hơn trong chuyên mục 4, “Lập trình hướng đối tượng nâng cao và Thiết kế kiểu mẫu trong PHP5”

    [sourcecode language=”php”]_autoload().[/sourcecode]
    Nhiều các developer viết các ứng dụng hướng đối tượng tạo một tập tin nguồn PHP cho mỗi một định nghĩa lớp. Một trong những điều phiền phức nhất là phải viết một danh sách dài các phần thêm vào ở dầu mỗi một kịch bản (mỗ lớp một danh sách). Trong PHP5, điều này không còn cần thiết nữa. Bạn có thể định nghĩa một hàm _autoload() tự động được triệu gọi trong trường hợp bạn cố gắng sử dụng một lớp mà nó vẫn chưa được định nghĩa. Bằng cách triệu gọi hàm này, bộ máy biên dịch sẽ cố gắng gọi lớp một lần nữa trước khi mà PHP thông báo lỗi:
    [sourcecode language=”php”]function _autoload($class_name)
    {
    include_once($class_name . “php”);
    }

    $obj = new MyClass1();
    $obj2 = new MyClass2();
    [/sourcecode]
    (theo Lương Tuấn anh – http://www.programmingschool.net) .

    Trong programmingschool.net còn rất nhiều bài về PHP5, Ajax, bà con thử tham khảo xem. Hệ thống ansahi cũng được làm bằng php, ajax do một người việt thiết kế và xây dựng.

Comments are closed.