Cho dù bạn là nhà phát triển PHP dày dạn kinh nghiệm hay người mới làm quen với việc phát triển PHP, nếu bạn đã làm việc với OOP trong PHP, thì bạn đã sử dụng ít nhất một vài phương thức kỳ diệu của PHP rồi. Tuy nhiên, nếu bạn chưa nghe nói về các phương thức ma thuật PHP, hãy để tôi giới thiệu chúng
Các tên hàmprivate $name;09,private $name;10,private $name;11,private $name;12,private $name;13,private $name;14,private $name;15,private $name;16,private $name;17,private $name;18,private $name;19,private $name;20,private $name;21,private $name;22 vàprivate $name;23 thật kỳ diệu trong các lớp học PHP. Bạn không thể có các chức năng với những tên này trong bất kỳ lớp nào của mình trừ khi bạn muốn chức năng kỳ diệu được liên kết với chúng. Tất cả các phương thức ma thuật PHẢI được khai báo là công khai
Nếu bạn thắc mắc tại sao các phương thức này được gọi là phương thức ma thuật, thì đó là bởi vì nếu bạn định nghĩa một trong các phương thức này trong lớp của mình, thì nó sẽ được gọi tự động và bạn chỉ cần xác định điều gì sẽ xảy ra bên trong nó. Ví dụ tốt nhất về một phương thức ma thuật là hàm
private $name;24, được gọi tự động khi đối tượng được khởi tạo
Nói chung, các phương thức ma thuật trong PHP cho phép bạn thực hiện nhiều loại thao tác khác nhau với các đối tượng. Chúng cũng cho phép bạn xử lý một số loại tình huống bằng cách điều khiển các đối tượng
Phương pháp ma thuật PHP
Mục đích của bài viết này là đi qua tất cả các phương thức kỳ diệu trong PHP và giải thích ngắn gọn từng phương thức
Phương pháp private $name;
24
Nếu bạn định nghĩa phương thức này trong lớp của mình, nó sẽ tự động được gọi khi một đối tượng được khởi tạo. Mục đích của phương thức này là gán một số giá trị mặc định cho thuộc tính đối tượng. Phương thức này còn được gọi là hàm tạo
Hãy xem một ví dụ nhanh để hiểu cách thức hoạt động của nó
private $name;7
private $name;8
private $name;9
private $name;0
private $name;1
private $name;
private $name;3
private $name;4
private $name;5
private $name;6
private $name;80
private $name;81
private $name;82
private $name;83
private $name;84
private $name;85
private $name;86
private $name;87
private $name;88
private $name;89
private $name;90
private $name;91
private $name;92
private $name;93
private $name;94
private $name;95
private $name;96
private $name;97
private $name;98
private $name;99
private $name;00
private $name;01
private $name;02
private $name;03
private $name;04
Trong ví dụ trên, khi bạn khởi tạo một đối tượng mới với
private $name;26____027
private $name;28, nó sẽ gọi phương thức
private $name;24 ngay từ đầu. Trong phương thức
private $name;24, chúng tôi đã gán các giá trị được truyền trong các đối số cho các thuộc tính của đối tượng
Hãy nhớ rằng hàm tạo của lớp cha sẽ không được gọi ngầm nếu lớp con đã định nghĩa hàm tạo của chính nó
Phương pháp private $name;
31
Phương thức
private $name;31 được gọi là hàm hủy và nó được gọi khi đối tượng bị hủy. Nói chung, nó cũng được gọi khi tập lệnh bị dừng hoặc thoát. Mục đích của phương pháp này là tạo cơ hội lưu trạng thái đối tượng hoặc bất kỳ hoạt động dọn dẹp nào khác mà bạn muốn thực hiện
Hãy cùng xem ví dụ sau
private $name;7
private $name;8
private $name;9
private $name;0
private $name;1
private $name;
private $name;3
private $name;4
private $name;5
private $name;6
private $name;80
private $name;81
private $name;82
private $name;83
private $name;84
private $name;85
private $name;86
private $name;87
private $name;88
private $name;89
private $name;90
private $name;91
private $name;93
private $name;8
private $name;94
private $name;82
private $name;96
private $name;32
private $name;98
private $name;34
private $name;99
private $name;90
private $name;01
private $name;92
private $name;03
private $name;40
private $name;95
private $name;42
private $name;97
private $name;44
private $name;45
private $name;00
private $name;47
private $name;02
private $name;49
private $name;50
private $name;51
private $name;52
private $name;53
private $name;54
private $name;55
private $name;56
private $name;57
private $name;58
private $name;04
Cũng giống như các hàm tạo, một phần tử con cũng có thể kế thừa hàm hủy của cha mẹ nếu nó không có phần triển khai của riêng nó.
Phương pháp private $name;
33
Phương thức ma thuật
private $name;33 được gọi khi bạn cố gắng đặt dữ liệu thành các thuộc tính đối tượng không thể truy cập hoặc không tồn tại. Mục đích của phương pháp này là thiết lập dữ liệu đối tượng bổ sung mà bạn chưa xác định rõ ràng các thuộc tính đối tượng
Hãy quay lại ví dụ của chúng tôi để hiểu cách thức hoạt động của nó
private $name;7__
private $name;8
private $name;9
private $name;0
private $name;1
private $name;65
private $name;3
private $name;5
private $name;68
private $name;6
private $name;82
private $name;81
private $name;802
private $name;83
private $name;90
private $name;85
private $name;92
private $name;87
private $name;89
private $name;809
private $name;91
private $name;93
private $name;812
private $name;94
private $name;814
private $name;019
Như bạn có thể thấy trong ví dụ trên, chúng tôi đang cố gắng đặt thuộc tính
private $name;35 không tồn tại. Và do đó, phương pháp
private $name;33 được gọi là. Đối số đầu tiên của phương thức
private $name;33 là tên của thuộc tính đang được truy cập và đối số thứ hai là giá trị mà chúng tôi đang cố gắng đặt
Phương pháp private $name;
38
Trong trường hợp ví dụ về phương thức
private $name;33 trong phần trước, chúng ta đã thảo luận cách đặt giá trị cho các thuộc tính không tồn tại. Phương pháp
private $name;38 hoàn toàn ngược lại với nó. Phương thức ma thuật
private $name;38 được gọi khi bạn cố đọc dữ liệu từ các thuộc tính đối tượng không thể truy cập hoặc không tồn tại. Mục đích của phương pháp này là cung cấp các giá trị cho các thuộc tính đó
Hãy xem nó hoạt động như thế nào
private $name;7
private $name;8
private $name;9
private $name;0
private $name;1
private $name;65
private $name;3
private $name;5
private $name;68
private $name;6
private $name;82
private $name;81
private $name;802
private $name;83
private $name;90
private $name;85
private $name;87
private $name;834
private $name;89
private $name;82
private $name;91
private $name;838
private $name;93
private $name;840
private $name;94
private $name;842
private $name;96
private $name;90
private $name;98
private $name;92
private $name;99
private $name;01
private $name;809
private $name;03
private $name;40
private $name;812
private $name;42
private $name;854
private $name;44
private $name;45
private $name;857
private $name;47
private $name;859
private $name;49
private $name;861
private $name;50
private $name;04
Phương pháp private $name;
42 và private $name;
43
Nếu các phương thức
private $name;38 và
private $name;33 được gọi khi bạn đang xử lý các thuộc tính không tồn tại, thì phương thức
private $name;42 được gọi khi bạn đang cố gọi các phương thức không thể truy cập, các phương thức mà bạn chưa định nghĩa trong lớp của mình
private $name;7__
private $name;8
private $name;9
private $name;0
private $name;1
private $name;869
private $name;3
private $name;82
private $name;5
private $name;873
private $name;6
private $name;875
private $name;81
private $name;90
private $name;83
private $name;92
private $name;85
private $name;87
private $name;809
private $name;89
private $name;884
private $name;91
private $name;04
Như bạn có thể thấy, chúng tôi đã gọi phương thức là
private $name;47, phương thức này không được định nghĩa và do đó, phương thức ma thuật
private $name;42 được gọi là. Đối số đầu tiên là tên của phương thức được gọi và đối số thứ hai là một mảng các đối số được truyền trong phương thức đó
Phương thức
private $name;43 rất giống với phương thức
private $name;42. Ngoại lệ duy nhất là nó được gọi khi bạn đang cố gọi các phương thức không thể truy cập trong ngữ cảnh tĩnh. Vì vậy, nếu bạn đang cố truy cập bất kỳ phương thức tĩnh nào chưa được xác định, thì hàm
private $name;43 sẽ được gọi
Sau khi đọc về các phương thức
private $name;38,
private $name;33 và
private $name;42, một số bạn đang nghĩ đến việc sử dụng chúng để quản lý tất cả các thành viên và phương thức của lớp học. Chỉ cần cố gắng tránh đặt nhiều mã của bạn vào chúng. Việc có các định nghĩa phương thức rõ ràng để nhận và thiết lập các thành viên hoặc định nghĩa các phương thức lớp thường tốt hơn cho khả năng đọc và bảo trì.
Phương pháp private $name;
55 và private $name;
56
Phương thức ma thuật
private $name;55 được gọi khi bạn gọi phương thức
private $name;58 trên các thuộc tính đối tượng không thể truy cập hoặc không tồn tại. Hãy xem cách nó hoạt động thông qua một ví dụ
private $name;7__
private $name;8
private $name;9
private $name;0
private $name;1
private $name;65
private $name;3
private $name;5
private $name;895
private $name;6
private $name;82
private $name;81
private $name;899
private $name;83
private $name;90
private $name;85
private $name;92
private $name;87
private $name;89
private $name;809
private $name;91
private $name;908
private $name;93
private $name;04
Trong ví dụ trên, thuộc tính phone không được định nghĩa trong lớp và do đó, nó sẽ gọi phương thức
private $name;55
Mặt khác,
private $name;56 là một phương thức được gọi khi bạn gọi phương thức
private $name;61 trên các thuộc tính đối tượng không thể truy cập hoặc không tồn tại
Phương pháp private $name;
62
Phương thức ma thuật
private $name;62 cho phép bạn xác định những gì bạn muốn hiển thị khi một đối tượng của lớp được xử lý như một chuỗi. Nếu bạn sử dụng
private $name;64 hoặc
private $name;65 trên đối tượng của mình và bạn chưa xác định phương thức
private $name;62, nó sẽ báo lỗi
Hãy cố gắng hiểu nó với ví dụ sau
private $name;7
private $name;8
private $name;9
private $name;0
private $name;1
private $name;
private $name;3
private $name;4
private $name;5
private $name;6
private $name;80
private $name;81
private $name;82
private $name;83
private $name;86
private $name;85
private $name;88
private $name;87
private $name;90
private $name;89
private $name;91
private $name;932
private $name;93
private $name;82
private $name;94
private $name;936
private $name;96
private $name;938
private $name;98
private $name;940
private $name;99
private $name;90
private $name;01
private $name;92
private $name;03
private $name;40
private $name;947
private $name;42
private $name;949
private $name;44
private $name;04
Trong ví dụ trên, khi bạn lặp lại đối tượng
private $name;67, nó sẽ gọi phương thức
private $name;62. Trong phương pháp đó, bạn có thể quyết định những gì bạn muốn hiển thị. Nếu bạn chưa định nghĩa phương thức
private $name;62, điều này sẽ dẫn đến lỗi
Phương pháp private $name;
70 và private $name;
71
Phương pháp ma thuật
private $name;70 khác so với các phương pháp mà chúng ta đã thảo luận cho đến nay. Nó được gọi khi bạn gọi hàm
private $name;73 trên đối tượng. Trong trường hợp đối tượng rất lớn, bạn chỉ muốn lưu các thuộc tính đã chọn trong quá trình tuần tự hóa và dọn dẹp đối tượng. Phương thức
private $name;70 phải trả về một mảng có tên của tất cả các thuộc tính của đối tượng sẽ được tuần tự hóa
Một lần nữa, hãy sửa lại ví dụ của chúng tôi để xem nó hoạt động như thế nào
private $name;7
private $name;8
private $name;9
private $name;0
private $name;1
private $name;
private $name;3
private $name;4
private $name;5
private $name;961
private $name;6
private $name;963
private $name;81
private $name;83
private $name;966
private $name;85
private $name;82
private $name;87
private $name;86
private $name;89
private $name;88
private $name;91
private $name;974
private $name;93
private $name;90
private $name;94
private $name;96
private $name;979
private $name;98
private $name;82
private $name;99
private $name;983
private $name;01
private $name;90
private $name;03
private $name;40
private $name;988
private $name;42
private $name;82
private $name;44
private $name;992
private $name;45
private $name;90
private $name;47
private $name;92
private $name;49
private $name;04
Trong ví dụ trên, khi bạn
private $name;73 đối tượng
private $name;76, nó sẽ gọi phương thức
private $name;70 và nó sẽ chỉ bảo toàn các giá trị của các biến
private $name;78,
private $name;79 và
private $name;35
Mặt khác, việc sử dụng phương thức ma thuật
private $name;71 là để thiết lập lại bất kỳ kết nối nào và khởi động các tác vụ khi hàm
private $name;82 được gọi trên đối tượng
Phương pháp private $name;
83 và private $name;
84
Hai phương thức ma thuật mới có tên là
private $name;83 và
private $name;84 đã được giới thiệu trong PHP 7. 4. Về nhiều mặt, chúng tương tự như phương pháp
private $name;70 và
private $name;71, nhưng chúng giúp chúng ta khắc phục một số hạn chế của cả hai phương pháp này. Chẳng hạn, việc tạo một biểu diễn được tuần tự hóa của một đối tượng khác với dạng trong bộ nhớ của đối tượng sẽ khó khăn với
private $name;70 và yêu cầu sử dụng các thuộc tính giả
private $name;7
private $name;8
private $name;9
private $name;0
private $name;1
private $name;
private $name;3
private $name;4
private $name;5
private $name;961
private $name;6
private $name;963
private $name;81
private $name;83
private $name;966
private $name;85
private $name;82
private $name;87
private $name;86
private $name;89
private $name;88
private $name;91
private $name;974
private $name;93
private $name;90
private $name;94
private $name;96
private $name;026
private $name;98
private $name;82
private $name;99
private $name;030
private $name;01
private $name;90
private $name;03
private $name;40
private $name;035
private $name;42
private $name;82
private $name;44
private $name;039
private $name;45
private $name;041
private $name;47
private $name;043
private $name;49
private $name;045
private $name;50
private $name;992
private $name;52
private $name;90
private $name;54
private $name;92
private $name;56
private $name;04
Cũng cần lưu ý rằng chỉ có _____
private $name;83 được gọi khi bạn đã xác định cả _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _. Tương tự, chỉ
private $name;84 được gọi khi bạn đã xác định cả
private $name;84 và
private $name;71 cho một đối tượng
Phương pháp private $name;
96
Phương thức ma thuật
private $name;96 là một phương thức đặc biệt được gọi khi bạn cố gắng gọi một đối tượng như thể nó là một hàm. Đầu tiên, hãy xem nó hoạt động như thế nào, sau đó chúng ta sẽ xem mục đích của phương pháp kỳ diệu này
private $name;7
private $name;8
private $name;9
private $name;0
private $name;1
private $name;
private $name;3
private $name;4
private $name;5
private $name;6
private $name;80
private $name;81
private $name;82
private $name;83
private $name;86
private $name;85
private $name;88
private $name;87
private $name;90
private $name;89
private $name;91
private $name;075
private $name;93
private $name;82
private $name;94
private $name;079
private $name;96
private $name;90
private $name;98
private $name;92
private $name;99
private $name;01
private $name;947
private $name;03
private $name;088
private $name;40
private $name;04
Như bạn có thể thấy, đối tượng
private $name;67 được xử lý như thể nó là một hàm và như chúng ta đã định nghĩa phương thức
private $name;96, nó sẽ được gọi thay vì báo lỗi cho bạn. Mục đích chính của phương thức
private $name;96 là nếu bạn muốn coi các đối tượng của mình là có thể gọi được, bạn có thể triển khai phương thức này
Phương pháp private $name;
301
Nếu bạn muốn sao chép một đối tượng hiện có, bạn có thể sử dụng từ khóa
private $name;302 để làm điều đó. Nhưng sau khi sao chép, nếu bạn muốn sửa đổi các thuộc tính của đối tượng được sao chép, bạn có thể định nghĩa phương thức ma thuật
private $name;301 trong lớp của mình
private $name;7
private $name;8
private $name;9
private $name;094
private $name;1
private $name;92
private $name;3
private $name;5
private $name;0
private $name;6
private $name;
private $name;81
private $name;4
private $name;83
private $name;105
private $name;85
private $name;87
private $name;108
private $name;89
private $name;82
private $name;91
private $name;112
private $name;93
private $name;90
private $name;94
private $name;96
private $name;117
private $name;98
private $name;82
private $name;99
private $name;121
private $name;01
private $name;90
private $name;03
private $name;92
private $name;40
private $name;42
private $name;128
private $name;44
private $name;130
private $name;45
private $name;04
Vấn đề với cách tiếp cận trên là nó tạo một bản sao nông của đối tượng trong khi sao chép và do đó các đối tượng bên trong của đối tượng được sao chép sẽ không được sao chép
Trong ngữ cảnh của ví dụ trên, nếu bạn chưa xác định phương thức
private $name;301, đối tượng nhân bản,
private $name;305, vẫn sẽ trỏ đến cùng một đối tượng
private $name;306 được tham chiếu bởi đối tượng
private $name;307. Do đó, bằng cách triển khai phương thức
private $name;301, chúng tôi đảm bảo rằng đối tượng
private $name;306 được sao chép cùng với đối tượng chính
Phương pháp private $name;
310
Phương thức ma thuật
private $name;310 được gọi khi bạn cố kết xuất một đối tượng bằng cách sử dụng hàm
private $name;312. Nếu bạn chưa định nghĩa phương thức này trong lớp của mình, nó sẽ kết xuất tất cả các thuộc tính công khai, riêng tư và được bảo vệ. Vì vậy, nếu bạn muốn hạn chế thông tin được hiển thị trong khi kết xuất, bạn có thể sử dụng phương pháp này
private $name;7__
private $name;8_______19
private $name;0
private $name;1
private $name;138
private $name;3
private $name;4
private $name;5
private $name;142
private $name;6
private $name;81
private $name;145
private $name;83
private $name;82
private $name;85
private $name;149
private $name;87
private $name;90
private $name;89
private $name;92
private $name;91
private $name;93
private $name;809_______1949
private $name;94
private $name;215___1
Phương thức này sẽ trả về một mảng các cặp khóa-giá trị sẽ được hiển thị khi hàm
private $name;312 được gọi trên đối tượng. Như bạn có thể thấy, bạn hoàn toàn có thể kiểm soát những gì bạn muốn hiển thị khi đổ đối tượng bằng hàm
private $name;312
Phương pháp private $name;
315
Phương thức
private $name;315 là một phương thức tĩnh được sử dụng cùng với hàm
private $name;317. Hàm
private $name;317 xuất thông tin có cấu trúc về một biến. Khi bạn sử dụng chức năng này để xuất các lớp, bạn cần xác định phương thức
private $name;315 trong lớp của mình
private $name;7
private $name;8
private $name;9
private $name;0
private $name;1
private $name;138
private $name;3
private $name;170
private $name;5
private $name;6
private $name;80
private $name;81
private $name;82
private $name;83
private $name;86
private $name;85
private $name;88
private $name;87
private $name;90
private $name;89
private $name;91
private $name;184
private $name;93
private $name;82
private $name;94
private $name;188
private $name;96
private $name;190
private $name;98
private $name;192
private $name;99
private $name;01
private $name;195
private $name;03
private $name;90
private $name;40
private $name;92
private $name;42
private $name;44
private $name;02
private $name;45
private $name;04
private $name;47
private $name;06
private $name;49
private $name;04
Như bạn có thể thấy, chuỗi đã xuất là mã PHP hợp lệ và bạn có thể sử dụng nó để khôi phục đối tượng ban đầu
Phần kết luận
Trong bài viết này, chúng ta đã đi qua tất cả các phương thức kỳ diệu có sẵn trong PHP. Đối với mọi phương pháp, tôi đã cung cấp một ví dụ ngắn nhưng có ý nghĩa để giúp bạn hiểu mục đích của nó. Và tôi hy vọng bạn có thể sử dụng bài viết này như một tài liệu tham khảo nhanh hoặc một bảng hướng dẫn trong quá trình phát triển PHP hàng ngày của bạn
Bài đăng này đã được cập nhật với sự đóng góp từ Monty Shokeen. Monty là một nhà phát triển full-stack, người cũng thích viết hướng dẫn và tìm hiểu về các thư viện JavaScript mới