PHP là lựa chọn ưu tiên cho các doanh nghiệp vì tính linh hoạt, khả năng mở rộng và các chức năng dễ sử dụng. Không giống như các ngôn ngữ lập trình tiêu chuẩn khác, PHP được tổ chức tốt và nó không cần bất kỳ danh mục hay tài liệu nghiên cứu nào để học
Các hàm lệnh của PHP dễ hiểu đến mức ngay cả một người mới cũng có thể nhanh chóng học và hiểu chúng. Các doanh nghiệp chọn nhiều nền tảng dịch vụ phát triển PHP, bao gồm Laravel, WordPress & Magento
Lựa chọn đối tác công nghệ mong muốn nhất phù hợp để cung cấp chuyên gia là bước đầu tiên cho một hành trình thành công. Các nhà phát triển chuyên nghiệp trên toàn thế giới thích làm việc trên PHP để phát triển trang web hơn là các ngôn ngữ lập trình khác
Khi mã hóa một ứng dụng bằng PHP, vì mục đích tiết kiệm thời gian hoặc đáp ứng thời hạn của chúng tôi, chúng tôi thường có thể viết các chức năng chỉ đơn giản là giải quyết vấn đề cụ thể mà chúng tôi có trong tay mà không xem xét liệu giải pháp đó có thể được tạo ra để giải quyết các vấn đề khác hay không. Chúng tôi tập trung vào cái cây chứ không phải trong khu rừng
Sau đó, khi một vấn đề tương tự phát sinh, chúng ta có thể sao chép/dán giải pháp trước đó, do đó tăng tuyến tính các dòng mã trong dự án tương ứng với số lượng vấn đề cần giải quyết
Lặp lại quá trình này một thời gian và dự án trở nên cồng kềnh, bắt đầu gặp phải các vấn đề về hiệu suất, các thành viên mới trong nhóm không thể hiểu cách thức hoạt động của logic và các lỗi được đưa ra với nỗ lực tối thiểu. Chắc chắn là một tình huống cần tránh
Nhưng nó không cần phải như vậy. Ngôn ngữ PHP cung cấp một số tính năng từ mô hình Lập trình hướng đối tượng [OOP] cho phép quản lý hiệu quả độ phức tạp của mã của chúng tôi, giúp có thể có một ứng dụng tinh gọn, kích thước tăng chậm hơn số lượng vấn đề cần giải quyết
Trong bài viết này, chúng ta sẽ thực hiện chuyến tham quan các tính năng OOP nổi bật nhất trong PHP và trình bày cách sử dụng chúng
Thiết lập một nền tảng vững chắc thông qua SOLID
Áp dụng các nguyên tắc SOLID cho phép phát triển phần mềm duy trì lâu dài và dễ dàng tùy chỉnh
Các nguyên tắc SOLID là
Nguyên tắc Mô tảSNguyên tắc chịu trách nhiệm đơnMột lớp chỉ nên có một trách nhiệm duy nhấtONguyên tắc đóng-mởCác thực thể phần mềm nên mở để mở rộng, nhưng đóng để sửa đổiNguyên tắc thay thế LLiskovCác đối tượng trong một chương trình nên được thay thế bằng các thể hiện của các kiểu con của chúng mà không làm thay đổi tính chính xác của chương trình đóINguyên tắc phân tách giao diệnNhiều máy khách cụ thểBạn có thể tìm thấy lời giải thích tuyệt vời về cách triển khai các nguyên tắc SOLID trong bài viết này
Giải quyết các vấn đề phổ biến thông qua Design Patterns
Các mẫu thiết kế là một công cụ vô giá để giải quyết các vấn đề theo cách tiêu chuẩn hóa. Đây là những mô tả về các giải pháp chung, có thể tái sử dụng cho một số vấn đề thường xảy ra khi thiết kế ứng dụng. Việc triển khai các mẫu thiết kế tồn tại cho mọi ngôn ngữ và có thể tìm thấy một số mẫu thiết kế được triển khai trong PHP trong hướng dẫn này
Tách các lớp của ứng dụng thông qua mô hình Model-View-Controller
Model-View-Controller [MVC] là một mô hình kiến trúc, nó tách các phần tương tác của một ứng dụng thành ba lớp xác định
- Mô hình quản lý dữ liệu, logic và quy tắc của ứng dụng
- Chế độ xem hiển thị thông tin
- Bộ điều khiển là liên kết giữa mô hình và khung nhìn. nó chấp nhận đầu vào, yêu cầu dữ liệu đến mô hình và chuyển dữ liệu đến chế độ xem để hiển thị
MVC là một mô hình tuyệt vời để xây dựng các ứng dụng quy mô lớn, bởi vì sự tách biệt giữa các lớp giao diện người dùng và lớp phụ trợ cho phép chỉ định thành viên nhóm phù hợp nhất để xử lý từng phần của ứng dụng. các thành phần Mô hình và Trình điều khiển có thể được xử lý bởi các nhà phát triển phụ trợ và kiến trúc sư cơ sở dữ liệu, trong khi thành phần Chế độ xem có thể được xử lý bởi các nhà phát triển và nhà thiết kế giao diện người dùng. Chúng tôi có thể tìm thấy một số ví dụ về triển khai MVC cho PHP trực tuyến, từ đó tôi đề xuất ví dụ này
Lớp xem có thể được hưởng lợi từ việc sử dụng một công cụ mẫu như Symfony's Twig hoặc Laravel's Blade. Cả hai mẫu Twig và Blade cuối cùng đều được biên dịch thành mã PHP, do đó không có chi phí chung về tốc độ, tuy nhiên chúng cung cấp một cú pháp ngắn gọn và nhiều tính năng bổ sung so với các mẫu PHP đơn giản, giúp làm rõ mã, làm cho nó dễ dàng hơn
Kế thừa đối tượng
Lớp và đối tượng xác định nền tảng của Lập trình hướng đối tượng. Các lớp và sự khởi tạo của chúng thành các đối tượng cho phép tạo các thành phần có khả năng tùy biến cao, thực hiện một chức năng cụ thể và có thể tương tác với các thành phần khác. Khả năng sử dụng lại mã được thực hiện bằng cách thao tác các giá trị của các thuộc tính được đóng gói của lớp và thông qua kế thừa, chúng ta có thể ghi đè hoặc mở rộng hành vi của chúng. Việc lập mô hình ứng dụng thông qua các lớp giúp kiểm tra và bảo trì rẻ hơn, vì các tính năng cụ thể có thể được tách rời khỏi ứng dụng và tự quản lý, đồng thời tăng năng suất, vì việc sử dụng các thành phần đã viết sẵn giúp tránh phải phát minh lại bánh xe mỗi lần và nhà phát triển có thể làm tốt hơn
Một lớp phải khai báo khả năng hiển thị của từng thuộc tính và chức năng là
$book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
1, $book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
2 hoặc $book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
3, nghĩa là nó có thể truy cập được từ mọi nơi, từ bên trong lớp định nghĩa và các lớp tổ tiên và kế thừa của nó, hoặc chỉ từ bên trong lớp định nghĩa, tương ứng. Từ bên trong một hàm, các thuộc tính của lớp được truy cập thông qua $book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
4class Book {
protected $title, $author;
public function __construct[$title, $author] {
$this->title = $title;
$this->author = $author;
}
public function getDescription[] {
return sprintf[
__['The book\'s title is "%s" and its author is "%s"'],
$this->title,
$this->author
];
}
}
Từ khóa
$book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
5 khởi tạo một lớp thành một đối tượng và các thuộc tính cũng như chức năng của đối tượng được truy cập thông qua $book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
6$book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
Một lớp có thể được kế thừa bởi một lớp con, lớp này có thể ghi đè lên các hàm
$book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
1 và $book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
2 và truy cập giá trị của các hàm tổ tiên thông qua $book = new Book['Sapiens', 'Yuval Noah Harari'];
echo $book->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari"`
9class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
Từ khóa
class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
0 định nghĩa một phương thức phải được triển khai bởi một lớp kế thừa và lớp chứa phương thức class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
0 phải được tạo thành ___11_______0, biểu thị rằng nó không thể khởi tạo. Việc khởi tạo chỉ có thể được thực hiện bắt đầu từ lớp kế thừa thực hiện phương thức trừu tượngabstract class Book {
abstract public function getTitle[];
public function getDescription[] {
return sprintf[
__['The book\'s title is "%s"'],
$this->getTitle[]
];
}
}
// Book cannot be instantiated
class Sapiens extends Book {
public function getTitle[] {
return 'Sapiens';
}
}
// Sapiens can be instantiated
$sapiens = new Sapiens[];
Từ khóa
class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
3 định nghĩa các phương thức và thuộc tính không nằm dưới đối tượng khởi tạo lớp, mà nằm dưới chính lớp đó, và chúng có thể được truy cập thông qua class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
4 từ bên trong lớp và tên của lớp + class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
5 từ bên ngoài nóclass Utils {
public static function print[$html, $options] {
if [$options['pretty']] {
$html = prettify[$html];
}
return $html;
}
public static function prettyPrint[$html] {
return self::print[$html, ['pretty' => true]];
}
}
echo Utils::prettyPrint['Hello world!
'];
Sử dụng lại mã thông qua Đặc điểm
Các lớp không sống trong cùng một hệ thống phân cấp lớp [i. e. không mở rộng từ nhau] không thể sử dụng lại mã thông qua kế thừa lớp. Đặc điểm là một cơ chế lấp đầy khoảng trống này, giúp có thể sử dụng lại mã giữa các lớp không liên quan. Một đặc điểm giống như một lớp ở chỗ nó có thể định nghĩa các thuộc tính và chức năng, tuy nhiên, không giống như một lớp, nó không thể được khởi tạo. Thay vào đó, mã sống bên trong một đặc điểm được xuất vào lớp soạn thảo vào thời gian biên dịch
Từ khóa
class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
6 xác định một đặc điểm và từ khóa class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
7 nhập một đặc điểm vào một lớp. Trong ví dụ bên dưới, các lớp class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
8 và class EBook extends Book {
protected $format;
public function __construct[$title, $author, $format] {
parent::__construct[$title, $author];
$this->format = $format;
}
public function getDescription[] {
return sprintf[
__['%s, and its format is "%s"'],
parent::getDescription[],
$this->format
];
}
}
$ebook = new EBook['Sapiens', 'Yuval Noah Harari', 'epub'];
echo $ebook->getDescription[];
// This prints `The book's title is "Sapiens" and its author is "Yuval Noah Harari", and its format is "epub"`
9 có thể sử dụng lại mã thông qua đặc điểm abstract class Book {
abstract public function getTitle[];
public function getDescription[] {
return sprintf[
__['The book\'s title is "%s"'],
$this->getTitle[]
];
}
}
// Book cannot be instantiated
class Sapiens extends Book {
public function getTitle[] {
return 'Sapiens';
}
}
// Sapiens can be instantiated
$sapiens = new Sapiens[];
0trait Sellable {
protected $price;
public function getPrice[] {
return $this->price;
}
public function setPrice[$price] {
$this->price = $price;
}
}
class Book {
use Sellable;
}
class CD {
use Sellable;
}
$book = new Book['Sapiens', 'Yuval Noah Harari'];
$book->setPrice[25];
Một lớp có thể nhập mã từ nhiều hơn một đặc điểm
trait Printable {
public class print[] {
// ...
}
}
class Book {
use Sellable, Printable;
}
Các đặc điểm có một số tính năng khác, chẳng hạn như bật , và cung cấp một cơ chế cho bất cứ khi nào các đặc điểm khác nhau có cùng tên hàm được tạo thành trong cùng một lớp
Xác định hợp đồng thông qua Giao diện
Các giao diện cho phép tách rời việc triển khai một chức năng khỏi việc khai báo ý định của chức năng đó phải làm gì. Về bản chất, khi sử dụng một chức năng, chúng ta có thể không cần biết nó được thực hiện như thế nào. Như vậy, các giao diện giúp xác định các hợp đồng giữa các thành phần, là cơ sở để thiết lập tính mô-đun của ứng dụng, cho phép ứng dụng chỉ bao gồm các thành phần tương tác với nhau mà không cần quan tâm đến các thành phần khác thực hiện nhiệm vụ của chúng như thế nào và có thể thay thế dễ dàng
Từ khóa
abstract class Book {
abstract public function getTitle[];
public function getDescription[] {
return sprintf[
__['The book\'s title is "%s"'],
$this->getTitle[]
];
}
}
// Book cannot be instantiated
class Sapiens extends Book {
public function getTitle[] {
return 'Sapiens';
}
}
// Sapiens can be instantiated
$sapiens = new Sapiens[];
1 khai báo một giao diện, sau đó nó liệt kê các chữ ký của các phương thức của nóinterface EmailSender {
function sendAsHTML[$to, $subject, $contents];
function sendAsPlain[$to, $subject, $contents];
}
Làm cho mã có thể quản lý được thông qua Không gian tên
Không gian tên cung cấp chức năng tương tự cho các lớp, đặc điểm và giao diện như các thư mục cung cấp cho các tệp trong hệ điều hành. họ tránh xung đột bất cứ khi nào hai phần tử khác nhau có cùng tên bằng cách đặt chúng trên một cấu trúc khác. Sau đó, có thể gọi tối đa hai tệp là “foo. txt” bằng cách đặt chúng trên các thư mục khác nhau, hai lớp có thể được gọi là “Logger” bằng cách đặt chúng dưới các không gian tên khác nhau
Mức độ liên quan của các không gian tên trở nên rõ ràng khi tương tác với một số thư viện bên thứ 3, vì những thư viện này có thể đồng thời sử dụng các tên tiêu chuẩn như “Reader” hoặc “Writer” để đặt tên cho các thành phần của chúng, điều này sẽ dẫn đến xung đột. Hơn nữa, một dự án đơn lẻ cũng có thể hưởng lợi từ các không gian tên để tránh việc tên lớp trở nên quá dài, chẳng hạn như “MyCompany_MyProject_Model_Author”
Từ khóa
abstract class Book {
abstract public function getTitle[];
public function getDescription[] {
return sprintf[
__['The book\'s title is "%s"'],
$this->getTitle[]
];
}
}
// Book cannot be instantiated
class Sapiens extends Book {
public function getTitle[] {
return 'Sapiens';
}
}
// Sapiens can be instantiated
$sapiens = new Sapiens[];
2 khai báo một không gian tên và nó phải được đặt ngay trên dòng sau phần mở đầu abstract class Book {
abstract public function getTitle[];
public function getDescription[] {
return sprintf[
__['The book\'s title is "%s"'],
$this->getTitle[]
];
}
}
// Book cannot be instantiated
class Sapiens extends Book {
public function getTitle[] {
return 'Sapiens';
}
}
// Sapiens can be instantiated
$sapiens = new Sapiens[];
3. Một không gian tên có thể bao gồm một số không gian tên con, phân tách chúng thông qua abstract class Book {
abstract public function getTitle[];
public function getDescription[] {
return sprintf[
__['The book\'s title is "%s"'],
$this->getTitle[]
];
}
}
// Book cannot be instantiated
class Sapiens extends Book {
public function getTitle[] {
return 'Sapiens';
}
}
// Sapiens can be instantiated
$sapiens = new Sapiens[];
4