Chương trình hướng đối tượng trong PHP. PHP hướng đối tượng: Đặc biệt dành cho người mới bắt đầu

Ngày 16 tháng 4 năm 2008 lúc 12:15 chiều

PHP - OOP hoặc cách tiếp cận thủ tục

  • PHP

PHP là một trong những ngôn ngữ lập trình kịch bản phổ biến nhất. Gần 60% máy chủ web sử dụng PHP. Hàng triệu trang web và ứng dụng web được phát triển bằng PHP mỗi tháng.

PHP ban đầu được phát triển như một sự thay thế đơn giản cho Perl và trong vòng vài năm, nó đã trở nên cực kỳ mạnh mẽ và phổ biến. Ngôn ngữ PHP, bản thân nó rất giống với ANSI C.
Một trong những lý do khiến PHP trở nên phổ biến là thời gian học tập ngắn của nó.

Học PHP hoàn toàn không khó, đặc biệt nếu bạn đã quen với cú pháp Java hoặc C.

Vậy làm thế nào để viết Tập lệnh PHP khá đơn giản, bất kỳ ai cũng có thể viết mã PHP mà không cần tuân theo bất kỳ quy ước nào và trộn lớp trình bày với logic nghiệp vụ (đây là một trong những lý do chính tồn tại số lượng lớn dự án không được quản lý). Bởi vì PHP không nhất thiết phải có các quy ước mã hóa nghiêm ngặt nên theo năm tháng, khi dự án ngày càng lớn hơn, nó sẽ trở thành một ứng dụng khổng lồ, không thể quản lý được.

OOP hoặc Lập trình hướng đối tượng được sử dụng tốt trong thực hành lập trình để tạo các dự án có thể quản lý dễ dàng hơn.
Cách tiếp cận thủ tục liên quan đến việc viết mã chương trình mà không sử dụng các đối tượng. Lập trình thủ tục bao gồm việc viết mã có hoặc không có các thủ tục.

OOP đào tạo bất kỳ ngôn ngữ lập trình nào để tạo ra mã chương trình tốt hơn và được sử dụng để tạo ra mã chương trình tốt hơn. hiệu suất cao và viết dự án lớn, mà không sợ bị nhầm lẫn trong cách quản lý của mình. OOP cung cấp cho bạn khả năng tạo các đối tượng có thể tái sử dụng để bạn hoặc các nhà phát triển khác có thể sử dụng chúng trong dự án của họ mà không cần phải thiết kế lại nhiều lần. OOP loại bỏ các rào cản và sự phức tạp trong việc viết và quản lý các ứng dụng lớn.

PHP cho phép chúng ta viết ứng dụng theo 2 cách khác nhau, cách thứ nhất là hướng thủ tục và cách thứ hai là hướng đối tượng. Nếu bạn vẫn không hiểu sự khác biệt giữa hai cách tiếp cận này, hãy xem xét các đoạn mã này - cùng một ví dụ được viết theo các cách tiếp cận khác nhau.

Thủ tục:

$user_input = $_POST['field'];
$filtered_content = bộ lọc($user_input); // lọc đầu vào của người dùng
mysql_connect("dbhost", "dbuser", "dbpassword"); // cơ sở dữ liệu
mysql_select_db("dbname");
$sql = "một số truy vấn";
$kết quả = mysql_query($sql);
trong khi ($data = mysql_fetch_assoc())
{
quá trình ($ dữ liệu);
}
process_user_input($filtered_content);

Và đây là đoạn mã tương tự sử dụng OOP:

$input_filter = bộ lọc mới();
$input_filter->filter_user_input(); // lọc đầu vào của người dùng
$db = dal mới("mysql"); //lớp truy cập dữ liệu
$db->connect($dbconfig);//chúng tôi đang sử dụng mysql
$result = $db->execute($sql);
ReportGenerator::makereport($result); //xử lý dữ liệu
$model = Postmodel mới($filter->get_filtered_content());
$model->insert();

Nếu để ý kỹ 2 đoạn code này, bạn sẽ nhận thấy code sử dụng OOP dễ đọc và dễ hiểu hơn.

Mã với OOP được tổ chức tốt hơn vì nó rõ ràng đối tượng nào được xử lý bằng cái gì. Các ứng dụng lớn được viết bằng cách sử dụng phương pháp thủ tục gần như không thể nhận biết được sau khi một số phiên bản được phát hành. Tất nhiên, bạn có thể tuân theo các quy tắc nghiêm ngặt để viết mã chương trình, nhưng chúng được hàng triệu nhà phát triển chấp thuận, những người biết rằng điều này cuối cùng sẽ không mang lại cho bạn khả năng kiểm soát và khả năng sử dụng dự án nếu bạn không sử dụng OOP trong chương trình của mình.
Gần như tất cả ứng dụng lớn viết bằng hướng đối tượng
tiếp cận.

Dựa vào những điều trên, chúng ta có thể rút ra những ưu điểm của việc sử dụng OOP:

OOP được tạo ra để giúp cuộc sống của các nhà phát triển trở nên dễ dàng hơn. Sử dụng OOP, bạn có thể chia các vấn đề lớn của mình thành các vấn đề nhỏ dễ giải quyết hơn nhiều.
Yêu cầu chính của OOP: làm mọi thứ bạn muốn làm đối tượng. Đối tượng là những đoạn mã nhỏ riêng biệt có thể kết hợp dữ liệu và thuộc tính với nhau. Trong ứng dụng, tất cả các đối tượng đều tương tác với nhau.

OOP có thể được xem xét tốt hơn từ các góc độ khác nhau, đặc biệt khi thời gian phát triển và quá trình phát triển ứng dụng tiếp theo rất quan trọng đối với bạn.
Những ưu điểm chính của việc sử dụng OOP có thể được thể hiện như sau:

* Tái sử dụng: Đối tượng là một đối tượng logic có tập hợp các thuộc tính, phương thức và có thể tương tác với các đối tượng khác, một đối tượng có thể độc lập hoàn toàn hoặc có thể phụ thuộc vào các đối tượng khác. Một đối tượng thường được tạo ra để giải quyết các vấn đề cụ thể. Do đó, khi các nhà phát triển khác gặp phải vấn đề tương tự, họ có thể đưa lớp của bạn vào dự án của họ và sử dụng nó mà không sợ nó làm gián đoạn quá trình phát triển của họ. Điều này tránh DRY, viết tắt của Đừng lặp lại chính mình. Trong lập trình thủ tục hoặc mô-đun, tái sử dụng chỉ có thể ở dạng tổng hợp.

* Tái cấu trúc: Khi bạn cần sử dụng tính năng tái cấu trúc trong một dự án, OOP mang lại cho bạn những lợi thế tối đa, vì tất cả các đối tượng đều là các phần tử nhỏ và chứa các thuộc tính cũng như phương thức của chúng như một phần của chính chúng. Điều này làm cho việc tái cấu trúc tương đối dễ sử dụng.

* Khả năng mở rộng: Nếu bạn cần mở rộng chức năng của dự án, bạn có thể đạt được kết quả tốt hơn bằng cách sử dụng OOP. Một trong những chức năng chính của OOP là khả năng mở rộng. Bạn có thể sử dụng tái cấu trúc đối tượng để thêm chức năng. Bằng cách làm việc này, bạn vẫn có thể tiết kiệm
khả năng tương thích trước đó của đối tượng - do đó bạn có thể làm việc tốt với mã cũ. Hoặc bạn có thể mở rộng đối tượng và tạo một đối tượng hoàn toàn mới chứa mọi thứ tính chất cần thiết và các phương thức của đối tượng cha mà từ đó đối tượng mới được tạo ra, sau đó thêm các hàm mới vào nó. Đây được gọi là “kế thừa” và là một tính năng rất quan trọng của OOP.

