Hãy hiểu với mã ví dụ sau
Tạo đối tượng stdClass đa chiều cho mục đích trình diễn
$student1 = new stdClass[]; $student1->name = "John"; $student1->id = 123; $student2 = new stdClass[]; $student2->name = "Peter"; $student2->id = 321; $students = array[ "math" => $student1, "science" => $student2 ]; $objects = [object] $students; $mixedArray = array[ "user" => array[ array[ 'name' => 'Henry', 'age' => '24' ] ], "students" => $objects ]; $mixedObjects = [object] $mixedArray;
Mã trên sẽ tạo đối tượng stdClass là
stdClass Object [ [user] => Array [ [0] => Array [ [name] => Henry [age] => 24 ] ] [students] => stdClass Object [ [math] => stdClass Object [ [name] => John [id] => 123 ] [science] => stdClass Object [ [name] => Peter [id] => 321 ] ] ]
Lặp qua đối tượng stdClass $mixedObjects->students và hiển thị các giá trị như bên dưới
foreach [$mixedObjects->students as $obj => $student] { echo "Department : " . $obj . " => Name: " . $student->name . " | id:" . $student->id; echo "
"; }
đầu ra
Department : math => Name: John | id:123 Department : science => Name: Peter | id:321
PHP hiện đại chủ yếu dựa vào kiểu hướng đối tượng để cấu trúc mã. Bạn sẽ tìm thấy phong cách này trong nhiều thư viện, khuôn khổ và dự án
Đối tượng là gì?
Trong PHP
$my_address = new Address[];
var_dump[$my_address];
7 là một trong những kiểu nguyên thủy. Nó mô tả một giá trị là một gói dữ liệu và thường logic để hoạt động trên dữ liệu đóMột đối tượng cho phép bạn xử lý các cấu trúc dữ liệu phức tạp dưới dạng các giá trị đơn lẻ. Hãy lấy một địa chỉ làm ví dụ. Nó bao gồm một số mẩu dữ liệu
- đường phố
- số nhà
- thành phố
- mã bưu điện
- quốc gia
Với các kiểu nguyên thủy đơn giản hơn, chúng tôi không thể lưu trữ địa chỉ theo cách có ý nghĩa, vì vậy chúng tôi cần cấu trúc dữ liệu để lưu trữ địa chỉ trong một giá trị duy nhất để đảm bảo, chúng tôi theo dõi mọi phần dữ liệu thuộc về nó
Chúng tôi cũng cần đảm bảo rằng tất cả các địa chỉ đều có cùng cấu trúc để các phần của ứng dụng xử lý địa chỉ có thể dựa vào. Ví dụ: thuộc tính
$my_address = new Address[];
var_dump[$my_address];
8 của một địa chỉ phải luôn có cùng tên. Nếu đôi khi nó được gọi là $my_address = new Address[];
var_dump[$my_address];
9, nó sẽ dẫn đến sự không nhất quán và các lỗi nguy hiểm tiềm tàngĐể đảm bảo một cấu trúc đối tượng nhất định, chúng tôi sử dụng "lớp", một loại bản thiết kế cho một đối tượng
object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
0 và định nghĩa rằng tất cả các đối tượng của lớp này đều có năm thuộc tính giống nhau mà chúng ta cần lưu trữ một địa chỉTên lớp được viết theo phong cách gọi là
object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
1. như object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
2Để tạo một đối tượng địa chỉ từ lớp này, chúng ta sử dụng toán tử
object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
3$my_address = new Address[];
var_dump[$my_address];
đầu ra
________số 8_______Đầu ra cho chúng ta biết, nó là một
$my_address = new Address[];
var_dump[$my_address];
7 của lớp object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
5 và nó có 5 thuộc tính. object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
6 là ID nội bộ mà PHP gán cho mọi đối tượng để theo dõi chúngCủa cải
Bây giờ, mọi thuộc tính của đối tượng của chúng ta là
object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
7, đây là giá trị đặc biệt của PHP cho "không có gì ở đây". Để điền giá trị địa chỉ này bằng dữ liệu thực tế, chúng tôi có thể đặt từng thuộc tính riêng lẻ$my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
đầu ra
object[Address]#1 [5] {
["street"]=>
string[11] "Main Street"
["house_number"]=>
int[42]
["city"]=>
string[9] "Some Town"
["postal_code"]=>
int[12345]
["country"]=>
string[7] "Far Far Away"
}
Để truy cập một thuộc tính của một đối tượng, PHP sử dụng toán tử
object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
8, vì vậy object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
9 có nghĩa là "thuộc tính $my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
0 của đối tượng trong biến $my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
1"phương pháp
Nhưng việc thiết lập từng thuộc tính đơn lẻ rất tẻ nhạt và không dễ đọc. Điều gì sẽ xảy ra nếu chúng ta có thể thiết lập tất cả cùng một lúc?
street = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
$my_address = new Address[];
$my_address->set["Main Street", 42, "Some Town", 12345, "Far Far Away"];
var_dump[$my_address];
đầu ra
object[Address]#1 [5] {
["street"]=>
string[11] "Main Street"
["house_number"]=>
int[42]
["city"]=>
string[9] "Some Town"
["postal_code"]=>
int[12345]
["country"]=>
string[7] "Far Far Away"
}
Những gì chúng tôi đã thêm, là một phương pháp. Một hàm được thêm vào mọi đối tượng trong lớp của chúng tôi. Bên trong một phương thức, có một biến đặc biệt gọi là
$my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
2, nó tham chiếu đến đối tượng mà phương thức đó được gọi, trong trường hợp này là đối tượng địa chỉPhương thức
$my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
3 chỉ sao chép các giá trị mà nó nhận được thông qua các đối số của nó sang các thuộc tính đối tượng tương ứngnhà xây dựng
Tạo một đối tượng địa chỉ mà không có bất kỳ dữ liệu nào ngay từ đầu không thực sự có ý nghĩa. Sẽ hữu ích và dễ sử dụng hơn nếu chúng ta có thể đặt dữ liệu ngay khi chúng ta tạo đối tượng. Có một phương pháp đặc biệt để làm điều đó, nó được gọi là "hàm tạo"
street = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
$my_address = new Address["Main Street", 42, "Some Town", 12345, "Far Far Away"];
var_dump[$my_address];
Đầu ra sẽ vẫn như cũ một lần nữa. Nhưng lần này, chúng ta không cần gọi thêm một phương thức để khởi tạo đối tượng của mình. Nếu một lớp có phương thức có tên chính xác là
$my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
4, nó sẽ được gọi khi đối tượng được tạo bằng toán tử object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
3. Tất cả các đối số từ cuộc gọi object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
3 cũng sẽ được chuyển đến hàm tạoHiển thị
Ngay bây giờ, mọi thứ trong đối tượng
object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
5 của chúng tôi đều có thể truy cập được từ bên ngoài. Một đoạn mã không hoạt động tốt có thể làm điều nàyfunction does_bad_things[$address]
{
$address->city = "Gotham City";
return $address;
}
Chức năng đó sẽ sửa đổi một địa chỉ sau khi nó được tạo và chứa đầy dữ liệu. Điều đó thật vô nghĩa, một địa điểm không thay đổi địa chỉ, những con đường không chuyển sang một thành phố khác một cách kỳ diệu. Mọi người có thể chuyển đến một địa chỉ mới nhưng bản thân địa chỉ đó không thể thay đổi. Chúng tôi cần ngăn địa chỉ bị thay đổi sau khi được tạo. Đó là nơi khái niệm "khả năng hiển thị" xuất hiện. Bạn có thể đã tự hỏi, tất cả các từ khóa
$my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
8 cho đến bây giờ là gìstreet = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
Bây giờ, chúng tôi đã thay đổi mức độ hiển thị của các thuộc tính địa chỉ của chúng tôi thành
$my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
9. Hàm object[Address]#1 [5] {
["street"]=>
string[11] "Main Street"
["house_number"]=>
int[42]
["city"]=>
string[9] "Some Town"
["postal_code"]=>
int[12345]
["country"]=>
string[7] "Far Far Away"
}
0 từ trước giờ sẽ bị lỗi$my_address = new Address[];
var_dump[$my_address];
0Có ba cấp độ hiển thị trong PHP.
$my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
8, $my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
9 và object[Address]#1 [5] {
["street"]=>
string[11] "Main Street"
["house_number"]=>
int[42]
["city"]=>
string[9] "Some Town"
["postal_code"]=>
int[12345]
["country"]=>
string[7] "Far Far Away"
}
3. Hiện tại, $my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
8 có nghĩa là "có thể truy cập được từ bên ngoài đối tượng và $my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
9 có nghĩa là "không thể truy cập được từ bên ngoài". Chúng ta sẽ đi vào chi tiết hơn về vấn đề này và ý nghĩa của object[Address]#1 [5] {
["street"]=>
string[11] "Main Street"
["house_number"]=>
int[42]
["city"]=>
string[9] "Some Town"
["postal_code"]=>
int[12345]
["country"]=>
string[7] "Far Far Away"
}
3 khi chúng ta nói về thừa kế sauBây giờ chúng ta có một đối tượng
object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
5 bất biến [không thể thay đổi] đẹp nhưng nó không thể làm bất cứ điều gì. Chúng tôi thậm chí không thể đọc dữ liệu từ nó. Giả sử chúng ta cần những địa chỉ này ở dạng văn bản thuần túy, có thể gửi chúng qua email hoặc gửi chúng đến công ty vận chuyển cho trang web cửa hàng của chúng taChúng tôi sẽ thêm một phương thức cung cấp cho chúng tôi dữ liệu địa chỉ trong một đoạn văn bản được định dạng đẹp mắt
$my_address = new Address[];
var_dump[$my_address];
1Bây giờ chúng ta có thể tạo một địa chỉ và lấy biểu diễn văn bản được định dạng của nó
$my_address = new Address[];
var_dump[$my_address];
2Và đầu ra sẽ là
$my_address = new Address[];
var_dump[$my_address];
3Chúng ta có thể làm cho điều này thuận tiện hơn bằng cách sử dụng một "phương pháp kỳ diệu" khác. Các lớp PHP có một loạt các phương thức đặc biệt, tất cả đều bắt đầu bằng
object[Address]#1 [5] {
["street"]=>
string[11] "Main Street"
["house_number"]=>
int[42]
["city"]=>
string[9] "Some Town"
["postal_code"]=>
int[12345]
["country"]=>
string[7] "Far Far Away"
}
8 và được thực thi tự động tại một số điểm nhất định, object[Address]#1 [5] {
["street"]=>
string[11] "Main Street"
["house_number"]=>
int[42]
["city"]=>
string[9] "Some Town"
["postal_code"]=>
int[12345]
["country"]=>
string[7] "Far Far Away"
}
9 cũng là một trong số đóLần này, chúng ta sẽ tạo một phương thức
street = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
$my_address = new Address[];
$my_address->set["Main Street", 42, "Some Town", 12345, "Far Far Away"];
var_dump[$my_address];
0 từ street = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
$my_address = new Address[];
$my_address->set["Main Street", 42, "Some Town", 12345, "Far Far Away"];
var_dump[$my_address];
1 của chúng ta. Nó được gọi mỗi khi đối tượng của chúng ta được sử dụng như thể nó là một chuỗi, ví dụ như khi chúng ta thử street = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
$my_address = new Address[];
$my_address->set["Main Street", 42, "Some Town", 12345, "Far Far Away"];
var_dump[$my_address];
2$my_address = new Address[];
var_dump[$my_address];
4Bây giờ chúng ta chỉ có thể sử dụng địa chỉ như thể nó đã là một chuỗi
$my_address = new Address[];
var_dump[$my_address];
5Điều này sẽ tạo ra đầu ra giống như trước đây
Bây giờ chúng ta có một lớp cho các đối tượng địa chỉ gói dữ liệu [các thuộc tính] và một số logic [hàm tạo và phương thức toString] và được bảo vệ khỏi sự sửa đổi bên ngoài
tĩnh
Trong khi các thuộc tính và phương thức thường thuộc về các thể hiện của các lớp, có những trường hợp khi chính một lớp cần giữ các giá trị trong các thuộc tính hoặc cung cấp các phương thức. Chúng được gọi là các thuộc tính và phương thức của
street = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
$my_address = new Address[];
$my_address->set["Main Street", 42, "Some Town", 12345, "Far Far Away"];
var_dump[$my_address];
3Phương pháp street = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
$my_address = new Address[];
$my_address->set["Main Street", 42, "Some Town", 12345, "Far Far Away"];
var_dump[$my_address];
4 mà không tạo ra một thể hiện nào của street = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
$my_address = new Address[];
$my_address->set["Main Street", 42, "Some Town", 12345, "Far Far Away"];
var_dump[$my_address];
5. Thay vì object[Address]#1 [5] {
["street"]=>
NULL
["house_number"]=>
NULL
["city"]=>
NULL
["postal_code"]=>
NULL
["country"]=>
NULL
}
8, chúng tôi sử dụng street = $street;
$this->house_number = $house_number;
$this->city = $city;
$this->postal_code = $postal_code;
$this->country = $country;
}
}
$my_address = new Address[];
$my_address->set["Main Street", 42, "Some Town", 12345, "Far Far Away"];
var_dump[$my_address];
7 để truy cập các thuộc tính và phương thức tĩnh của lớpCác công cụ sửa đổi khả năng hiển thị [
$my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
8, $my_address->street = "Main Street";
$my_address->house_number = 42;
$my_address->city = "Some Town";
$my_address->postal_code = "12345";
$my_address->country = "Far Far Away";
9 và object[Address]#1 [5] {
["street"]=>
string[11] "Main Street"
["house_number"]=>
int[42]
["city"]=>
string[9] "Some Town"
["postal_code"]=>
int[12345]
["country"]=>
string[7] "Far Far Away"
}
3] áp dụng theo cách tương tự như đối với các trường hợpTruy cập tĩnh ít phổ biến hơn trong PHP vì nó thường đưa ra các vấn đề tương tự như các biến toàn cục. một lớp có thuộc tính tĩnh về cơ bản giống như một biến toàn cục và có thể khiến bạn rất khó theo dõi nơi nó được thay đổi và nó được đọc từ đâu