Hướng dẫn dùng programing php trong PHP

Trong phần chơi mã PHP trong ứng dụng chuyên nghiệp, bạn có thể tải xuống phần mềm PHP Code Play và cài đặt nó trên PC Windows. PHP Code Play là một ứng dụng Giáo dục miễn phí. Phiên bản mới nhất của PHP Code Play là 1.9. Nói chung, hầu hết các ứng dụng hàng đầu trên Android Store đều có xếp hạng. Trong ứng dụng PHP Code Play này, chúng ta có thể học về PHP. Ngoài ra, chúng tôi tập trung vào hầu hết các phiên bản PHP như phiên bản PHP 5 PHP 7.2 PHP 7.

Ứng dụng chơi mã PHP này có một trình biên dịch PHP xây dựng hoặc trình chạy mã PHP, vì vậy có thể chạy hầu hết các mã PHP và hiển thị đầu ra của nó giống như đầu ra của trình duyệt PHP thực. Mã PHP đã cho của bạn được chuyển đổi từ mã PHP chuyển đổi sang mã HTML.

PHP Code Play hỗ trợ phát triển PHP dễ học và cơ sở dữ liệu PHP, đây là trình soạn thảo PHP tốt nhất cho android hoặc PHP cho ứng dụng Android, cũng giống như một cuốn sách không có PHP.

Ứng dụng này giống như một hướng dẫn PHP di động. Sau khi tạo mã PHP, bạn có thể xuất bản mã đó lên máy chủ lưu trữ bằng cách sử dụng nhà cung cấp dịch vụ lưu trữ như GoDaddy hoặc nhà cung cấp dịch vụ lưu trữ khác. Điều này không chỉ hỗ trợ PHP mà còn hỗ trợ 100% cho HTML, vì vậy chúng ta có thể gọi là trình soạn thảo HTML PHP. Chúng tôi có rất nhiều câu hỏi và câu trả lời phỏng vấn PHP vì vậy bằng cách tham khảo ứng dụng chơi mã PHP này, bạn có thể nhận được các công việc PHP dễ dàng hơn. Sử dụng mã PHP, bạn có thể thực hiện trò chuyện trực tiếp PHP.

Đây là ứng dụng di động PHP tốt nhất, ghi chú PHP và sổ ghi chú PHP. Điều này hoạt động mà không cần bất kỳ kết nối internet, tất cả nội dung là hướng dẫn ngoại tuyến PHP.

PHP Quiz
Chúng tôi có rất nhiều câu đố PHP, vì vậy ứng dụng chơi mã PHP này là ứng dụng câu đố PHP tốt nhất và ứng dụng tham khảo PHP tốt nhất. Tất cả các hướng dẫn PHP đều rất dễ học và hiểu. Chúng tôi có thể chạy mã này trên máy tính với sự trợ giúp của xampp với PHP. Một trong những ứng dụng PHP tải xuống tốt nhất cho tài liệu PHP dành cho nhà phát triển PHP

Câu hỏi và câu trả lời phỏng vấn PHP dành cho người có kinh nghiệm và người mới học. Toàn bộ các khái niệm trong PHP có ví dụ rất dễ học ở đây. Vì vậy, đây là ứng dụng học PHP tốt nhất.

Ví dụ: ứng dụng lập trình PHP này chứa nhiều chương trình PHP, điều này giúp bạn thiết kế web PHP.

Ứng dụng “Học PHP” giúp việc học mã của bạn trở nên thú vị cho dù bạn đang muốn tìm hiểu kiến ​​thức cơ bản hay trở thành một lập trình viên chuyên nghiệp. Dưới đây là các tính năng khiến chúng tôi trở thành lựa chọn duy nhất của bạn để học ngôn ngữ lập trình PHP -

Xây dựng các kỹ năng PHP của bạn khi đang di chuyển với ứng dụng miễn phí tuyệt vời này để học Lập trình PHP. Trở thành một chuyên gia lập trình PHP bằng cách học ngôn ngữ mã hóa PHP.

Học PHP là một ứng dụng phải có cho tất cả những người học mã hóa hoặc sinh viên khoa học máy tính để học ngôn ngữ lập trình PHP bất cứ khi nào họ muốn và bất cứ nơi nào họ muốn. Cho dù bạn chuẩn bị cho một cuộc phỏng vấn PHP hoặc bất kỳ kỳ thi nào đòi hỏi kiến ​​thức lập trình PHP, bạn có thể tìm thấy nội dung tuyệt vời trên ứng dụng học lập trình này.

Ứng dụng Học lập trình PHP tuyệt vời này có nội dung tuyệt vời như Hướng dẫn lập trình PHP, Bài học lập trình PHP, Chương trình, Câu hỏi & Trả lời và tất cả những gì bạn cần để học cơ bản về lập trình PHP hoặc để trở thành chuyên gia lập trình PHP.