* Ủng hộ: mã hướng đối tượng dễ bảo trì hơn vì
nó tuân theo các quy ước mã hóa rất nghiêm ngặt và được viết theo cách tự giải thích.
Ví dụ: khi nhà phát triển thêm, làm lại hoặc gỡ lỗi mã, anh ta có thể dễ dàng tìm thấy cấu trúc bên trong của mã và thỉnh thoảng duy trì mã đó. Hơn nữa, khi bạn có một nhóm nhà phát triển làm việc trong môi trường của mình, OOP có thể là giải pháp tốt hơn vì bạn có thể phân phối mã của mình giữa các thành viên trong nhóm sau khi chia mã thành các phần nhỏ. Những bộ phận nhỏ này có thể được thiết kế như đồ vật riêng lẻ, do đó các nhà phát triển có thể làm việc gần như độc lập với nhau. Cuối cùng, việc kết hợp tất cả các phần vào một ứng dụng sẽ không khó.

* Hiệu quả: Ý tưởng về OOP thực sự được phát triển để tăng hiệu quả và giảm bớt quá trình phát triển. Một số mẫu thiết kế được phát triển để tạo ra mã tốt và hiệu quả hơn.
Hơn nữa, trong OOP, bạn có thể suy nghĩ về các quyết định của mình một cách thuận tiện hơn so với cách tiếp cận theo thủ tục. Bởi vì bạn chia vấn đề của mình thành nhiều vấn đề nhỏ và bạn tìm ra giải pháp cho từng vấn đề riêng biệt, một vấn đề lớn tự giải quyết.

P.S. cuốn sách habratopic đầu tiên của tôi, nếu bạn thích nó, tôi sẽ dịch cuốn sách sâu hơn, đối với tôi nó khá thú vị và nhiều thông tin

Nếu bạn tìm thấy những lỗi nghiêm trọng trong bản dịch, vui lòng để lại nhận xét. Ý kiến ​​​​của bạn chắc chắn sẽ được tính đến. Dù sao đi nữa, tôi hy vọng bạn tìm thấy bài viết này rất hữu dụng.

Có nhiều sự khác biệt ví dụ đơn giản, trong đó phác thảo nguyên tắc hoạt động của OOP. Hôm nay tôi quyết định cho bạn xem OOP hoạt động như thế nào (Lập trình hướng đối tượng) trong đời thực; đặc biệt ví dụ này hữu ích cho người mới lập trình. Bằng cách tạo một lớp trong MYSQL CRUD (CRUD - tạo đọc cập nhật xóa - “Tạo đọc cập nhật xóa”), bạn có thể dễ dàng tạo, đọc, cập nhật và xóa các bản ghi trong bất kỳ dự án nào của mình, bất kể cơ sở dữ liệu được thiết kế như thế nào.

Khi bạn hiểu những gì chúng tôi cần, bạn có thể dễ dàng tạo bộ xương cho lớp của chúng tôi. Đầu tiên, chúng ta cần đưa vào lớp các hàm cơ bản để làm việc với MySQL. Các tính năng sau đây là bắt buộc.

  • Lựa chọn
  • Chèn
  • Xóa bỏ
  • Cập nhật
  • Kết nối
  • Ngắt kết nối

Dưới đây là định nghĩa của lớp của chúng tôi. Lưu ý rằng tất cả các phương thức tôi đã tạo đều sử dụng từ khóa public.

Cơ sở dữ liệu lớp ( hàm công khai connect() ( ) hàm công khai ngắt kết nối() ( ) hàm công khai select() ( ) hàm công khai chèn() ( ) hàm công khai xóa() ( ) cập nhật hàm công khai() ( ) )

hàm kết nối()

Hàm này sẽ khá đơn giản, nhưng trước khi viết hàm, chúng ta cần xác định một vài biến. Các biến chỉ có thể truy cập được trong lớp, vì vậy mỗi biến được đặt trước bởi từ khóa riêng. Tất cả các biến (máy chủ, tên người dùng, mật khẩu, tên cơ sở dữ liệu) được sử dụng để kết nối với cơ sở dữ liệu Dữ liệu MySQL. Sau này chúng ta có thể tạo một đơn giản truy vấn MySQL vào cơ sở dữ liệu. Tất nhiên, với tư cách là lập trình viên, chúng ta nên mong đợi bất cứ điều gì từ người dùng và dựa trên điều này, chúng ta cần thực hiện một số biện pháp phòng ngừa nhất định. Chúng tôi có thể kiểm tra: nếu người dùng đã được kết nối với cơ sở dữ liệu, thì theo đó, anh ta không cần kết nối lại với cơ sở dữ liệu. Nếu không, chúng tôi có thể sử dụng thông tin đăng nhập của người dùng để kết nối.

Riêng tư db_host = ''; riêng tư db_user = ''; riêng tư db_pass = ''; riêng tư db_name = ''; /* * Kết nối với cơ sở dữ liệu, chỉ cho phép một kết nối */ public function connect() ( if(!$this->con) ( $myconn = @mysql_connect($this->db_host,$this->db_user,$ this- >db_pass); if($myconn) ( $seldb = @mysql_select_db($this->db_name,$myconn); if($seldb) ( $this->con = true; return true; ) else ( return false ; ) ) else ( return false; ) ) else ( return true; ) )

Như bạn có thể thấy ở trên, chúng tôi sử dụng chức năng cơ bản MySQL và kiểm tra một chút lỗi để đảm bảo mọi thứ diễn ra theo đúng kế hoạch. Nếu người dùng đã kết nối với cơ sở dữ liệu, chúng tôi trả về true, nếu không chúng tôi trả về false. Là một phần thưởng bổ sung, chúng tôi đặt biến (con) thành true nếu kết nối được thiết lập.

Ngắt kết nối chức năng công cộng()

Hàm kiểm tra biến kết nối xem nó có tồn tại không. Nếu kết nối được thiết lập (tồn tại), hãy đóng kết nối với cơ sở dữ liệu MySQL và trả về true . Nếu không, bạn không cần phải làm gì cả.

Hàm công khai ngắt kết nối() ( if($this->con) ( if(@mysql_close()) ( $this->con = false; return true; ) else ( return false; ) ) )

Chọn chức năng công cộng ()

Hãy đến phần mà mọi thứ trở nên phức tạp một chút. Chúng tôi bắt đầu làm việc với các đối số của người dùng và trả về kết quả truy vấn. Chúng tôi không cần sử dụng kết quả ngay bây giờ nhưng chúng tôi cần tạo một biến trong đó chúng tôi sẽ lưu trữ kết quả tùy chỉnh cho các truy vấn từ cơ sở dữ liệu. Ngoài ra, chúng tôi cũng sẽ tạo tính năng mới, cái này sẽ kiểm tra xem có cái bàn này trong cơ sở dữ liệu. Hàm này sẽ được tạo riêng vì tất cả các hoạt động CRUD của chúng tôi sẽ yêu cầu kiểm tra như vậy. Vì vậy, điều này sẽ làm sạch mã của chúng tôi một chút và sẽ giúp tối ưu hóa mã hơn nữa. Dưới đây là hàm kiểm tra các bảng (tableExists) và một biến công khai có kết quả của các truy vấn.

Riêng tư $result = array(); /* * Kiểm tra sự tồn tại của bảng khi thực hiện truy vấn * */ hàm riêng tableExists($table) ( $tablesInDb = @mysql_query("SHOW TABLES FROM ".$this->db_name." THÍCH "".$table .""") ; if($tablesInDb) ( if(mysql_num_rows($tablesInDb)==1) ( return true; ) else ( return false; ) ) )

Chức năng này chỉ đơn giản là kiểm tra sự hiện diện bảng mong muốn trong cơ sở dữ liệu. Nếu bảng tồn tại, nó sẽ trả về true, nếu không nó sẽ trả về false.

