Các hàm PHP bắt đầu bằng dấu gạch dưới kép – một “__” – được gọi là các hàm ma thuật [và/hoặc phương thức] trong PHP. Chúng là các hàm luôn được định nghĩa bên trong các lớp và không phải là các hàm độc lập [bên ngoài các lớp]. Các hàm ma thuật có sẵn trong PHP là. __construct[], __destination[], __call[], __callStatic[], __get[], __set[], __isset[], __unset[], __sleep[], __wakeup[], __toString[], __invoke[], __set_state[
Tại sao chúng được gọi là hàm ma thuật?
Định nghĩa của một hàm ma thuật được cung cấp bởi lập trình viên – nghĩa là bạn, với tư cách là lập trình viên, sẽ thực sự viết định nghĩa. Điều quan trọng cần nhớ – PHP không cung cấp các định nghĩa về hàm ma thuật – lập trình viên thực sự phải viết mã xác định chức năng ma thuật sẽ làm gì. Tuy nhiên, các hàm ma thuật sẽ không bao giờ được gọi trực tiếp bởi lập trình viên – thực ra, PHP sẽ gọi hàm 'đằng sau hậu trường'. Đây là lý do tại sao chúng được gọi là các hàm 'ma thuật' - bởi vì chúng không bao giờ được gọi trực tiếp và chúng cho phép lập trình viên thực hiện một số điều khá mạnh mẽ. Bối rối?
Ví dụ về việc sử dụng hàm ma thuật __construct[] trong PHP
Hàm ma thuật được sử dụng phổ biến nhất là __construct[]. Điều này là do kể từ phiên bản PHP 5, phương thức __construct về cơ bản là hàm tạo cho lớp của bạn. Nếu PHP 5 không thể tìm thấy hàm __construct[] cho một lớp nhất định, thì nó sẽ tìm kiếm một hàm có cùng tên với tên lớp – đây là cách viết hàm tạo cũ trong PHP, nơi bạn chỉ định nghĩa một hàm
Bây giờ, đây là một ví dụ về một lớp với hàm ma thuật __construct[]
class Animal { public $height; // height of animal public $weight; // weight of animal public function __construct[$height, $weight] { $this->height = $height; //set the height instance variable $this->weight = $weight; //set the weight instance variable } }
Trong đoạn mã trên, chúng ta có một hàm __construct đơn giản được xác định chỉ đặt chiều cao và trọng lượng của một đối tượng động vật. Vì vậy, giả sử rằng chúng ta tạo một đối tượng của lớp Animal bằng mã này
Animal obj = new Animal[5, 150];
Điều gì xảy ra khi chúng ta chạy đoạn mã trên? . Và đối tượng obj sẽ là một đối tượng thuộc lớp Animal có chiều cao là 5 và trọng lượng là 150. Vì vậy, chức năng __construct được gọi đằng sau hậu trường. Kỳ diệu, phải không?
Nếu bạn đang tìm kiếm một ví dụ khác về hàm kỳ diệu, thì chỉ cần xem trang tiếp theo – nơi chúng tôi đưa ra ví dụ về hàm __autoload trong PHP và cách nó được sử dụng
PHP đã giới thiệu hàm __autoload[] trong phiên bản 5, được gọi bất cứ khi nào mã cố gắng sử dụng một lớp chưa được xác định. Bạn chỉ cần đặt một số mã vào __autoload[] để bao gồm tệp lớp thích hợp và không phải bận tâm về việc bao gồm các tệp đó theo cách thủ công. Bài đăng này xem xét cách thực hiện điều này với các ví dụ
Cập nhật ngày 15 tháng 6 năm 2009. Hãy nhớ đọc bài đăng "Tự động tải với thư viện SPL của PHP" của tôi, bài đăng này đề cập đến cách cho phép nhiều chức năng tự động tải với PHP. Cập nhật kết thúc
Một ví dụ đơn giản về việc sử dụng hàm __autoload của PHP là như vậy
function __autoload[$classname] { include["classes/$classname.class.php"]; }
Nếu sau đó bạn chạy đoạn mã sau
$foo = new foo;
và lớp "foo" chưa được xác định, __autoload được gọi là chuyển "foo" làm tham số. Sau đó, hàm __autoload mẫu bao gồm tệp thích hợp như được định nghĩa trong ví dụ trên sẽ là "classes/foo. lớp. php", mặc dù bạn sẽ thay đổi điều này thành bất kỳ quy ước đặt tên và vị trí của tệp lớp nào
Lưu ý rằng không cần sử dụng include_once[] hoặc require_once[] để bao gồm các tệp – chỉ cần include[] hoặc require[] là được. Điều này là do __autoload sẽ không cần gọi lại nếu bạn tạo một phiên bản khác của lớp vì lớp đã được xác định. Sau đây minh họa điều này
echo "new foo
"; $foo = new foo; echo "new foo
"; $foo = new foo; echo "new bar
"; $bar = new bar; function __autoload[$classname] { echo "autoload $classname
"; include["classes/$classname.class.php"]; }
Đầu ra từ trên sẽ là
new foo autoload foo new foo new bar autoload bar
Điều này cho thấy rằng __autoload[] chỉ được gọi mỗi khi một lớp chưa được xác định được sử dụng. Bởi vì lớp "foo" đã được định nghĩa lần thứ hai khi chúng ta tạo một đối tượng foo nên lớp đã được định nghĩa và không cần tải lại
Sử dụng chức năng tự động tải trong PHP thực sự hữu ích vì bạn không cần bận tâm bao gồm tất cả các tệp lớp cần thiết khi bắt đầu mỗi tập lệnh. chúng sẽ được tải tự động khi và khi được yêu cầu