Với một bộ sưu tập tuyệt vời các Chương trình PHP (ví dụ mã) với các bình luận, nhiều câu hỏi và câu trả lời, tất cả các nhu cầu học lập trình của bạn được gói trong một ứng dụng học mã duy nhất.

****** / TÌM HIỂU
TÍNH NĂNG ỨNG DỤNG
****** / TÌM HIỂU
Ứng dụng Tìm hiểu PHP Ứng dụng làm cho việc học mã của bạn trở nên thú vị cho dù bạn có muốn tìm hiểu những điều cơ bản hay trở thành một lập trình viên chuyên nghiệp. Dưới đây là các tính năng giúp chúng tôi lựa chọn duy nhất để học ngôn ngữ lập trình PHP -

Collection Bộ sưu tập các hướng dẫn PHP tốt nhất
💻100 + Chương trình PHP có nhận xét phù hợp để hiểu rõ hơn
Tìm hiểu kiến ​​thức cơ bản về PHP cho người mới bắt đầu
Câu hỏi và câu trả lời trong các danh mục khác nhau
Đề thi quan trọng
💻 Chia sẻ Hướng dẫn & Chương trình với những người bạn khác
Hướng dẫn dành cho lập trình viên mới bắt đầu hoặc những người muốn học lập trình nâng cao

Ứng dụng Tìm hiểu PHP PHP có giao diện người dùng thực sự đơn giản và trực quan. Đây là ứng dụng tốt nhất để cho phép bạn học ngôn ngữ lập trình PHP miễn phí. Bạn đang chờ đợi điều gì? Tải xuống ứng dụng ngay bây giờ để trở thành một Lập trình viên PHP.

Nếu bạn có bất kỳ phản hồi nào cho chúng tôi, vui lòng viết email cho chúng tôi và chúng tôi sẽ sẵn lòng giúp bạn. Nếu bạn đã thích bất kỳ tính năng nào của ứng dụng này, vui lòng đánh giá chúng tôi trên cửa hàng chơi và chia sẻ với những người bạn khác.

Gần đây, khái niệm lập trình hàm (functional programming) trở nên hết sức phổ biến, cùng với nó là sự đi lên của ngôn ngữ lập trình hàm Scala và Haskell. Xuất thân là một lập trình viên PHP, tôi được khuyên nên học một ngôn ngữ lập trình hàm kiểu như Scala, qua đó mở rộng tầm hiểu biết và có thể quay trở lại viết code PHP sáng sủa hơn. Sau một thời gian tìm hiểu Scala, tôi đã lơ mơ hiểu được đôi chút về Scala cũng như Functional programming. Và tôi cũng thấy rằng, nếu muốn, PHP cũng có thể thực hiện được functional programming, đặc biệt là khi closure đang được sử dụng rất phổ biến. Bài viết này tôi tìm hiểu và dịch từ nguồn code.tutplus, rất mong có thể giúp các lập trình viên PHP có cái nhìn cơ bản về functional programming. Trong tương lai, tôi sẽ viết bài phân tích ngôn ngữ Scala để bạn đọc thấy nó hỗ trợ Functional Programming tuyệt vời thế nào.

Functional Programming in PHP

Trong giới lập trình, khái niệm functional programming đang trở nên vô cùng hấp dẫn và được nhiều người tìm hiểu. Ngôn ngữ lập trình hàm (functional languages) cũng được sử dụng nhiều hơn và tốt hơn trong các ứng dụng. Scala, Haskell,... đang cực kỳ phát triển. Những ngôn ngữ lâu đời như Java cũng bắt đầu chấp nhận các đặc trưng của functional programming (ví dụ closure trong Java 7 là lazy eval cho lists trong Java 8). Tuy nhiên, điều mà ít người biết, là PHP thực sự rất linh hoạt khi chuyển sang functional programming. Hầu hết các đặc trưng chính của functional programming có thể mổ tả được ở PHP. Do vậy, nếu bạn là một người mới biết đến khái niệm này, hãy cố gắng mở rộng suy nghĩ. Và nếu bạn là người đã quen với functional programming, chắc chắn bạn sẽ thấy nhiều điều thú vị trong bài viết này.

Mô hình lập trình (Programming Paradigms)

Nếu không có các mô hình lập trình, chúng ta có thể làm mọi việc chúng ta muốn theo bất cứ cách nào. Mặc dù điều đó có vẻ rất linh hoạt, nhưng nó có thể đưa chúng ta đến những kiến trúc vô lý và những dòng code không rõ ràng. Do vậy, mô hình lập trình được sinh ra để giúp chúng ta, lập trình viên, giúp nghĩ ra cách giải quyết cụ thể cho một vấn đề cụ thể, và bằng cách đó, sẽ giới hạn khả năng của chúng ta khi mô tả lời giải cho vấn đề đó.