/* * Truy xuất thông tin từ cơ sở dữ liệu * Bắt buộc: bảng (tên bảng) * Tùy chọn: hàng (cột bắt buộc, phân cách bằng dấu phẩy) * trong đó (cột = giá trị, được truyền dưới dạng chuỗi) * thứ tự (sắp xếp, truyền dưới dạng chuỗi) * / public function select( $table, $rows = "*", $where = null, $order = null) ( $q = "SELECT ".$rows." FROM ".$table; if($where != null ) $q .= " WHERE ".$where; if($order != null) $q .= " ORDER BY ".$order; if($this->tableExists($table)) ( $query = @mysql_query ($q); if($query) ( $this->numResults = mysql_num_rows($query); for($i = 0; $i numResults; $i++) ( $r = mysql_fetch_array($query); $key = array_keys($r) ; for($x = 0; $x 1) $this->result[$i][$key[$x]] = $r[$key[$x]]; nếu không thì if(mysql_num_rows ($query) result = null; else $this->result[$key[$x]] = $r[$key[$x]]; ) ) ) return true; ) else ( return false; ) ) else return true; ) else ( return false; ) ) else return SAI; )

Thoạt nhìn thì có vẻ đáng sợ, nhưng đồng thời chúng tôi đang làm rất nhiều việc quan trọng ở đây. Hàm này có bốn đối số, một trong số đó là bắt buộc. Hàm sẽ trả về kết quả với một đối số duy nhất - tên bảng. Tuy nhiên, bạn có thể mở rộng số lượng đối số và thêm các đối số mới mà bạn có thể sử dụng khi làm việc với cơ sở dữ liệu; xét cho cùng, việc thực thi đúng hàm phụ thuộc vào một đối số - tên bảng. Mã bên trong hàm dùng để biên dịch tất cả các đối số cho truy vấn chọn. Ngay sau khi truy vấn được biên dịch, bạn sẽ cần kiểm tra sự hiện diện của bảng được yêu cầu trong cơ sở dữ liệu - hàm tableExists được sử dụng cho việc này. Nếu bảng được tìm thấy, chức năng sẽ tiếp tục và yêu cầu sẽ được gửi. Nếu không mọi thứ sẽ đi vào bế tắc.

Phần tiếp theo chứa mã thực sự kỳ diệu. Vấn đề là thế này: thu thập dữ liệu được yêu cầu từ bảng. Sau đó, chúng tôi gán kết quả của mình cho một biến. Để đơn giản hóa kết quả cho người dùng cuối, chúng tôi sẽ sử dụng tên cột thay vì phím số. Nếu số hàng trong bảng lớn hơn một thì kết quả đầu ra sẽ là mảng hai chiều trong đó key đầu tiên là số (increment), key thứ hai là tên cột. Nếu chỉ có một hàng trong bảng, nó sẽ trả về mảng một chiều, tên các phím tương ứng với tên các cột trong bảng. Nếu không tìm thấy hàng nào trong bảng, biến kết quả sẽ được đặt thành null. Như tôi đã nói trước đó, mọi thứ có vẻ hơi khó hiểu, nhưng một khi bạn chia mã thành các phần riêng biệt, mọi thứ sẽ trở nên đơn giản và rõ ràng hơn nhiều.

Chèn chức năng công cộng()

Tính năng này đơn giản hơn một chút so với những tính năng trước. Nó chỉ đơn giản cho phép bạn chèn thông tin vào cơ sở dữ liệu. Như vậy, ngoài tên bảng, chúng ta sẽ cần thêm các đối số. Chúng ta sẽ cần một biến chứa các giá trị có liên quan để chèn vào bảng. Sau đó, chúng ta sẽ chỉ phân tách từng giá trị bằng dấu phẩy. Chúng tôi cũng kiểm tra sự hiện diện của bảng mong muốn bằng hàm tableExists và tạo truy vấn chèn bằng cách thao tác các đối số được truyền cho hàm chèn(). Sau đó, chúng tôi gửi yêu cầu của mình đến địa chỉ mong muốn.

/* * Chèn giá trị vào bảng * Bắt buộc: bảng (tên bảng) * value ​​(giá trị được chèn, một mảng giá trị được truyền vào, ví dụ: * array(3,"Name 4"," [email được bảo vệ]");) * Tùy chọn: * hàng (tên của các cột nơi chúng tôi chèn giá trị được truyền dưới dạng chuỗi, * ví dụ: "title,meta,date" * */ public function Insert($table,$values ,$rows = null) ( if ($this->tableExists($table)) ( $insert = "INSERT INTO ".$table; if($rows != null) ( $insert .= " (".$rows .")"; ) cho( $i = 0; $i< count($values); $i++) { if(is_string($values[$i])) $values[$i] = """.$values[$i]."""; } $values = implode(",",$values); $insert .= " VALUES (".$values.")"; $ins = @mysql_query($insert); if($ins) { return true; } else { return false; } } }

Như bạn có thể thấy, chức năng này khá đơn giản so với việc soạn thảo chọn truy vấn vào cơ sở dữ liệu. Trên thực tế, chức năng xóa sẽ còn đơn giản hơn nữa.

Xóa chức năng công cộng ()

Hàm này chỉ cần xóa một bảng hoặc các hàng khỏi cơ sở dữ liệu của chúng tôi. Vì vậy, chúng ta cần truyền tên bảng và một đối số tùy chọn xác định điều kiện cho hàm. Trong điều kiện theo sau từ khóa WHERE, có một giải thích rõ ràng: xóa một hàng, các hàng hoặc toàn bộ bảng. Nếu mệnh đề Where bị bỏ qua thì tất cả các hàng sẽ bị xóa. Sau đó, yêu cầu xóa được thực hiện và yêu cầu được thực hiện.

/* * Xóa bảng hoặc các bản ghi thỏa mãn điều kiện * Bắt buộc: bảng (tên bảng) * Tùy chọn: trong đó (điều kiện), được truyền dưới dạng chuỗi, ví dụ: "id=4" */ public function delete($ table,$where = null) ( if($this->tableExists($table)) ( if($where == null) ( $delete = "DELETE ".$table; ) else ( $delete = "DELETE FROM " .$table." WHERE ". $where; ) $del = @mysql_query($delete); if($del) ( return true; ) else ( return false; ) ) else ( return false; ) )

Cuối cùng, hãy chuyển sang chức năng chính cuối cùng của chúng ta. Hàm này được sử dụng để cập nhật một hàng trong cơ sở dữ liệu thông tin mới. Chức năng này thoạt nghe có vẻ khó hiểu, tuy nhiên điều này không hoàn toàn đúng. Chúng tôi sẽ sử dụng tất cả các nguyên tắc tương tự như trước đây. Ví dụ: các đối số sẽ được sử dụng để soạn yêu cầu cập nhật. Chúng ta cũng sẽ kiểm tra sự tồn tại của bảng bằng phương thức tableExists. Nếu bảng tồn tại, hãy cập nhật hàng thích hợp. Tất nhiên, phần khó nhất là nơi chúng tôi viết yêu cầu cập nhật. Vì câu lệnh cập nhật có quy tắc cập nhật tất cả các hàng cùng một lúc nên chúng ta cần tính đến điều này và điều chỉnh điểm này cho chính xác. Vì vậy, tôi quyết định chuyển điều kiện ở đâu dưới dạng một mảng đơn giản. Đối số đầu tiên trong mảng này là tên cột, đối số tiếp theo là giá trị cột. Do đó, mọi số chẵn (kể cả 0) tương ứng với một tên cột và mọi số lẻ đều chứa một giá trị lẻ. Mã có liên quan là dưới đây:

