_lấy trong php

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
9

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
0

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
1

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
2

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
3

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
4

Các phương thức ma thuật là các phương thức đặc biệt ghi đè hành động mặc định của PHP khi một số hành động nhất định được thực hiện trên một đối tượng

thận trọng

Tất cả các tên phương thức bắt đầu bằng

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
5 đều được bảo lưu bởi PHP. Do đó, không nên sử dụng các tên phương thức như vậy trừ khi ghi đè hành vi của PHP

Các tên phương thức sau đây được coi là ma thuật. __construct(), __destroy(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __serialize(), __unserialize(), __toString(

Cảnh báo

Nếu các khai báo kiểu được sử dụng trong định nghĩa của một phương thức ma thuật, thì chúng phải giống với chữ ký được mô tả trong tài liệu này. Nếu không, một lỗi nghiêm trọng được phát ra. Trước PHP 8. 0. 0, không có chẩn đoán nào được phát ra. Tuy nhiên, __construct() và __desturation() không được khai báo kiểu trả về;

serialize() kiểm tra xem lớp có chức năng với tên ma thuật __sleep(). Nếu vậy, chức năng đó được thực thi trước bất kỳ tuần tự hóa nào. Nó có thể dọn sạch đối tượng và được cho là trả về một mảng có tên của tất cả các biến của đối tượng đó sẽ được tuần tự hóa. Nếu phương thức không trả về bất cứ thứ gì thì

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
6 được đánh số thứ tự và
string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
7 được cấp

Ghi chú

Không thể __sleep() trả về tên của các thuộc tính riêng trong các lớp cha. Làm điều này sẽ dẫn đến lỗi cấp độ

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
7. Sử dụng __serialize() thay thế

Mục đích sử dụng của __sleep() là chuyển giao dữ liệu đang chờ xử lý hoặc thực hiện các tác vụ dọn dẹp tương tự. Ngoài ra, chức năng này rất hữu ích nếu một đối tượng rất lớn không cần phải lưu hoàn toàn

Ngược lại, unserialize() kiểm tra sự hiện diện của một hàm có tên ma thuật __wakeup(). Nếu có, chức năng này có thể tái tạo lại bất kỳ tài nguyên nào mà đối tượng có thể có

Mục đích sử dụng của __wakeup() là thiết lập lại mọi kết nối cơ sở dữ liệu có thể đã bị mất trong quá trình tuần tự hóa và thực hiện các tác vụ khởi tạo lại khác

Ví dụ #1 Ngủ và thức dậy

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
9

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
0

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
1

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
0

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
1

công khai __serialize(). mảng

công khai __unserialize(mảng

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
2). khoảng trống

serialize() kiểm tra xem lớp có chức năng với tên ma thuật __serialize(). Nếu vậy, chức năng đó được thực thi trước bất kỳ tuần tự hóa nào. Nó phải xây dựng và trả về một mảng kết hợp gồm các cặp khóa/giá trị đại diện cho dạng tuần tự hóa của đối tượng. Nếu không có mảng nào được trả về, TypeError sẽ bị ném

Ghi chú

Nếu cả __serialize() và __sleep() được định nghĩa trong cùng một đối tượng, thì chỉ __serialize() được gọi. __sleep() sẽ bị bỏ qua. Nếu đối tượng triển khai giao diện Serializable, phương thức

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
3 của giao diện sẽ bị bỏ qua và __serialize() được sử dụng thay thế

Mục đích sử dụng của __serialize() là để xác định một biểu diễn tùy ý thân thiện với tuần tự hóa của đối tượng. Các phần tử của mảng có thể tương ứng với thuộc tính của đối tượng nhưng không bắt buộc

Ngược lại, unserialize() kiểm tra sự hiện diện của một hàm có tên ma thuật __unserialize(). Nếu có, hàm này sẽ được chuyển qua mảng đã khôi phục được trả về từ __serialize(). Sau đó, nó có thể khôi phục các thuộc tính của đối tượng từ mảng đó khi thích hợp

Ghi chú

Nếu cả __unserialize() và __wakeup() được xác định trong cùng một đối tượng, thì chỉ __unserialize() sẽ được gọi. __wakeup() sẽ bị bỏ qua

Ghi chú

Tính năng này có sẵn kể từ PHP 7. 4. 0

Ví dụ #2 Tuần tự hóa và hủy tuần tự hóa

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
9

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
0

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
1

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
7

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
8

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
9

công khai __toString(). sợi dây

Phương thức __toString() cho phép một lớp quyết định nó sẽ phản ứng như thế nào khi nó được xử lý như một chuỗi. Ví dụ, những gì

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
0 sẽ in

Cảnh báo

Kể từ PHP 8. 0. 0, giá trị trả về tuân theo ngữ nghĩa kiểu PHP tiêu chuẩn, nghĩa là nó sẽ bị ép buộc thành một chuỗi nếu có thể và nếu tính năng gõ nghiêm ngặt bị tắt

Kể từ PHP 8. 0. 0, bất kỳ lớp nào chứa phương thức __toString() cũng sẽ triển khai ngầm giao diện Stringable và do đó sẽ vượt qua kiểm tra kiểu cho giao diện đó. Nên triển khai giao diện một cách rõ ràng

Trong PHP7. 4, giá trị được trả về phải là một chuỗi, nếu không sẽ xảy ra Lỗi

Trước PHP 7. 4. 0, giá trị được trả về phải là một chuỗi, nếu không thì một

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
1 gây tử vong sẽ được phát ra

Cảnh báo

Không thể ném ngoại lệ từ bên trong phương thức __toString() trước PHP 7. 4. 0. Làm như vậy sẽ dẫn đến một lỗi nghiêm trọng

Ví dụ #3 Ví dụ đơn giản

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
2

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
3

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
4

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
5

Ví dụ trên sẽ xuất ra

__gọi(

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
6). Trộn

Phương thức __invoke() được gọi khi tập lệnh cố gắng gọi một đối tượng dưới dạng hàm

Ví dụ #4 Sử dụng __invoke()

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
7

Ví dụ trên sẽ xuất ra

Ví dụ #5 Sử dụng __invoke()

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
8

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}
9

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
50

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
51

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
52

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
53

Ví dụ trên sẽ xuất ra

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
7

tĩnh __set_state (mảng

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
54). sự vật

Phương thức tĩnh này được gọi cho các lớp được xuất bởi var_export()

Tham số duy nhất của phương thức này là một mảng chứa các thuộc tính được xuất ở dạng

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
55

Ví dụ #6 Sử dụng __set_state()

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
56

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
57

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
58

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}
59

Ví dụ trên sẽ xuất ra

string(60) "A::__set_state(array(
   'var1' => 5,
   'var2' => 'foo',
))"
object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

Ghi chú. Khi xuất một đối tượng, var_export() không kiểm tra xem __set_state() có được triển khai bởi lớp của đối tượng hay không, do đó, việc nhập lại các đối tượng sẽ dẫn đến một ngoại lệ Lỗi, nếu __set_state() không được triển khai. Đặc biệt, điều này ảnh hưởng đến một số lớp nội bộ. Lập trình viên có trách nhiệm xác minh rằng chỉ các đối tượng sẽ được nhập lại, có lớp thực hiện __set_state()

Phương thức này được gọi bởi var_dump() khi kết xuất một đối tượng để lấy các thuộc tính sẽ được hiển thị. Nếu phương thức không được xác định trên một đối tượng, thì tất cả các thuộc tính công khai, được bảo vệ và riêng tư sẽ được hiển thị