Mỗi mô hình lập trình lại lấy đi 1 chút tự do của chúng ta:

  • Modular Programming lấy đi các chương trình có độ dài không giới hạn.
  • Structured and Procedural Programming lấy đi cú pháp
    public function singletonSet($elem) {
        return function($otherElem) use ($elem) {
            return $elem == $otherElem;
        }
    }
    
    2 và giới hạn lập trình viên với các chuỗi, lựa chọn và vòng lặp.
  • Object Oriented Programming lấy đi con trỏ và chỉ còn functions.
  • Functional Programming lấy đi việc gán giá trị và trạng thái có thể thay đổi.

Nguyên lý của functional programming

Trong functional programming, chúng ta không có dữ liệu được biểu diễn bởi biến số.

Trong functional programming, mọi thứ đều là hàm (function). Ý tôi là tất cả. Ví dụ một tập hợp, như trong toán học, có thể biển diễn bởi nhiều hàm. Một mảng hoặc danh sách cũng có thể biểu diễn bởi một hàm hoặc một nhóm các hàm.

Trong lập trình hướng đối tượng, mọi thứ đều là đối tượng (object). Và một object là một tập các dữ liệu, hàm thực hiện hành động với dữ liệu đó. Object có trạng thái có thể thay đổi.

Trong functional programming, bạn không có dữ liệu biểu diễn bởi biến số. Không có khối nào chứa dữ liệu. Dữ liệu không được gán cho biến. Một vài dữ liệu có thể được định nghĩa hoặc được gán. Tuy nhiên, trong hầu hết các trường hợp, hàm số được gán cho "biến"(variables). Tôi đặt "biến" trong dấu ngoặc kép, bởi trong functional programming, chúng không thể thay đổi. Mặc dù hầu hết ngôn ngữ lập trình hàm không bắt buộc việc không thay đổi, cũng như không phải cứ lập trình hướng đối tượng là bắt buộc phải dùng object, nhưng nếu bạn thay đổi giá trị sau khi chỉ định giá trị ban đầu, bạn không còn giữ được vẻ trong sáng của functional programming.

Bởi bạn không có giá trị được đặt ở biến, trong functional programming, không có cái gọi là trạng thái.

Bởi vì không có trạng thái, không có việc gán giá trị, nên hàm trong functional programming không gây ra tác dụng phụ. Vì ba lý do trên, hàm ở đây luôn có thể dự đoán được. Điều đó có nghĩa là, nếu bạn gọi một hàm với cùng một tham số truyền vào, gọi đi gọi lại,... bạn luôn nhận được cùng một kết quả. Đây thực sự là một lợi thế tuyệt vời hơn hẳn lập trình hướng đối tượng, và rất hiệu quả trong việc giảm độ phức tạp của lập trình đa luồng hay các ứng dụng lớn chạy đa luồng.

Tuy nhiên, nếu chúng ta muốn mô tả mọi thử bởi hàm, chúng ta cần truyền chúng dưới dạng tham số hay trả về chúng từ một hàm khác. Do vậy, functional programming yêu cầu việc ỗ trợ hàm ở mức cao (high-order functions). Về cơ bản, điều này có nghĩa là hàm có thể được gán như "biến", được truyền vào như tham số của hàm khác, và được trả về như kết quả của một hàm.

Cuối cùng, vì chúng ta không có giá trị trong biến, các vòng lặp while và for sẽ trở nên hiếm thấy trong lập trình hàm, chúng được thay thế bởi đệ quy.

Cho tôi xem code!

Nói lý thuyết như vậy là đủ rồi, giờ chúng ta sẽ code!

Tạo một project PHP bằng IDE hoặc Editor yêu thích của bạn. Tạo một thư mục

public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
3. Tạo 2 files:
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
4 và
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
5 trong thư mục đó. Chúng ta sẽ tạo ra một ứng dụng, với chức năng kiểm thử, để mô tả khái đặc điểm tập hợp (sets).

Trong toán học, tập hợp là một tập các đối tượng tách biệt, được xem như một đối tượng theo cách riêng của nó. (wikipedia)

Về cơ bản, điều đó có nghĩa sets là một tập những thứ được đặt tại một nơi. Những tập hợp này có thể và được xác định thuộc tính thông qua các phép toán: hợp, giao, sai phân,... Và thông qua các thuộc tính mang tính chất hành động, kiểu như: bao hàm.

Giới hạn của lập trình