Với($i = 0; $i

Trong phần tiếp theo, chúng ta sẽ tạo phần cập nhật của câu lệnh bằng cách thiết lập các biến. Bởi vì bạn có thể thay đổi bất cứ điều gì giá trị số, Tôi thích một mảng có các khóa theo tên cột và các giá trị mới. Vì vậy, tất cả những gì chúng ta phải làm là kiểm tra loại giá trị và nơi chúng ta cần đặt dấu phẩy. Bây giờ chúng ta đã viết xong hai phần chính của câu lệnh cập nhật, không khó để hoàn thành câu lệnh cập nhật, đoạn mã được trình bày bên dưới:

Hàm công khai update($table,$rows,$where,$condition) ( if($this->tableExists($table)) ( // Phân tích các giá trị ở đâu // các giá trị chẵn (bao gồm 0) chứa trong đó các hàng // giá trị lẻ chứa các mệnh đề cho hàng for($i = 0; $i

Như vậy là chúng ta đã tạo xong hàm cuối cùng và lớp làm việc với CRUD của chúng ta có thể coi là hoàn thành. Bây giờ bạn có thể tạo bản ghi mới, đọc từng bản ghi từ cơ sở dữ liệu, cập nhật bản ghi và xóa bản ghi. Ngoài ra, khi bạn bắt đầu sử dụng lại lớp này, bạn sẽ thấy rằng bạn tiết kiệm được đáng kể thời gian và dòng mã. Tức là bạn sẽ cảm nhận được tính hiệu quả và ưu điểm của OOP.

Cách sử dụng

Vậy là chúng ta đã tạo xong lớp của mình, nhưng chúng ta sử dụng nó như thế nào? Mọi thứ đều đơn giản ở đây. Hãy bắt đầu bằng cách tạo một cơ sở dữ liệu đơn giản để kiểm tra lớp của chúng ta. Tôi đã tạo cơ sở dữ liệu thử nghiệm và biên dịch mysql đơn giản nhà điều hành. Bạn có thể đặt nó vào bất kỳ cơ sở dữ liệu nào.


Dòng đầu tiên được nhận xét vì không phải lúc nào cũng cần thiết. Nếu bạn cần chạy mã trước đó nhiều lần, bạn sẽ cần bỏ ghi chú dòng đầu tiên để đảm bảo rằng bảng được tạo.

Bây giờ bảng của chúng ta đã được tạo và điền, đã đến lúc chạy một số truy vấn đơn giản.

kết nối(); $db->select("mysqlcrud"); $res = $db->getResult(); print_r($res); ?>

Nếu mọi thứ được thực hiện chính xác, bạn sẽ thấy như sau:

Tương tự, chúng ta có thể chạy truy vấn cập nhật và đưa ra kết quả.

update("mysqlcrud",array("name"=>"Đã thay đổi!"),array("id",1),"="); $db->update("mysqlcrud",array("name"=>"Changed2!"),array("id",2),"="); $res = $db->getResult(); print_r($res); ?>

Tại lối ra:

Bây giờ chúng ta hãy chèn mục nhập:

Insert("mysqlcrud",array(3,"Tên 4"," [email được bảo vệ]")); $res = $db->getResult(); print_r($res); ?>

Chúng tôi sẽ đề cập đến các khái niệm như lập trình hướng đối tượng, các lớp PHP, hàm tạo PHP, hàm hủy PHP, phép thuật Phương thức PHP vân vân. Hướng dẫn này dành cho người mới bắt đầu và những lập trình viên có kinh nghiệm muốn học PHP OOP từ cấp độ cơ bản.

Một trong những thay đổi lớn nhất trong PHP 5 là việc đưa vào một mô hình hoàn toàn dựa trên đối tượng, giúp cải thiện hiệu suất. Một số tính năng mới quan trọng được thêm vào trong PHP 5 bao gồm các phương thức cuối cùng và trừu tượng, các lớp, giao diện, nhân bản và các phương thức ma thuật. Chúng ta sẽ xem xét hướng dẫn này Các ví dụ về OOP PHP về cách sử dụng từng cái.

Trong lập trình hướng đối tượng, một đối tượng được xử lý giống như cách tham chiếu hoặc con trỏ. Điều này có nghĩa là mỗi biến mới chứa một tham chiếu đến đối tượng chứ không phải là bản sao của toàn bộ đối tượng.

Khái niệm khó hiểu nhất là những điều cơ bản về OOP, vì chúng khác với lập trình PHP thông thường. Nhưng một khi bạn hiểu được các nguyên tắc cơ bản, bản thân mô hình sẽ trở nên đơn giản và rõ ràng đối với bạn.

OOP trong PHP là gì?

Vì thuật ngữ lập trình hướng đối tượng bắt đầu bằng từ "đối tượng", nên chúng ta có thể nói rằng đó là một kiểu lập trình đặc biệt trong đó các đối tượng được tạo và sử dụng.

Đây là lời giải thích về PHP OOP dành cho người chưa biết. Hãy nhìn thế giới xung quanh chúng ta, nó có rất nhiều đồ vật. Mặt trời, mặt trăng, ô tô, cây cối, nhà cửa, v.v. và như thế. Tất cả đều là đối tượng, chúng có thuộc tính và chức năng. Trong quá trình suy nghĩ, chúng ta hoạt động với các đồ vật. Khi chúng ta nói về một chiếc ô tô, bạn không nghĩ về bánh xe, động cơ, ghế ngồi, cửa ra vào, bạn nghĩ về chiếc ô tô như chính nó. Nói một cách đơn giản, bạn nghĩ về chủ thể hoặc đối tượng. Hướng đối tượng là sự biểu diễn các phần tử dưới dạng đối tượng trong lập trình.

Chiếc xe là một vật thể. Nó có các thuộc tính về màu sắc, kích thước, trọng lượng và chức năng di chuyển. Bất kỳ đối tượng nào không có chức năng sẽ vô dụng. Trong OOP, lập trình viên sử dụng các đối tượng; mọi đối tượng đều có một số thuộc tính và chức năng. Nói chung, lập trình bao gồm việc xây dựng các mô-đun bằng cách sử dụng các đối tượng.

Một định nghĩa đơn giản về lập trình hướng đối tượng:

Lập trình hướng đối tượng là lập trình dựa trên các đối tượng chứa dữ liệu (thuộc tính) và phương thức (chức năng) xử lý dữ liệu này. Đối tượng là một loại dữ liệu được xác định bởi người lập trình và sự tương tác giữa các đồ vật khác nhau cũng do người lập trình quyết định.

Nói cách khác, OOP cho phép người lập trình nhóm các tác vụ giống nhau thành các lớp, lớp có thể chứa dữ liệu và các hàm truy cập dữ liệu đó, có liên quan với nhau.

OOP cơ bản trong PHP giúp bạn phát triển mã dễ bảo trì và quản lý hơn. Mã càng rõ ràng và dễ đọc thì càng có nhiều khả năng được sử dụng lại. Kết quả là, các mẫu thiết kế có thể được áp dụng cho hệ thống. Trong OOP, các mô-đun được tạo và sử dụng theo yêu cầu. Với sự trợ giúp của lập trình hướng đối tượng trong PHP, chúng ta có thể tạo ứng dụng cho các trang web có cấu trúc mô-đun.

Các thuật ngữ quan trọng trong hướng dẫn PHP OOP:

Dưới đây là định nghĩa chung của một số điều khoản quan trọng, thường được sử dụng trong PHP hướng đối tượng.

Lớp học

trong OOP Lớp PHP là kiểu dữ liệu do người lập trình xác định. Lớp chứa dữ liệu và các hàm để làm việc với dữ liệu này. Dữ liệu và chức năng có ID truy cập riêng. Điều này có nghĩa là chúng không thể nhìn thấy bên ngoài lớp học. Lớp là một mẫu hoặc mẫu mà từ đó có thể tạo ra bao nhiêu bản sao hoặc phiên bản nếu cần.

Một đối tượng

Một đối tượng còn được gọi là một thể hiện. Khi một thể hiện của một lớp được cài đặt, một đối tượng sẽ được tạo. Nếu một lớp là một mẫu thì đối tượng là sản phẩm cuối cùng được tạo bằng mẫu đó. Khi một lớp đã được định nghĩa, nhiều đối tượng có thể được tạo từ nó.

Biến thành viên

Các biến được định nghĩa trong một lớp được gọi là biến thành viên. Thực chất đó là dữ liệu chứa trong lớp này, nó chỉ có thể được thay đổi bởi các hàm của lớp này. Thông thường, các biến thành viên chỉ hiển thị với lớp đó và ẩn khỏi các lớp khác.

Hàm thành viên

Các hàm được định nghĩa trong một lớp được gọi là các hàm thành viên. Chúng cũng không được nhìn thấy bởi các lớp khác. Chúng được sử dụng để thay đổi các biến thành viên để truy cập dữ liệu đối tượng.

Người xây dựng

Hàm tạo là một loại hàm thành viên đặc biệt. Khi một lớp được thiết lập, một đối tượng được tạo, hàm này sẽ được gọi tự động và được gán giá trị ban đầu các biến lớp.

Hàm hủy diệt

Đây là một loại hàm đặc biệt được gọi tự động khi một đối tượng bị xóa.

Di sản

Trong PHP 5 OOP, kế thừa là quá trình trong đó một lớp (lớp con) nhận tất cả các thuộc tính và chức năng của một lớp khác (siêu lớp).

Siêu đẳng cấp

Còn được gọi là lớp cơ sở hoặc lớp cha - được kế thừa bởi một hoặc nhiều lớp con.

Lớp con

Là lớp con hoặc lớp dẫn xuất, lớp con kế thừa từ lớp cha.

Đa hình

Đây là một hiện tượng trong OOP trong đó một hàm duy nhất có thể được sử dụng cho nhiều mục đích.

Đóng gói

Một trong những khái niệm quan trọng nhất trong lập trình hướng đối tượng. Dữ liệu và các chức năng hoạt động với dữ liệu này được kết nối với nhau và các chức năng khác không thể nhìn thấy được.

Trừu tượng

Tính trừu tượng có nghĩa là chi tiết triển khai của các hàm hoặc lớp không được hiển thị.

, có nghĩa là các hàm có cùng tên, nhưng số lượng đối số khác nhau được thực thi khác nhau.

Các lớp và đối tượng:

Lớp và đối tượng được sử dụng rộng rãi đồng nghĩa trong lập trình hướng đối tượng, nhưng về cốt lõi, chúng rất khác nhau. Một lớp đại diện cho một mẫu, mẫu hoặc khuôn và một đối tượng là một sản phẩm hoặc bộ phận được đúc từ mẫu hoặc khuôn cụ thể đó.

Hãy lấy một ngôi nhà làm ví dụ. Lớp học là nền tảng của ngôi nhà; nó có kích thước, hình dạng, số lượng cửa, lối đi, v.v. Nhưng đây chỉ là một dự án chứ không phải ngôi nhà. Khi một ngôi nhà vật chất được xây dựng dựa trên thông tin có trong bản vẽ, nó là một vật thể.

Trước đó, vật thể là một đống gỗ, gạch, xi măng, v.v., từ đó một ngôi nhà hoặc vật thể được xây dựng theo thông tin trong kế hoạch:

Một lớp trong PHP OOP là một kế hoạch hoặc mẫu mà theo đó một phiên bản của một lớp được cài đặt và một đối tượng được tạo ra. Khi lớp đã được tạo, chúng ta có thể tạo bao nhiêu đối tượng tùy thích. Trong hình trên, năm đối tượng (ngôi nhà) được tạo từ một lớp (sơ đồ). Một đối tượng sẽ luôn tuân theo các hướng dẫn được đưa ra trong lớp được sử dụng để tạo ra nó.

Ưu điểm của OOP trong PHP:

  1. Cải thiện kiến ​​trúc và mã sạch hơn

PHP hướng đối tượng được phân loại tốt hơn và dễ dàng đóng gói, cho phép bạn chỉ định kiến ​​trúc tối ưu. Thông thường mỗi lớp được lưu trong một tập tin riêng biệt. Ngôn ngữ thủ tục được đặc trưng bởi mã phức tạp rất khó đọc hoặc khó hiểu. Trong OOP, bằng cách triển khai các đối tượng chứa dữ liệu riêng tư với định nghĩa rõ ràng về mối quan hệ giữa các đối tượng, mã sẽ dễ đọc và rõ ràng.

  1. Tái sử dụng

Lập trình hướng đối tượng giúp mã có thể tái sử dụng được. Các đối tượng được tạo một lần có thể được sử dụng nhiều lần. Các chương trình có thể được xây dựng bằng cách kết hợp các mô-đun làm việc thay vì viết mọi thứ từ đầu. Điều này tiết kiệm thời gian và cải thiện năng suất.

  1. Dễ dàng bảo trì và cập nhật

Các đối tượng có dữ liệu và chức năng riêng, đồng thời toàn bộ cấu trúc của chúng được nén và nén, giúp bạn dễ dàng thực hiện các thay đổi đối với mã. Lập trình thủ tục thông thường tạo ra mã trong đó rất khó tìm ra điểm để thực hiện thay đổi. Trong PHP OOP, chúng ta có thể thêm một thuộc tính mới và sau đó thêm các phương thức liên quan để thao tác với thuộc tính đó.

  1. Đóng gói

Đóng gói có nghĩa là các giá trị của các biến của đối tượng không thể nhìn thấy được từ bên ngoài, do đó bảo mật dữ liệu được thực hiện. Nhưng nếu có nhu cầu, dữ liệu có thể được truy cập bằng cách sử dụng công cụ sửa đổi truy cập. Để tạo chương trình an toàn dữ liệu và các hàm thành viên trong một lớp có thể bị ẩn khỏi các lớp khác. Khi một đối tượng được tạo, không cần thông tin triển khai để sử dụng nó.

  1. Di sản

Lớp kế thừa nhận tất cả các đặc điểm của lớp cha và sau đó thêm các đặc điểm riêng của nó vào đó. Lớp con kế thừa các biến và phương thức của lớp cha. Chúng ta có thể mở rộng việc sử dụng các lớp hiện có và loại bỏ những mã không cần thiết.

" Nó sẽ hữu ích cho cả người mới bắt đầu và những người đã khá giỏi viết mã không hướng đối tượng và muốn tìm hiểu tại sao OOP vẫn cần thiết.

Điều khiến tôi viết nhiều bài về OOP trong php là tôi không tìm thấy bài viết nào về chủ đề này làm tôi hài lòng. Có những sách hướng dẫn hoặc bài viết chính thức khô khan và nhàm chán về cơ bản chỉ trình bày những sách hướng dẫn giống nhau với nhiều chi tiết hơn. ví dụ chi tiết, trên Internet cũng có rất nhiều thông tin lỗi thời về chủ đề này.

Tại sao bạn cần OOP?

Sự phổ biến và đơn giản của PHP dẫn đến thực tế là hầu hết mã được viết bằng ngôn ngữ này có chất lượng rất đáng ngờ. Chỉ cần một chút thời gian rảnh rỗi để học ngôn ngữ này và một chút kiên trì, ngay cả khi chưa quen với lập trình, bạn cũng có thể bắt đầu viết ứng dụng web. BẰNG học php bạn có thể làm cho chúng hoạt động hiệu quả hơn. Tuy nhiên, nếu bạn không dành thời gian để thiết kế, bạn sẽ sớm làm được chức năng bổ sung Vào ứng dụng, việc gỡ lỗi và kiểm tra nó trở nên phức tạp hơn và để thêm một số điều nhỏ nhặt, bạn phải khuấy động số lượng mã ngày càng tăng, nó ngày càng trở nên khó hiểu và khó hiểu, các nhà phát triển khác khi đọc mã của bạn sẽ bắt đầu chửi thề và chỉ trích nó một cách gay gắt.

Minh họa từ cuốn sách “Clean Code” - Robert Martin

Vậy thỏa thuận là gì? Tại sao dự án mà bạn nghĩ đến khi được mở rộng lại nhanh chóng biến thành một đống mã khó hiểu với vô số lỗi? Thực tế là những người mới bắt đầu viết mã chỉ thực hiện những gì được yêu cầu trong một tình huống cụ thể và không liên quan đến việc thực hiện bất kỳ thay đổi nào. Cách tiếp cận này không được chấp nhận, đặc biệt đối với các ứng dụng web, tất nhiên sẽ phải tăng trưởng và phát triển nếu chúng trở nên phổ biến. Sớm hay muộn, bạn và có thể cả các nhà phát triển khác sẽ cần quay lại mã đã viết trước đó và thực hiện các thay đổi đối với nó, và việc thực hiện điều này càng dễ dàng thì ứng dụng của bạn sẽ phát triển và trở nên phổ biến nhanh hơn.

Tất nhiên, cách tiếp cận lập trình hướng đối tượng không phải là thuốc chữa bách bệnh cho mọi bệnh tật và bản thân nó sẽ không làm cho mã của bạn tốt hơn, nhưng việc sử dụng nó sẽ cho phép bạn trình bày mã không phải như một loạt các hàm và biến, mà như một tập hợp các đối tượng tương tác với nhau, điều này rõ ràng hơn nhiều. Dữ liệu sẽ không nằm ở bất cứ đâu - nó sẽ được lưu trữ trong các đối tượng, bảo vệ dữ liệu khỏi bị lạm dụng. Các hàm (trong lập trình hướng đối tượng, chúng được gọi là các phương thức) sẽ không chỉ thực hiện các hành động với các biến - chúng sẽ mô tả hành vi của các đối tượng. Về bản chất, điều này liên quan đến việc lập mô hình các thực thể thực, chẳng hạn như người dùng, bài đăng, nhận xét về nó, v.v.

Ngoài ra, cái gọi là mẫu thiết kế cũng phổ biến trong OOP - các mẫu để giải quyết một vấn đề liên tục nảy sinh trong lập trình. Trước hết, việc sử dụng các mẫu này sẽ cho phép bạn biết giải pháp cho một vấn đề nhất định trước khi nó phát sinh và thứ hai, giải pháp cho vấn đề đó sẽ rõ ràng đối với các nhà phát triển khác đã quen thuộc với mẫu bạn đã sử dụng.

Các khái niệm cơ bản

OOP là một phương pháp lập trình (phương pháp, cách tiếp cận) theo đó phần mềmđược biểu diễn dưới dạng các đối tượng tương tác. Tôi không đồng ý rằng OOP luôn ngụ ý việc sử dụng các lớp - js giống như một ngôn ngữ hướng đối tượng, nhưng nó không có các lớp. Tuy nhiên, khi áp dụng vào php OOP luôn ngụ ý việc sử dụng các lớp học.

Dưới sự vật Thông thường nó được hiểu là một thực thể có tên nào đó lưu trữ dữ liệu và có hành vi riêng. Hành vi của một đối tượng và cấu trúc dữ liệu mà nó lưu trữ, cũng như cách truy cập dữ liệu này, mô tả lớp mà đối tượng đó thuộc về. Lớp họcĐây là mô tả về các đối tượng có liên quan, tương tự nhau, thường lưu trữ cùng một bộ dữ liệu và có cùng hành vi. Một đối tượng thuộc về một lớp cụ thể được gọi là sao chép. Một ví dụ là một lớp mô tả một người dùng. Lớp này mô tả cấu trúc dữ liệu mà mỗi phiên bản của lớp này sẽ lưu trữ. Hãy để dữ liệu này là thông tin đăng nhập và mật khẩu của bạn. Một đối tượng lớp lưu trữ các giá trị đăng nhập và mật khẩu cụ thể sẽ là một thể hiện của lớp này.

Ba trụ cột của OOP


OOP dựa trên ba nguyên tắc, thường được gọi là ba trụ cột của OOP, đó là:

  • đóng gói
  • tính đa hình
  • di sản

Đóng gói là nguyên tắc theo đó dữ liệu được kết hợp và lưu trữ trong các đối tượng, đồng thời cũng được bảo vệ khỏi việc sử dụng không đúng cách.

Bạn có thể thấy lạ khi lập trình viên hạn chế quyền đọc hoặc thay đổi dữ liệu, nhưng điều thường xảy ra là rất khó theo dõi và hiểu đầy đủ cách thức hoạt động của mã và do đó, cần tránh các tình huống rõ ràng là sai.
Một ví dụ về lạm dụng dữ liệu là cố gắng gán độ tuổi âm cho một thể hiện của lớp Person. Đương nhiên, nỗ lực như vậy với mã được viết tốt sẽ không thành công, nếu không nguyên tắc đóng gói sẽ bị vi phạm.
Trong thực tế, nguyên tắc đóng gói là dữ liệu được truy cập bằng các phương thức có thể lọc hoặc điều chỉnh các giá trị của dữ liệu mà chúng ta đang cố gắng thay đổi.

Di sản là quá trình một loại đối tượng (lớp) có được các thuộc tính nhất định của một loại đối tượng khác.

Điều thường xảy ra là việc mô tả một loại đối tượng, tức là một lớp, hoàn toàn nằm dưới mô tả của một loại đối tượng khác. Ví dụ: một lớp mô tả quản trị viên cũng có thể mô tả người dùng, ngoại trừ việc người dùng đó không có quyền truy cập. Trong trường hợp này, sẽ hợp lý hơn khi tạo một lớp mô tả quản trị viên, hậu duệ lớp mô tả người dùng. Đồng thời, trong lớp mô tả quản trị viên, chúng ta không phải mô tả dữ liệu và hành vi đã được mô tả trong lớp “người dùng”, chúng ta chỉ cần mô tả dữ liệu sẽ chịu trách nhiệm cấp quyền truy cập. Trong trường hợp này lớp "người dùng" sẽ là tổ tiên lớp “quản trị viên”, có thể có con riêng và con đó có thể có con riêng, v.v. Chuỗi kế thừa có thể dài bao nhiêu tùy thích. Ngoài ra, một tổ tiên có thể có nhiều con cháu, mỗi con cháu sẽ tiếp thu hoàn toàn những đặc tính của tổ tiên và thêm vào đó những thứ của riêng mình, nếu không thì việc thừa kế là vô nghĩa.

Đa hình là việc sử dụng cùng một tên phương thức để giải quyết một số vấn đề tương tự.

Việc sử dụng cùng một tên phương thức cho cùng một hành động với các loại đối tượng khác nhau của cùng một chuỗi kế thừa là điều tự nhiên. Việc thực hiện phương thức này có thể khác nhau ở mỗi lớp và khi gọi phương thức này chúng ta sẽ không biết Làm sao anh ấy đang làm gì đó, nhưng chúng ta sẽ biết Cái gì anh ấy làm dựa trên tên của mình. Hãy quay lại ví dụ của chúng tôi với người dùng và quản trị viên. Cả quản trị viên và người dùng đều có thể đăng nhập và chọn một tên phương thức cho hành động này một cách tự nhiên, chẳng hạn như đăng nhập. Việc triển khai cụ thể của nó trong các lớp này có thể khác nhau, ví dụ: trong quá trình ủy quyền, chúng tôi ghi lại quyền truy cập của quản trị viên vào phiên nhưng không ghi lại quyền truy cập của người dùng. Khi viết mã xử lý dữ liệu nhận được từ biểu mẫu mã, sau khi tạo một phiên bản của lớp, việc người dùng đơn giản hay quản trị viên đăng nhập sẽ không thành vấn đề - đối với một phiên bản của bất kỳ lớp nào trong hai lớp này, chúng tôi sẽ gọi một phương thức có cùng tên.

Lý thuyết nhàm chán thế là đủ rồi. Lần tới tôi sẽ viết về cách mô tả các lớp, tạo các thể hiện của lớp, truy cập dữ liệu (các trường) và các phương thức thể hiện.

Trong hướng dẫn này, bạn sẽ tìm hiểu những điều cơ bản về lập trình hướng đối tượng trong PHP. Bạn sẽ tìm hiểu về các nguyên tắc của OOP nói chung và học cách viết các tập lệnh đơn giản trong PHP.

Chào mừng bạn đến với bài đầu tiên trong chuỗi bài học về OOP trong PHP! Bằng cách hoàn thành tất cả các bài học trong loạt bài này, bạn sẽ tìm hiểu về các nguyên tắc và khái niệm cơ bản của OOP cũng như học cách tạo một cách nhanh chóng và dễ dàng ứng dụng hữu ích trong PHP.

Trong hướng dẫn này, tôi sẽ bắt đầu giúp bạn nắm bắt nhanh và cho bạn biết về các khái niệm cơ bản về OOP. Bạn sẽ học:

  • OOP là gì
  • OOP sẽ giúp bạn tạo như thế nào PHP tốt nhất kịch bản
  • một số khái niệm cơ bản như lớp, đối tượng, phương thức, biến lớp
  • nơi để bắt đầu viết PHP kịch bản

Bạn đã sẵn sàng đi sâu vào thế giới của các đối tượng PHP chưa? Rồi đi thẳng!

Lập trình hướng đối tượng là gì?

Nếu bạn đã từng tạo và sử dụng các hàm tùy chỉnh trong PHP thì bạn đã sử dụng kiểu lập trình thủ tục. Trong lập trình thủ tục, bạn thường tạo các cấu trúc dữ liệu - số, chuỗi, mảng, v.v. - để lưu trữ một số dữ liệu và sau đó xử lý các cấu trúc này bằng các chức năng đặc biệt để thao tác dữ liệu này.

Lập trình hướng đối tượng, hay OOP, đã tiến lên phía trước vì ở đây chúng tôi lưu trữ các cấu trúc dữ liệu và các hàm xử lý chúng trong một thực thể duy nhất gọi là đối tượng. Thay vì xử lý dữ liệu bằng một số chức năng, bạn tải dữ liệu đó vào một đối tượng và sau đó gọi các phương thức của nó để thao tác và nhận được kết quả mong muốn.

Thông thường, các đối tượng được tạo bằng OOP phản ánh các thực thể thực. Ví dụ: nếu bạn đang tạo một diễn đàn cho trang web của mình, bạn sẽ tạo một đối tượng Thành viên sẽ lưu trữ thông tin về từng thành viên diễn đàn (tên, thông tin đăng nhập, email, mật khẩu, v.v.), cũng như các phương thức sẽ xử lý thông tin này ( đăng ký, ủy quyền, đăng xuất, cấm, v.v.).

Tại sao nên sử dụng OOP?

Hướng thủ tục và hướng đối tượng là hai những cách khác Làm điều tương tự. Điều này không có nghĩa là cái này tốt hơn cái kia - mọi người đều viết theo ý mình, vì vậy bạn thậm chí có thể dễ dàng kết hợp hai cách tiếp cận này trong một tập lệnh.

Tuy nhiên, đây là một số lợi ích của OOP dành cho nhà phát triển:

  • Việc phản ánh các tình huống thực tế sẽ dễ dàng hơn: như tôi đã lưu ý ở trên, các đối tượng phản ánh các thực thể thực - con người, sản phẩm, thẻ, bài viết blog, v.v. Điều này giúp đơn giản hóa đáng kể nhiệm vụ khi bạn mới bắt đầu thiết kế ứng dụng của mình, vì mục đích của từng đối tượng giống như một mục tiêu, mối quan hệ giữa các đối tượng sẽ rõ ràng và dễ hiểu.
  • Viết chương trình mô-đun dễ dàng hơn: OOP liên quan đến việc viết các mô-đun. Bằng cách chia mã của bạn thành các mô-đun, bạn sẽ dễ dàng quản lý, gỡ lỗi và mở rộng mã hơn.
  • Việc viết mã sẽ được sử dụng nhiều lần sẽ dễ dàng hơn: Viết mã có thể được sử dụng nhiều lần sẽ tiết kiệm thời gian khi viết ứng dụng và theo thời gian, bạn thậm chí có thể tạo toàn bộ thư viện gồm các loại mô-đun này mà bạn có thể sử dụng trong nhiều trường hợp. các ứng dụng. Với sự trợ giúp của OOP, việc viết mã như vậy trở nên tương đối dễ dàng hơn vì cấu trúc dữ liệu và hàm được gói gọn trong đối tượng duy nhất, có thể được sử dụng bất kỳ số lần.

Một số khái niệm cơ bản

Trước khi bắt đầu viết script, bạn cần hiểu rõ về các khái niệm về lớp, đối tượng, biến lớp và phương thức.

Các lớp học

Một lớp là một khuôn khổ cho một đối tượng. Đây là một đoạn mã xác định:

  • Các kiểu dữ liệu mà các đối tượng lớp được tạo sẽ chứa
  • Các hàm sẽ chứa các đối tượng này.

Khi bạn tạo một ứng dụng OOP, bạn thường sẽ tạo một số lớp đại diện cho Nhiều loại khác nhau các thực thể của ứng dụng của bạn. Ví dụ: để tạo một diễn đàn, bạn có thể tạo các lớp Diễn đàn, Chủ đề, Bài đăng và Thành viên.

Các đối tượng

Đối tượng là một biến loại đặc biệt, được tạo thông qua lớp. Nó chứa dữ liệu thực tế và các chức năng để thao tác nó. Bạn có thể tạo bao nhiêu đối tượng tùy thích từ một lớp duy nhất. Mỗi chức năng của một đối tượng đều độc lập với đối tượng khác, ngay cả khi chúng được tạo từ cùng một lớp.

Để so sánh với các thực thể thực tế:

  • Một lớp là khuôn khổ cho một chiếc ô tô: nó xác định hình thức và hoạt động của chiếc ô tô, nhưng nó vẫn là một thực thể trừu tượng
  • Một đối tượng là một chiếc ô tô thật được tạo ra từ wireframe: nó có các đặc tính thực (chẳng hạn như tốc độ) và hành vi (chẳng hạn như tăng tốc hoặc phanh).

Lưu ý: Một đối tượng thường được gọi là bản chất của một lớp và quá trình tạo đối tượng của một lớp được gọi là quá trình triển khai.

Biến lớp

Các giá trị dữ liệu được lưu trữ trong một đối tượng cụ thể được ghi vào các biến đặc biệt gọi là biến lớp. Các biến lớp được liên kết chặt chẽ với đối tượng của nó. Mặc dù tất cả các đối tượng của một lớp đều có cùng biến nhưng giá trị của chúng có thể khác nhau.

phương pháp

Các hàm được định nghĩa trong một lớp và được sử dụng trên các đối tượng của lớp đó được gọi là các phương thức. Chúng không khác nhiều so với các hàm thông thường - bạn có thể truyền giá trị cho chúng, chúng có thể chứa các biến cục bộ và trả về giá trị. Tuy nhiên, các phương thức thường hoạt động với các biến đối tượng hơn. Ví dụ: phương thức login() để đăng nhập người dùng vào diễn đàn của bạn có thể đặt biến lớp logIn thành true.

Làm cách nào để tạo một lớp trong PHP?

Bây giờ bạn đã biết lớp, phương thức, biến lớp và đối tượng là gì, đã đến lúc tạo một vài lớp và đối tượng trong mã PHP.

Đầu tiên, hãy xem cách tạo một lớp thực sự. Về cơ bản, kịch bản tạo một lớp trông như thế này:

Lớp ClassName ( // (định nghĩa lớp) )

Ví dụ: nếu bạn đang tạo một lớp Thành viên cho diễn đàn của mình, bạn sẽ viết điều này:

Thành viên lớp ( // (định nghĩa lớp) )

Nó khá đơn giản. Đương nhiên, lớp này sẽ không làm gì cho đến khi bạn thêm các biến và phương thức vào nó. Tuy nhiên, đoạn mã trên tạo ra một lớp PHP hợp lệ có thể được sử dụng.

Quy tắc ứng xử tốt: xếp mỗi lớp vào tập tin riêng biệt có cùng tên với tên lớp. Ví dụ: đặt lớp Member vào tệp Member.php và lưu trữ nó trong một thư mục, chẳng hạn như các lớp.

Làm cách nào để tạo đối tượng trong PHP?

Bạn có thể tạo một đối tượng bằng từ khóa mới:

Tên lớp mới()

Mã này sẽ tạo một đối tượng của lớp ClassName. Bạn sẽ cần sử dụng đối tượng này sau này, vì vậy bạn cần lưu trữ nó trong một biến. Ví dụ: hãy tạo một đối tượng của lớp Member và lưu trữ nó trong biến $member:

$member = Thành viên mới();

Chúng ta cũng có thể tạo một đối tượng khác cùng lớp:

$member2 = Thành viên mới();

Mặc dù chúng ta đã tạo hai đối tượng này từ cùng một lớp, các biến $member và $member2 vẫn độc lập với nhau.

Tạo các biến lớp

Bây giờ chúng ta đã biết cách tạo các lớp và đối tượng lớp, hãy xem cách tạo các biến lớp. Có 3 trình truy cập cho các biến lớp có thể được thêm vào một lớp:

  • Biến lớp công khai (công khai): có thể truy cập - tức là chúng có thể được đọc và/hoặc sửa đổi - ở bất kỳ đâu trong tập lệnh, bất kể mã này nằm ở đâu - bên trong lớp hay bên ngoài nó
  • Biến lớp riêng (riêng tư): chỉ có thể truy cập được bằng các phương thức lớp. Tốt nhất nên đặt các biến lớp ở chế độ riêng tư để tách các đối tượng khỏi phần còn lại của mã.
  • Các biến của lớp được bảo vệ: Có sẵn cho các phương thức của lớp của bạn, cũng như các phương thức của các lớp được kế thừa (chúng ta sẽ nói về tính kế thừa sau).

Để tạo một biến lớp, hãy viết từ khóa công khai, riêng tư hoặc được bảo vệ, sau đó nhập tên của biến:

Lớp ClassName ( public $propertyName; private $propertyName; protected $propertyName; )

Hãy thêm một biến lớp công khai vào lớp Thành viên của chúng tôi để lưu tên người dùng:

Thành viên lớp ( public $username = ""; )

Lưu ý rằng chúng ta đã khởi tạo biến lớp, giá trị của nó là chuỗi rỗng, “”. Điều này có nghĩa là khi người dùng mới được tạo, tên người dùng mặc định sẽ bằng dòng trống. Cũng giống như trường hợp các biến thông thường trong PHP, các biến lớp không cần phải được khởi tạo, nhưng tốt hơn hết là đừng lười biếng. Nếu bạn không khởi tạo biến lớp, giá trị mặc định của nó là null.

Truy cập các biến lớp

Để có quyền truy cập vào một biến của đối tượng, hãy sử dụng toán tử ->:

$object->propertyName

Hãy thử. Hãy viết một đoạn script khai báo một lớp Member và một biến lớp, tạo một đối tượng của lớp này, sau đó đặt giá trị của biến lớp và hiển thị nó trên màn hình:

tên người dùng = "Fred"; echo $thành viên->tên người dùng; // In "Fred" ?>

Chạy mã này, nó sẽ hiển thị chuỗi “Fred”, giá trị của biến lớp $member->username. Như bạn có thể thấy, bạn thao tác trên một biến đối tượng giống như một biến thông thường - bạn có thể đặt nó thành một giá trị và đọc nó.

Thêm phương thức vào một lớp

Còn việc tạo phương thức thì sao? Như tôi đã đề cập trước đó, các phương thức chỉ là các hàm thông thường là một phần của một lớp. Vì vậy bạn có thể không ngạc nhiên khi chúng được tạo ra bằng cách sử dụng cùng một từ khóa hàm. Sự khác biệt duy nhất so với việc tạo các hàm thông thường là bạn cũng có thể thêm một trong các mã định danh truy cập (công khai, riêng tư, được bảo vệ) vào phần khai báo của nó. Theo cách này, các phương thức tương tự như các biến lớp:

Lớp ClassName ( public function MethodName() ( // (code) ) Private function MethodName() ( // (code) ) protected function MethodName() ( // (code) ) )

Lưu ý: giống như trong trường hợp biến lớp, các phương thức công khai có thể được gọi từ bất cứ đâu, các phương thức riêng tư chỉ có thể được gọi trong lớp và các phương thức được bảo vệ có thể được gọi từ chính lớp đó và lớp con của nó.

Hãy thử thêm một số phương thức và biến lớp vào lớp của chúng ta:

  • biến lớp $loggedIn riêng tư để xác định người dùng, tức là dù anh ấy có vào hay không,
  • login(), sẽ đăng nhập vào diễn đàn bằng cách đặt biến lớp $loggedIn thành true,
  • logout(), phương thức này sẽ đăng xuất khỏi diễn đàn bằng cách đặt biến lớp $loggedIn thành false,
  • isLoggedIn(), phương thức này sẽ trả về giá trị của biến lớp $loggedIn.

Đây là mã của chúng tôi:

đã đăng nhập = đúng; ) hàm công khai logout() ( $this->loggedIn = false; ) hàm công khai isLoggedIn() ( return $this->loggedIn; ) ) ?>

Bạn có thể nhận thấy rằng chúng tôi đã sử dụng từ khóa $this mới. Trong ngữ cảnh các phương thức của một đối tượng, biến đặc biệt $this đề cập đến chính đối tượng đó. Bằng cách sử dụng $this trong một phương thức đối tượng, phương thức đó có thể truy cập bất kỳ biến lớp và phương thức nào của đối tượng.

Ví dụ: phương thức login() có thể truy cập biến lớp $loggedIn của đối tượng thông qua $this->loggedIn.

Nhân tiện, biến lớp của chúng ta là riêng tư, vì vậy nó không thể được gọi từ bất kỳ phần nào của tập lệnh mà chỉ từ các phương thức login(), logout() và isLoggedIn(). Đây là một cách tiếp cận tốt vì các phần bên trong của đối tượng (chẳng hạn như cách nó ghi lại chính xác xem người dùng có đăng nhập hay không) tách biệt với phần còn lại của mã. Bất cứ khi nào có thể, hãy cố gắng sử dụng các biến lớp riêng tư để các đối tượng của bạn có tính tự chủ, di động và được bảo vệ.

Lưu ý: biến lớp $username trong ví dụ của chúng tôi là biến công khai. Tôi làm điều này chỉ để chứng minh cách bạn có thể truy cập các biến lớp của đối tượng. Trong các dự án thực tế, bạn muốn đặt biến này ở chế độ riêng tư và tạo các biến lớp công khai đặc biệt để đặt giá trị tên người dùng nếu cần.

Sử dụng phương pháp

Để gọi một phương thức trên một đối tượng, hãy sử dụng toán tử -> mà bạn đã quen thuộc.

$object->methodName()

Điều này hoạt động giống như gọi một hàm thông thường. Bạn có thể truyền đối số trong dấu ngoặc đơn (tất nhiên giả sử phải có một số đối số), lệnh gọi phương thức cũng có thể trả về giá trị nhất định, sau đó bạn có thể sử dụng.

đã đăng nhập = đúng; ) hàm công khai logout() ( $this->loggedIn = false; ) hàm công khai isLoggedIn() ( return $this->loggedIn; ) ) $member = new Member(); $member->username = "Fred"; echo $member->username . "là". ($thành viên->
"; $member->login(); echo $member->username . " là " . ($member->isLoggedIn() ? "đã đăng nhập" : "đăng xuất") . "
"; $member->logout(); echo $member->username . " là " . ($member->isLoggedIn() ? "đã đăng nhập" : "đăng xuất") . "
"; ?>

Kịch bản này sẽ hiển thị như sau:

Fred đã đăng xuất Fred đã đăng nhập Fred đã đăng xuất

Đây là cách nó hoạt động:

  1. Sau khi mô tả lớp Member, chúng ta tạo đối tượng của nó và lưu trữ nó trong biến $member. Chúng tôi cũng đặt cho biến lớp $username của đối tượng này giá trị “Fred”.
  2. Sau đó, chúng tôi gọi phương thức $member->isLoggedIn() để xác định xem người dùng đã đăng nhập hay chưa. Phương thức này chỉ đơn giản trả về giá trị của biến lớp $loggedIn. Vì giá trị mặc định của biến lớp này là sai nên kết quả của việc gọi $member->isLoggedIn() sẽ sai, do đó thông báo "Fred đã đăng xuất" sẽ được hiển thị.
  3. Sau đó chúng ta gọi phương thức login(). Nó sẽ đặt biến lớp $loggedIn thành true.
  4. Bây giờ, khi gọi phương thức $member->isLoggedIn(), nó sẽ trả về true và hiển thị thông báo "Fred is posted in".
  5. Hãy gọi phương thức logout() để đặt giá trị của thuộc tính $loggedIn thành false.
  6. Hãy gọi phương thức $member->isLoggedIn() lần thứ ba. Bây giờ nó sẽ trả về false vì thuộc tính $loggedIn lại được đặt thành false. Vì vậy, thông báo “Fred đã đăng xuất” sẽ hiển thị lại.

Lưu ý: trong trường hợp bạn nhìn thấy điều này đầu tiên: ?: là toán tử ba ngôi. Đây là phiên bản đơn giản của khối if...else. Bạn có thể tìm hiểu về các loại toán tử này.

kết luận

Trong hướng dẫn này, bạn đã học những điều cơ bản về OOP trong PHP. Bạn đã học về những điều như:

  • OOP là gì và tại sao nó hữu ích?
  • các khái niệm về lớp, đối tượng, biến lớp và phương thức
  • cách tạo lớp và đối tượng
  • cách tạo và sử dụng các biến lớp
  • khái niệm về mã định danh truy cập công cộng, riêng tư, được bảo vệ
  • cách tạo và sử dụng các phương thức lớp

Bạn đã học được nhiều điều về nó và bạn sẽ học được nhiều điều hơn nữa trong các bài học sau. Tuy nhiên, nếu bạn đã học qua tất cả các ví dụ tôi đưa ra thì bạn đã có nền tảng vững chắc. Bạn có thể bắt đầu tạo ứng dụng bằng OOP.