Các tiêu chuẩn để phát triển WordPress đang dần chuyển từ các lượt mã thủ tục thiếu tính trừu tượng phù hợp sang mã RẮN hơn và hướng đối tượng
Đó là một bước đi đúng hướng, nhưng đừng quên hai điều quan trọng thường bị bỏ qua trong các cuộc thảo luận này. đặt mã trong một lớp không làm cho nó trở thành “hướng đối tượng” và PHP hướng đối tượng, theo định nghĩa, không tốt hơn
Hôm nay, chúng ta sẽ thảo luận về đối tượng là gì và vai trò của nó là gì. Sau đó, chúng ta có thể thảo luận về ý nghĩa của “lập trình hướng đối tượng thực sự” và liệu mã của bạn có thực sự quan trọng hay không nếu mã của bạn là “đúng OOP” hay không
Mảng so với đối tượng
PHP có hai kiểu dữ liệu hợp chất [còn được gọi là hỗn hợp]. đối tượng và mảng. Các kiểu dữ liệu phức hợp yêu cầu thành phần — quá trình kết hợp các kiểu dữ liệu khác thành một “đơn vị. ” Trong các ngôn ngữ hướng đối tượng thuần túy, chúng ta phải soạn các kiểu dữ liệu mà trong PHP có sẵn cho chúng ta dưới dạng các kiểu nguyên thủy
Khi giải thích về đối tượng và lập trình hướng đối tượng, tôi nghĩ sẽ rất hữu ích khi bắt đầu bằng cách nói về mảng, mảng không phải là đối tượng. Sự khác biệt cơ bản giữa mảng PHP và đối tượng là chúng ta không thể thay đổi quy tắc của mảng. PHP ngôn ngữ xác định những gì chúng ta có thể và không thể làm với một mảng và không có cách nào để chương trình PHP của bạn thay đổi điều đó
Mặt khác, các đối tượng có các quy tắc được xác định bởi chương trình PHP mà chúng đang chạy trong đó. Những quy tắc này là những gì chúng ta gọi là các lớp
Trong khi mọi mảng hoạt động theo cùng một quy tắc, mỗi đối tượng hoạt động theo quy tắc của đối tượng và theo quy tắc của lớp được sử dụng để tạo ra chúng
trường hợp
Đôi khi các từ "lớp" và "đối tượng" được sử dụng thay thế cho nhau, nhưng chúng không nên. Như tôi đã nói ở trên, các lớp là các quy tắc để tạo các đối tượng, nhưng các đối tượng đó không tồn tại cho đến khi chúng được khởi tạo
Khởi tạo lớp xảy ra bằng cách sử dụng từ khóa mới. Nếu tôi muốn một phiên bản của lớp WP_Query, tôi có thể tạo một phiên bản như thế này
$products = new WP_Query[ [ 'post_type' => 'product' ] ];
Khởi tạo một lớp và gọi một hàm rất giống nhau, nhưng các lệnh gọi hàm không được đặt trước từ khóa mới
Khi một lớp được khởi tạo, hàm tạo của nó được gọi ngay lập tức và bất kỳ đối số nào được đưa vào lớp đều được chuyển đến hàm tạo. Trình xây dựng là một ví dụ về phương thức ma thuật PHP. Chúng là một cách để đưa dữ liệu trực tiếp vào đối tượng và cũng để chạy mã ngay lập tức khi khởi tạo
Như bạn đã nhận thấy, tôi đã chuyển một mảng đối số cho lớp WP_Query khi tôi khởi tạo đối tượng. Nếu bạn nhìn vào bên trong hàm tạo của WP_Query, nếu một đối số mà nó chấp nhận không trống, thì đối số đó sẽ được chuyển đến phương thức truy vấn của lớp đó
Phương thức truy vấn đặt ra quy trình mà WP_Query được sử dụng để truy vấn cơ sở dữ liệu để nhận bài đăng. Tách phương thức đó ra khỏi hàm tạo là một thiết kế tốt vì nó giúp hàm tạo không đảm nhận quá nhiều trách nhiệm. Nó cũng cho phép chúng tôi kiểm soát khi truy vấn được chạy. Mặc dù hầu hết thời gian bạn có thể chạy truy vấn ngay lập tức, nhưng tính linh hoạt trong việc tách truy vấn[] khỏi __construct[] rất hữu ích
Mặc dù WP_Query có rất nhiều quy tắc, nhưng chúng áp dụng cho tất cả các đối tượng hoặc WP_Query, điều đó không có nghĩa là tất cả các đối tượng của WP_Query đều giống nhau. Đó là bởi vì các thuộc tính của chúng sẽ chứa thông tin khác nhau. Ví dụ, nhìn vào mã này
$products = new WP_Query[ [ 'post_type' => 'product' ] ]; $orders = new WP_Query[ [ 'post_type' => 'shop_order' ];
Bây giờ chúng ta có hai phiên bản của lớp WP_Query. Mỗi người sẽ chứa các bài đăng hoàn toàn khác nhau trong thuộc tính bài đăng của họ, nhưng cách mà những bài đăng đó đến đó và cách chúng có thể được truy cập hoặc thay đổi là giống nhau
Một đối tượng là một thể hiện của cái gì
Trong phần trước, tôi đã nói về các đối tượng là phiên bản của WP_Query. Điều chúng tôi muốn nói là những đối tượng này được tạo bằng cách sử dụng lớp WP_Query. Tuy nhiên, đừng quên rằng các lớp có thể được phân lớp. Khi một đối tượng là một thể hiện của một lớp mở rộng một lớp khác, thì nó được coi là một thể hiện của cả hai lớp
Đây là một điểm khác biệt quan trọng vì nó xác định cách hàm is_a[] sẽ hoạt động cũng như quy tắc gợi ý nhập. Nếu tôi tạo một lớp mở rộng WP_Query, nó sẽ được coi là một phiên bản của WP_Query. Đây là một trong những tính năng của kế thừa đối tượng khiến nó trở nên hữu ích
Giả sử bạn có một lớp trừu tượng có tên là “xã hội” và hai lớp mở rộng nó có tên là “Facebook” và “Twitter”. Bạn có thể xác định thể hiện của các lớp này bằng cách kiểm tra xem chúng có phải là thể hiện của “xã hội. ”
$này là gì?
Bên trong một lớp, bạn có thể truy cập phiên bản hiện tại bằng cách sử dụng biến đặc biệt $this. Ngoài lớp học, bạn không thể sử dụng $this nếu không PHP sẽ báo lỗi. Bên trong một lớp, bạn sử dụng $this để truy cập các thuộc tính hoặc phương thức của lớp đó
Biến $this luôn đề cập đến đối tượng hiện tại, bất kể bạn thuộc lớp nào trong hệ thống phân cấp thừa kế. Mặt khác, từ khóa “self” đề cập đến lớp hiện tại, không phải trường hợp hiện tại. Thuộc tính tĩnh không phải là duy nhất cho một đối tượng cụ thể, chúng là duy nhất cho một lớp
Lập trình hướng đối tượng “đúng”
Rất nhiều lần chúng ta thấy các lớp không thực sự đại diện cho một đối tượng rõ ràng. Thay vào đó, chúng là một tập hợp các chức năng liên quan. Trong trường hợp này, lớp đóng vai trò là một không gian tên. Điều này có thể hoặc không thể là một điều xấu
Chúng ta luôn nên kiểm tra những tình huống này theo từng trường hợp. Theo tôi, vấn đề là liệu mã có thể được viết lại thành một tập hợp các hàm không có trong một lớp hay không. Tôi nói điều này bởi vì viết một lớp, chỉ để tránh sử dụng các tiền tố chức năng duy nhất không phải là lý do để sử dụng một lớp, và kém hiệu quả hơn và kém linh hoạt hơn
Nếu tiện ích duy nhất của một lớp là tránh sử dụng các tiền tố duy nhất, thì tại sao không chỉ nhóm các hàm vào một tệp và sử dụng một không gian tên trong tệp đó?
Tuy nhiên, hãy nhớ rằng các lớp có tính kế thừa, khả năng hiển thị và các thuộc tính mà một nhóm chức năng không có. Đây là những lý do hoàn toàn chính đáng để sử dụng một lớp, ngay cả khi nó không phải là PHP hướng đối tượng “đúng”
Trong những tình huống này, bạn thường xử lý một lớp mà một thể hiện không thể phân biệt được với thể hiện tiếp theo. Khởi tạo các lớp này thành các đối tượng và theo dõi các đối tượng đó hầu như luôn có mùi mã xấu và không cần thiết. Trong những tình huống này, tốt hơn hết là khai báo tất cả các phương thức của lớp tĩnh, vì vậy việc khởi tạo là không cần thiết
Nhiều người sẽ nói với bạn rằng chỉ vì bạn đang sử dụng một lớp không có nghĩa là bạn đang sử dụng lập trình hướng đối tượng. Họ đúng. Chỉ cần đừng quên rằng lập trình hướng đối tượng không tốt hơn về mặt phân loại so với các lựa chọn thay thế