Nào, giờ hãy bắt đầu code! Tuy nhiên, đợi một chút. Bằng cách nào? Để bảo vệ quan điểm của functional programming, chúng ta sẽ phải đảm bảo những giới hạn sau:

  • Không gán giá trị - Chúng ta không được phép gán giá trị cho biến. Tuy nhiên chúng ta được gán hàm cho biến.

  • Không có trạng thái có thể thay đổi - Chúng ta không được phép, khi gán giá trị, thay đổi giá trị mà đã được gán. Chúng ta cũng không được thay đổi giá trị của biến mà có giá trị là tham số của hàm hiện tại. Do vậy, không được thay đổi tham số.

  • Không có vòng lặp while và for - Chúng ta không được phép sử dụng câu lệnh while và for trong PHP. Tuy nhiên, chúng ta được phép định nghĩa phương thức để duyệt qua các phần tử của tập hợp, và gọi đó là foreach/for/while.

Không có giới hạn với tests. Bởi vì PHPUnit cơ bản, chúng ta sẽ sử dụng lập trình hướng đối tượng thuần tuý. Để điều tiết tests một cách đơn giản, chúng ta sẽ viết tất cả code trong một class.

Hàm định nghĩa tập hợp

Nếu bạn là một lập trình viên có kinh nghiệm, nhưng không quen với functional programming, đây là thời điểm bạn nên dừng suy nghĩ về việc làm mọi thứ như bạn đã từng làm và sẵn sàng thoát khỏi vòng an toàn của bạn. Hãy quên tất cả cách tiếp cận trước đây với vấn đề và tưởng tượng tất cả là hàm.

Hàm định nghĩa của tập hợp là phương thức bao gồm - contains.

function contains($set, $elem) {
    return $set($elem);
}

OK. Có vẻ không hiển nhiên lắm. Giờ hãy xem cách chúng ta dùng nó.

$set = function ($element) {return true;};
contains($set, 100);

Ok, nó giải thích rõ hơn một chút. Hàm

public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
6 có 2 tham số:

  • public function singletonSet($elem) {
        return function($otherElem) use ($elem) {
            return $elem == $otherElem;
        }
    }
    
    7 - Biểu diễn một tập hợp định nghĩa như một hàm số.
  • public function singletonSet($elem) {
        return function($otherElem) use ($elem) {
            return $elem == $otherElem;
        }
    }
    
    8 - Biển diễn một phần tử định nghĩa như một giá trị.

Trong trường hợp này, những gì mà

public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
6 làm là sử dụng hàm
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
7 với tham số là
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
8. Chúng ta sẽ thực hiện tests.

class FunSetsTest extends PHPUnit_Framework_TestCase {

    private $funSets;

    protected function setUp() {
        $this->funSets = new FunSets();
    }

    function testContainsIsImplemented() {
        // Chúng ta xác định thuộc tính một tập hợp thông qua hàm contains. Đây là thuộc tính cơ bản của tập hợp.

        $set = function ($element) { return true; };
        $this->assertTrue($this->funSets->contains($set, 100));
    }
}

Và chúng ta viết class

public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
4.

class FunSets {
    public funciton contains($set, $elem) {
        return $set($elem);
    }
}

Bạn có thể chạy test này và nó luôn pass. Tập hợp chúng ta định nghĩa ở đây luôn trả về true, đó là một tập hợp đúng "true set".

Tập duy nhất - Singleton Set

Nếu phần trước có đôi chút khó hiểu về logic, ví dụ này sẽ rõ ràng hơn. Chúng ta muốn định nghĩa một tập hợp với một phần tử duy nhất, một tập hợp duy nhất. Nên nhớ rằng đó là một hàm, và chúng ta muốn dùng nó như trong test dưới đây.

function testSingletonSetContainsSingleElement() {
    $singleton = $this->funSets->singetonSet(1);
    $this->assertTrue($this->funSets->contains($singleton, 1));
}

Chúng ta cần một hàm gọi là

$singleton = $this->funSets->singletonSet(1);
3 với một tham số mô tả phần tử của tập hợp. Trong test này, đó là một số (1). Sau đó chúng ta hy vọng hàm
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
6 trả về
$singleton = $this->funSets->singletonSet(1);
5 nếu tham số truyền vào bằng một. Chương trình sau làm cho bài test của chúng ta pass.

public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}

Vâng, rất tuyệt vời phải không nào. Hàm

$singleton = $this->funSets->singletonSet(1);
3 nhận tham số truyền vào là một phần tử
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
8. Sau đó nó trả lại một hàm nhận tham số là
$singleton = $this->funSets->singletonSet(1);
8 và hàm này so sánh
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
8 với
$singleton = $this->funSets->singletonSet(1);
8.

Hãy xem cách chúng hoạt động thế nào. Đầu tiên:

$singleton = $this->funSets->singletonSet(1);

được chuyển thành cái mà

$singleton = function ($otherElem) {
    return 1 == $otherElem;
}
1 trả về:

$singleton = function ($otherElem) {
    return 1 == $otherElem;
}

Sau đó, hàm

$singleton = function ($otherElem) {
    return 1 == $otherElem;
}
2 được gọi. Hàm này dùng để kiểm tra xem phần tử có trong
$singleton = function ($otherElem) {
    return 1 == $otherElem;
}
3 hay không. Code như sau:

$singleton(1);

Hàm này thực ra kiểm tra xem

$singleton = $this->funSets->singletonSet(1);
8 có giá trị 1 hay không.

return 1 == 1;

Đương nhiên nó đúng và test của chúng ta sẽ pass.

Bạn có đang cười? Bạn có thấy tư duy của mình đang thay đổi? Tôi thực sự thấy điều đó khi tôi viết chương trình này với Scala và viết lại với PHP. Tôi thấy nó rất khác biệt. Chúng ta cố gắng tạo ra một tập hợp, với một phần tử, với khả năng kiểm tra xem nó có chứa giá trị ta truyền vào không. Chúng ta làm tất cả điều đó mà không cần gán bất cứ giá trị nào. Chúng ta không có biến chứa giá trị hoặc trạng thái của giá trị. Không trạng thái, không gán giá trị, không thay đổi, không vòng lặp. Chúng ta đang đi đúng hướng.

Hợp của tập hợp (Union of Sets)

Giờ chúng ta đã tạo một tập với một giá trị duy nhất. Chúng ta cần tạo ra tập với nhiều giá trị. Cách hiển nhiên nhất là định nghĩa phép hợp của tập hợp. Một hợp của hai tập duy nhất sẽ tạo ra một tập với cả 2 giá trị. Tôi muốn bạn nghĩ một chút trước khi xem code, trước tiên là phần test.

$set = function ($element) {return true;};
contains($set, 100);
0

Khi chúng ta gọi hàm

$singleton = function ($otherElem) {
    return 1 == $otherElem;
}
5, nó nhận 2 tham số, cả 2 đều là tập hợp. Nên nhớ rằng set là một hàm, do vậy
$singleton = function ($otherElem) {
    return 1 == $otherElem;
}
5 sẽ nhận hai tham số đều là hàm. Sau đó, chúng ta dùng hàm
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
6 để kiểm tra xem
$singleton = function ($otherElem) {
    return 1 == $otherElem;
}
5 có chứa phần tử hay không. Do vậy,
$singleton = function ($otherElem) {
    return 1 == $otherElem;
}
5 cần trả về hàm mà
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
6 có thể sử dụng.

$set = function ($element) {return true;};
contains($set, 100);
1

Hàm này hoạt động tốt. Và nó vẫn hoạt động tốt kể cả khi bạn gọi phép hợp với một kết quả của phép hợp khác và một tập duy nhất. Nó sẽ gọi hàm

public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
6 bên trong chính nó với từng tham số. Nếu nó là một hợp của các tập hợp, nó có thể đệ quy. Rất đơn giản.

Giao (Intersect) và Sai phân (Difference)

Chúng ta có thể làm tương tự để có được hai hàm quan trọng của tập hợp là giao (các phần tử chung của hai tập hợp) và hàm sai phân (phần tử có ở tập thứ nhất nhưng không có ở tập thứ hai).

$set = function ($element) {return true;};
contains($set, 100);
2

Lọc tập hợp

Nó khá phức tạp, và chúng ta không thể dễ dàng giải quyết với 1 dòng code. Hàm filter dùng 2 tham số: tập hợp và hàm lọc. Nó sử dụng hàm filter cho tập hợp và trả về một tập hợp chỉ chứa các phần tử thoả màn điều kiện lọc. Để hiểu rõ hơn, chúng ta sẽ test nó.

$set = function ($element) {return true;};
contains($set, 100);
3

Chúng ta tạo ra một tập hợp có 3 phần tử 1, 2, 3. Và đặt nó ở biến

$singleton(1);
2. Do vậy nó trở nên rất rõ ràng. Chúng ta định nghĩa một hàm chúng ta muốn test và đặt nó là
$singleton(1);
3. Cuối cùng, chúng ta gọi hàm
$singleton(1);
4 cho tập
$singleton(1);
2 với hàm
$singleton(1);
3 và đặt kết quả ở
$singleton(1);
7. Sau đó chúng ta test hàm
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
6 với các phần tử. Hàm lọc khá đơn giản, nó trả về true nếu phần tử lớn hơn 1. Do vậy mục tiêu cuối cùng của chúng ta là tập hợp có 2 phần tử 2 và 3.

$set = function ($element) {return true;};
contains($set, 100);
4

Lặp giữa các phần tử

Bước tiếp theo là tạo ra hàng loạt hàm lặp. Hàm đầu tiên

$singleton(1);
9 sẽ nhận tập hợp
public function singletonSet($elem) {
    return function($otherElem) use ($elem) {
        return $elem == $otherElem;
    }
}
7 và điều kiện
$singleton(1);
3 và trả về true nếu
$singleton(1);
3 được dùng cho các thành phần của tập hợp. Test sẽ như sau.

$set = function ($element) {return true;};
contains($set, 100);
5

Chúng ta dùng

