Từ khóa final, static, overloading và magic method trong PHP
- 18-03-2023
- Toanngo92
- 0 Comments
Mục lục
Từ khóa final
Từ khóa final giúp khai báo một phương thức là cuối cùng. Nó ngăn không cho một lớp bị kế thừa hoặc ghi đè. Từ khóa này khi được sử dụng với một phương thức sẽ ngăn lớp con ghi đè phương thức đó.
Ví dụ:
<?php
class Bill{
public function check(){
echo "check called";
}
final public function applytax(){
echo "apply tax called";
}
}
class RentBill extends Bill{
public function check(){
echo "Rentbill check called";
}
// public function applytax(){
// echo "Rentbill apply tax called";
// }
}
$rentbill = new RentBill();
$rentbill->check();
$rentbill->applytax();
Từ khóa static
Trong PHP, các thành viên tĩnh được tạo bằng từ khóa static. Các thành viên tĩnh bao gồm các phương thức có thể được truy cập mà không cần khởi tạo lớp. Tất cả các thành viên tĩnh như vậy được liên kết với lớp chứ không phải các đối tượng riêng lẻ.
Tuy nhiên, không thể truy cập một thành viên tĩnh bằng cách sử dụng một đối tượng class được khởi tạo. Toán tử phân giải phạm vi (scope resolution operator) (::) được sử dụng để truy cập các thuộc tính tĩnh. Tuy nhiên, điều tương tự không thể thực hiện được khi sử dụng toán tử đối tượng (->).
Một lớp có thể được tham chiếu bằng cách sử dụng một biến. Tuy nhiên, giá trị của biến không được là một từ khóa như self, parent, static, v.v.
Cú pháp:
<?php
class ClassName{
public static function StaticMethodName(){
// todo
}
}
Để truy cập một phương thức tĩnh, hãy sử dụng tên lớp, dấu hai chấm (::) và tên phương thức.
Cú pháp:
ClassName::staticMethod();
Ví dụ:
class TestStatic{
public static $name = "toanngo92";
public static function getName(){
return self::$name;
}
}
echo TestStatic::getName();
$test = new TestStatic();
echo $test->getName();
Nạp chồng phương thức và thuộc tính (Method and Property Overloading)
Quá trình nạp chồng các thuộc tính và phương thức với các chức năng khác nhau được gọi là nạp chồng phương thức/thuộc tính tương ứng.
Nạp chồng phương thức (Method Overloading)
Trong PHP, nạp chồng phương thức cho phép bạn tạo nhiều phương thức có cùng tên nhưng khác chức năng. Sử dụng nạp chồng phương thức, người dùng có thể tạo các phương thức động, không được khai báo bên trong phạm vi của lớp. Nạp chồng phương thức có nghĩa là tạo các phương thức động. Các phương thức nạp chồng được định nghĩa là công khai. Các thực thể (phương thức và thuộc tính) có thể được truy cập, sau khi đối tượng cho một lớp được tạo.
Ví dụ:
<?php
class Model {
public function __call($name, $arguments) {
echo "This is an object method '$name' " . implode(", ", $arguments) . "<br>";
}
public static function __callStatic($name, $arguments) {
echo "This is a static method '$name' " . implode(", ", $arguments) . "<br>";
}
}
// Create new object:
$obj = new Model;
$obj->runModel("Object context");
Model::runModel("Static context");
Trong ví dụ trên, lớp Model được định nghĩa trong đó các magic method đã được tạo. Các hàm này là __call() và __callStatic(). __call() được kích hoạt khi gọi các phương thức nạp chồng trong ngữ cảnh đối tượng. __callStatic() được kích hoạt trong khi gọi các phương thức nạp chồng static. Người ta có thể truy cập các hàm thông qua đối tượng mới, sử dụng các đối số tương ứng để gọi trong ngữ cảnh object và ngữ cảnh static.
Nạp chồng thuộc tính (Property Overloading)
Nạp chồng thuộc tính trong PHP cho phép tạo các thuộc tính động dựa trên ngữ cảnh. Nó không yêu cầu một dòng mã riêng để tạo thuộc tính. Một thuộc tính quá tải thường không được liên kết với instance của class cũng như không được khai báo trong phạm vi của class.
Một số hàm được sử dụng trong nạp chồng thuộc tính:
- __set(): Khởi tạo các thuộc tính nạp chồng
- __get(): Để đọc dữ liệu từ các thuộc tính không thể truy cập
- __isset(): Để kiểm tra các thuộc tính nạp chồng
- __unset(): Được gọi khi sử dụng cho các thuộc tính nạp chồng
Ví dụ:
<?php
class Model{
private $data = array();
public $declared = 1;
// overloading used when accessed outside the class
private $hidden = 2;
public function __set($name, $value){
echo "Set members '$name' to '$value'<br/>";
$this->data[$name] = $value;
}
//function definition
public function __get($name){
echo "Get members '$name'<br/>";
if(array_key_exists($name, $this->data)){
return $this->data[$name];
}
return NULL;
}
//function definition
public function __isset($name)
{
echo "Isset members '$name'<br/>";
return isset($this->data[$name]);
}
public function __unset($name)
{
echo "Unset members '$name'<br/>";
unset($this->data[$name]);
}
// getHidden function
public function getHidden()
{
return $this->hidden;
}
}
$obj = new Model;
$obj->name = "John";
echo $obj->name;
echo "<br/>";
// use isset function to chec name is set or not var_dump(isset($obj->name));
//uset name
unset($obj->name);
var_dump(isset($obj->name));
echo "<br/>";
// public member
echo $obj->declared;
echo "<br/>";
// private properties are not allowed to access inside the class
echo $obj->getHidden();
echo "<br/>";
echo $obj->hidden;
Trong ví dụ trên, lớp Model được tạo trong đó một mảng đã được tạo để định vị dữ liệu nạp chồng. Một biến được khai báo đã được tạo, cùng với một biến private $hidden. Các hàm __set, __get(), __isset(), __unset() và getHidden() được định nghĩa trong dass Model . Một đối tượng $obj được tạo, khởi tạo lớp Model. Chúng ta thấy, mỗi khi thao tác với thuộc tính của đối tượng, các hàm magic method trên được gọi với bối cảnh tương ứng.
Magic Methods
Trong PHP, phương thức nạp chồng cũng tạo ra các magic method (phương thức ma thuật). Các magic method được kích hoạt trong ngữ cảnh đối tượng và được sử dụng để tạo các thực thể động. Sau đây là một số magic method được sử dụng trong PHP:
- __set() được kích hoạt khi các thuộc tính nạp chồng được khởi tạo.
- __get() được kích hoạt khi các thuộc tính nạp chồng được sử dụng kết hợp với PHP câu lệnh in.
- __isset() là một magic method, được gọi khi các thuộc tính nạp chồng được kiểm tra bằng hàm isset()
- __unset() là một hàm được gọi khi sử dụng PHP unset() cho các thuộc tính nạp chồng