$singleton(1);
2 được tạo ra từ hàm test tại đây. Sau đó chúng ta định nghĩa 3 điều kiện khác nhau: lớn hơn 0, lớn hơn 1 và lớn hơn 2. Vì tập hợp của chúng ta bao gồm 1, 2, 3 nên chỉ điều kiện với 0 là trả về true, còn lại trả về false. Do vậy, chúng ta cần vượt qua test với sự giúp đỡ của hàm đệ quy để duyệt tất cả các phần tử.

$set = function ($element) {return true;};
contains($set, 100);
6

Chúng ta bắt đầu bằng việc định nghĩa giới hạn cho tập hợp của chúng ta. Giá trị cần nằm trong khoảng -1000 đến +1000. Đây là một giới hạn chấp nhận được để ví dụ đơn giản. Hàm

return 1 == 1;
4 gọi hàm private
return 1 == 1;
5 với các tham số cần thiết để thực hiện để quy để kiểm tra xem phần tử có thoả mãn điều kiện không. Ở hàm này, đầu tiên chúng ta check xem mình có bị nằm ngoài giới hạn không. Nếu có, trả về true. Tiếp theo, chúng ta kiểm tra xem tập hợp có phần tử này không, nếu có thì sử dụng điều kiện
return 1 == 1;
6 để kiểm tra phần tử hiện tại có thoả mãn điều không và gọi đệ quy đến các phần tử khác. Nếu không, chúng ta chỉ cần gọi đệ quy với phần còn lại và trả về kết quả.

Hàm này sẽ hoạt động tốt, và chúng ta có thể cài đặt theo cách tương tự cho

return 1 == 1;
7. Hàm này trả vè
$singleton = $this->funSets->singletonSet(1);
5 nếu bất cứ phần tử nào thoả mãn điều kiện.

$set = function ($element) {return true;};
contains($set, 100);
7

Khác biệt duy nhất là hàm này trả về false khi nằm ngoài khoảng giá trị và chúng ta dùng

return 1 == 1;
9 thay vì
return 1 == 1;
6 trong câu
$set = function ($element) {return true;};
contains($set, 100);
01 thứ hai.

Hàm

$set = function ($element) {return true;};
contains($set, 100);
02 sẽ khác một chút, ngắn hơn và đơn giản hơn.

$set = function ($element) {return true;};
contains($set, 100);
8

$set = function ($element) {return true;};
contains($set, 100);
03 có nghĩa là chúng ta sử dụng một hành động cho tất cả các phần tử của tập hợp. Với map, chúng ta không cần iterator và có thể sử dụng hàm
$set = function ($element) {return true;};
contains($set, 100);
04 có sẵn để trả về các phần tử "tồn tại" và thoả mãn điều kiện
$set = function ($element) {return true;};
contains($set, 100);
05. Ban đầu có thể không hiển nhiên lắm, nhưng hãy xem điều gì đang diễn ra.

  • Chúng ta tạo tập hợp với phần tư
    $set = function ($element) {return true;};
    contains($set, 100);
    
    06 và thực hiện hành động
    $set = function ($element) {return true;};
    contains($set, 100);
    
    07 (nhân đôi).
  • Đương nhiên chúng ta sẽ có một hàm sử dụng tập hợp và hành động từ một mức cao hơn.
  • Hàm này sẽ gọi
    $set = function ($element) {return true;};
    contains($set, 100);
    
    08 với tập
    $set = function ($element) {return true;};
    contains($set, 100);
    
    09 và điều kiện
    $set = function ($element) {return true;};
    contains($set, 100);
    
    10 tương ứng với
    $set = function ($element) {return true;};
    contains($set, 100);
    
    11.
  • return 1 == 1;
    
    7 sẽ duyệt tất cả các phần từ từ -1000 đến + 1000 (phạm vi của chúng ta), vì tìm ra phần tử mà giá trị gấp đôi của nó được nhận được từ
    public function singletonSet($elem) {
        return function($otherElem) use ($elem) {
            return $elem == $otherElem;
        }
    }
    
    6 (giá trị của
    $set = function ($element) {return true;};
    contains($set, 100);
    
    14) và trả về true.
  • Nói một cách khác, hàm so sánh cuối cùng sẽ trả về true cho hàm gọi đến giá trị 2, khi giá trị hiện tại được nhân 2 và trả về 4. Ở phần tử đầu tiên, 1, giá trị true sẽ trả về với 2. Ở phần từ giá trị 2, kết quả là 4.

Ví dụ thực tế

Vâng, có vẻ functional programming rất thú vị, nhưng ý tưởng của nó thì không dễ chấp nhận trong PHP. Do vậy, tôi không khuyến khích bạn viết tất cả bằng cách đó. Tuy nhiên, bạn đã biết cách PHP làm với hàm, do vậy bạn có thể dùng một phần kiến thức vào các bài toàn hàng ngày. Dưới đây là một mô-đun thực hiện xác thực người dùng. Class

$set = function ($element) {return true;};
contains($set, 100);
15 nhận đầu vào là user và passwrod và có thể thực hiện xác thực cũng như chỉ định quyền người dùng.

$set = function ($element) {return true;};
contains($set, 100);
9

Hàm trên có vẻ OK, tuy nhiên có một vấn đề khá nghiêm trọng. 80% phương thức sử dụng ở

$set = function ($element) {return true;};
contains($set, 100);
16 dùng thông tin của
$set = function ($element) {return true;};
contains($set, 100);
17. Nó tạo ra sự phụ thuộc rất lớn giữa các mô-đun.

Hướng dẫn dùng programing php trong PHP

Sẽ rõ ràng hơn nếu tạo ra 3 lời gọi hàm và một method cho

$set = function ($element) {return true;};
contains($set, 100);
17.

Hướng dẫn dùng programing php trong PHP

Bằng cách di chuyển việc sinh dữ liệu ra

$set = function ($element) {return true;};
contains($set, 100);
17, chúng ta đã cố gắng giảm 3 phụ thuộc vào chỉ 1. Bằng việc dùng interface
$set = function ($element) {return true;};
contains($set, 100);
17, chúng ta giảm 3 xuống còn 1 method. Tuy nhiết, Chúng ta không dừng lại ở đây,
$set = function ($element) {return true;};
contains($set, 100);
15 vẫn còn phụ thuộc trực tiếp vào
$set = function ($element) {return true;};
contains($set, 100);
17.

Cách tiếp cận hướng đối tượng

Để plugin có thể dùng bởi bất cứ mô-đun nào, chúng ta cần tạo ra một interface sử dụng chung. Chúng ta có thể truyền object vào thông qua khai báo interface.

class FunSetsTest extends PHPUnit_Framework_TestCase {

    private $funSets;

    protected function setUp() {
        $this->funSets = new FunSets();
    }

    function testContainsIsImplemented() {
        // Chúng ta xác định thuộc tính một tập hợp thông qua hàm contains. Đây là thuộc tính cơ bản của tập hợp.

        $set = function ($element) { return true; };
        $this->assertTrue($this->funSets->contains($set, 100));
    }
}
0

$set = function ($element) {return true;};
contains($set, 100);
15 có một constructor. Nó nhận tham số truyền vào là một dạng của
$set = function ($element) {return true;};
contains($set, 100);
24, một interface, và gọi hàm
$set = function ($element) {return true;};
contains($set, 100);
25 với object được truyền vào.

class FunSetsTest extends PHPUnit_Framework_TestCase {

    private $funSets;

    protected function setUp() {
        $this->funSets = new FunSets();
    }

    function testContainsIsImplemented() {
        // Chúng ta xác định thuộc tính một tập hợp thông qua hàm contains. Đây là thuộc tính cơ bản của tập hợp.

        $set = function ($element) { return true; };
        $this->assertTrue($this->funSets->contains($set, 100));
    }
}
1

$set = function ($element) {return true;};
contains($set, 100);
24 định nghĩa một phương thức chung tổng quá,
$set = function ($element) {return true;};
contains($set, 100);
25 với tham số là username.

class FunSetsTest extends PHPUnit_Framework_TestCase {

    private $funSets;

    protected function setUp() {
        $this->funSets = new FunSets();
    }

    function testContainsIsImplemented() {
        // Chúng ta xác định thuộc tính một tập hợp thông qua hàm contains. Đây là thuộc tính cơ bản của tập hợp.

        $set = function ($element) { return true; };
        $this->assertTrue($this->funSets->contains($set, 100));
    }
}
2

Cuối cùng,

$set = function ($element) {return true;};
contains($set, 100);
17 cần khái báo hàm được định nghĩa ở interface
$set = function ($element) {return true;};
contains($set, 100);
24.

Hướng dẫn dùng programing php trong PHP

Đến đây, mọi chuyện trở nên tốt hơn rất nhiều.

$set = function ($element) {return true;};
contains($set, 100);
15 chỉ phụ thuộc vào interface.
$set = function ($element) {return true;};
contains($set, 100);
17 chỉ phụ thuộc vào chính interface đó, do vậy
$set = function ($element) {return true;};
contains($set, 100);
15 không cần phải biết về mô-đun thực hiện cuối cùng. Chúng ta có thể tạo ra bao nhiêu mô-đun tuỳ ý, miễn là nó thực thi
$set = function ($element) {return true;};
contains($set, 100);
24, và
$set = function ($element) {return true;};
contains($set, 100);
15 của chúng ta sẽ có thể làm việc với chúng.

Cách tiếp cận bằng hàm (Functional Approach)

Một cách khác để đảo ngược sự phụ thuộc, và tạo ra

$set = function ($element) {return true;};
contains($set, 100);
35 hoặc bất cứ mô-đun nào khác, là sử dụng
$set = function ($element) {return true;};
contains($set, 100);
15 để truyền vào các mô-đun đó.
$set = function ($element) {return true;};
contains($set, 100);
15 sẽ thực hiện việc xác thực người dùng, và mỗi ứng dụng sẽ cung cấp hàm
$set = function ($element) {return true;};
contains($set, 100);
38 của nó.

class FunSetsTest extends PHPUnit_Framework_TestCase {

    private $funSets;

    protected function setUp() {
        $this->funSets = new FunSets();
    }

    function testContainsIsImplemented() {
        // Chúng ta xác định thuộc tính một tập hợp thông qua hàm contains. Đây là thuộc tính cơ bản của tập hợp.

        $set = function ($element) { return true; };
        $this->assertTrue($this->funSets->contains($set, 100));
    }
}
3

Chúng ta bắt đầu với

$set = function ($element) {return true;};
contains($set, 100);
35. Nó không còn phải tuân thủ bất cứ interface nào. Tuy nhiên, nó sử dụng object được truyền vào để thực hiện Authentication. Ở
$set = function ($element) {return true;};
contains($set, 100);
35, sẽ có một hàm
$set = function ($element) {return true;};
contains($set, 100);
16 gọi hàm
$set = function ($element) {return true;};
contains($set, 100);
42 của
$set = function ($element) {return true;};
contains($set, 100);
15 và truyền hàm vào đó.

class FunSetsTest extends PHPUnit_Framework_TestCase {

    private $funSets;

    protected function setUp() {
        $this->funSets = new FunSets();
    }

    function testContainsIsImplemented() {
        // Chúng ta xác định thuộc tính một tập hợp thông qua hàm contains. Đây là thuộc tính cơ bản của tập hợp.

        $set = function ($element) { return true; };
        $this->assertTrue($this->funSets->contains($set, 100));
    }
}
4

Interface chỉ định nghĩa hai hàm đó.

class FunSetsTest extends PHPUnit_Framework_TestCase {

    private $funSets;

    protected function setUp() {
        $this->funSets = new FunSets();
    }

    function testContainsIsImplemented() {
        // Chúng ta xác định thuộc tính một tập hợp thông qua hàm contains. Đây là thuộc tính cơ bản của tập hợp.

        $set = function ($element) { return true; };
        $this->assertTrue($this->funSets->contains($set, 100));
    }
}
5

Cuối cùng,

$set = function ($element) {return true;};
contains($set, 100);
15 sẽ thực thi
$set = function ($element) {return true;};
contains($set, 100);
45 và nhận hàm truyền vào như một thành phần private của class. Sau đó hàm
$set = function ($element) {return true;};
contains($set, 100);
16 trở thành một hàm câm. Nó chỉ gọi hàm khác và trả về giá trị. Hoàn toàn tách biệt khỏi cái sẽ được truyền vào.

Hướng dẫn dùng programing php trong PHP

Nếu nhìn vào mô hình, bạn sẽ thấy 2 thay đổi quan trọng:

  • Thay vì
    $set = function ($element) {return true;};
    contains($set, 100);
    
    35,
    $set = function ($element) {return true;};
    contains($set, 100);
    
    15 mới là lớp thực thi một interface.
  • $set = function ($element) {return true;};
    contains($set, 100);
    
    15 sẽ gọi ngược lại (call back)
    $set = function ($element) {return true;};
    contains($set, 100);
    
    35 hoặc bất cứ module nào được truyền vào để thực hiện phân quyền.

Làm theo cách nào?

Không có đáp án chính xác cho câu hỏi này. Tôi cho rằng nếu quá trình xác định quyền phụ thuộc vào mô-đun của ứng dụng, cách tiếp cận hướng đối tượng sẽ tốt hơn. Tuy nhiên, nếu bạn cho rằng mỗi mô-đun cần có khả năng cung cấp hàm xác thực, và

$set = function ($element) {return true;};
contains($set, 100);
15 chỉ là một cái khung cho việc xác thực và không biết gì về user và các thủ tục, bạn có thể chọn cách tiếp cận hàm.

Cách tiếp cận hàm làm cho

$set = function ($element) {return true;};
contains($set, 100);
15 mang tính trừu tượng và bạn có thể phụ thuộc vào nó. Tuy nhiên, nếu bạn cho phép
$set = function ($element) {return true;};
contains($set, 100);
15 làm nhiều hơn và biết nhiều hơn về user và hệ thống, nó sẽ trở nên rời rạc và bạn không còn muốn phụ thuộc vào nó. Trong trường hợp đó, hãy chọn cách tiếp cận hướng đối tượng và để cho
$set = function ($element) {return true;};
contains($set, 100);
15 phụ thuộc vào mô-đun của ứng dụng.