Kể từ Php 8.1, có một bản hack thú vị để ghi đè phương thức của một lớp với số lượng thêm các đối số cần thiết. Bạn nên sử dụng tính năng mới trong khởi tạo. Nhưng bằng cách nào?required arguments. You should use the new new in initializers feature. But how?
Chúng tôi xác định một lớp có hàm tạo luôn ném ArgumentCountError và làm cho nó trở thành giá trị mặc định của mỗi tham số cần thiết (một phiên bản cải tiến của câu trả lời của @jose.serapicos). Đơn giản và mát mẻ!
Bây giờ chúng ta hãy xem nó trong hành động. Đầu tiên, chúng tôi xác định RequiredParam:
final class RequiredParameter extends \ArgumentCountError { public function __construct() { // Nested hack throw $this; } }Và sau đó:
class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } }Bằng cách này, không ai có thể bỏ qua các tham số bổ sung, vì RequiredParameter được khai báo là final. Nó hoạt động cho các giao diện là tốt.
Điều này tốt hay xấu như thế nào?
Một lợi thế là nó linh hoạt hơn một chút so với việc thiết lập các tham số mặc định là null, vì bạn có thể truyền cho hàm tạo của RequiredParameter danh sách các tham số tùy ý và có thể xây dựng thông báo lỗi tùy chỉnh.
Một lợi thế khác là nó được xử lý ít hơn bằng tay, và do đó an toàn hơn. Bạn có thể quên xử lý giá trị null, nhưng lớp RequiredParameter xử lý mọi việc cho bạn.
Một nhược điểm lớn của phương pháp này là nó phá vỡ các quy tắc. Đầu tiên và quan trọng nhất, bạn phải tự hỏi tại sao bạn cần điều này, bởi vì nó phá vỡ đa hình trong hầu hết các trường hợp. Sử dụng nó một cách thận trọng.
Tuy nhiên, có các trường hợp sử dụng hợp lệ cho việc này, như mở rộng phương thức của lớp cha với cùng tên (nếu bạn không thể sửa đổi cha mẹ, nếu không tôi khuyên bạn nên sử dụng các đặc điểm thay thế) và sử dụng lớp con làm độc lập (tức là không có sự trợ giúp của Loại của lớp cha).
Một nhược điểm khác là nó yêu cầu bạn sử dụng các loại công đoàn cho từng tham số. Mặc dù cách giải quyết sau đây là có thể, nhưng nó đòi hỏi bạn phải tạo ra nhiều lớp hơn, điều này có thể làm tổn thương khả năng hiểu mã của bạn, cũng như ít ảnh hưởng đến khả năng duy trì và hiệu suất (dựa trên các điều kiện của bạn). BTW, không có hack đến miễn phí.
Loại bỏ việc sử dụng loại công đoàn
Bạn có thể mở rộng từ hoặc thực hiện RequiredParameter Loại tương thích của tham số thực tế để có thể xóa nhu cầu về loại liên minh:
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } }Nó cũng có thể cho các chuỗi, nếu bạn thực hiện giao diện class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 2 (ví dụ: class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 3 thực hiện nó theo mặc định). Nó không hoạt động đối với một số loại nguyên thủy bao gồm class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 4, class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 5, class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 6, class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 7, class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 8, v.v.
Để làm cho cuộc sống của bạn dễ dàng hơn, bạn có thể muốn định nghĩa hàm tạo là một đặc điểm và sử dụng nó (tôi nhận thức được câu trả lời này, nhưng trên thực tế, đây là một trường hợp hữu ích hợp lệ cho một hàm tạo trong một đặc điểm, ít nhất là IMO).
Cải thiện bài viết
Lưu bài viết
Cải thiện bài viết
Lưu bài viết
Đọc
Function Overloading: Function overloading contains same function name and that function performs different task according to number of arguments. For example, find the area of certain shapes where radius are given then it should return area of circle if height and width are given then it should give area of rectangle and others. Like other OOP languages function overloading can not be done by
native approach. In PHP function overloading is done with the help of magic function __call(). This function takes function name and arguments.
Example:
Bàn luận
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 1
Quá tải chức năng và ghi đè là tính năng OOPS trong PHP. Trong quá tải chức năng, nhiều hơn một hàm có thể có cùng một chữ ký phương thức nhưng số lượng đối số khác nhau. Nhưng trong trường hợp ghi đè chức năng, nhiều hàm sẽ có cùng chữ ký phương thức và số lượng đối số. & NBSP; quá tải chức năng: quá tải chức năng chứa cùng tên hàm và hàm đó thực hiện tác vụ khác nhau theo số lượng đối số. Ví dụ: tìm diện tích của các hình dạng nhất định trong đó bán kính được đưa ra thì nó sẽ quay lại diện tích của vòng tròn nếu chiều cao và chiều rộng được đưa ra thì nó sẽ cho diện tích hình chữ nhật và các khu vực khác. Giống như các ngôn ngữ OOP khác không thể thực hiện được bằng cách tiếp cận bản địa. Trong quá tải chức năng PHP được thực hiện với sự trợ giúp của hàm ma thuật __call (). Hàm này lấy tên chức năng và đối số. & Nbsp; ví dụ: & nbsp; & nbsp;
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 4class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 5 class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 6class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 7class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 8class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 9ArgumentCountError0
ArgumentCountError1ArgumentCountError2ArgumentCountError3class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 7 ArgumentCountError5ArgumentCountError6ArgumentCountError0
ArgumentCountError8ArgumentCountError9 ArgumentCountError3RequiredParam1ArgumentCountError3class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 9RequiredParam4
RequiredParam5RequiredParam6 RequiredParam7
RequiredParam8RequiredParam9 RequiredParameter0class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 9RequiredParameter2
RequiredParam5RequiredParam6 RequiredParameter5
RequiredParam8RequiredParam9 class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 9RequiredParameter9class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 9final1
ArgumentCountError8final3
ArgumentCountError1final3
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 4final3
final3
final9 null0null1 null2
null3ArgumentCountError3final9null6
null3 null8null9
null3 ArgumentCountError3final9RequiredParameter3
RequiredParameter4
Chức năng Ghi đè: Chức năng Quan điểm giống như các ngôn ngữ lập trình OOP khác. Trong chức năng ghi đè, cả hai lớp cha và con nên có cùng tên hàm và số lượng đối số. Nó được sử dụng để thay thế phương pháp cha mẹ trong lớp con. Mục đích của việc ghi đè là thay đổi hành vi của phương pháp lớp cha. Hai phương thức có cùng tên và cùng một tham số được gọi là ghi đè. Ví dụ: & nbsp; & nbsp; Function overriding is same as other OOPs
programming languages. In function overriding, both parent and child classes should have same function name with and number of arguments. It is used to replace parent method in child class. The purpose of overriding is to change the behavior of parent class method. The two methods with the same name and same parameter is called overriding.
Example:
PHP
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 1
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 2 RequiredParameter7
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 4class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 5 null0
ArgumentCountError1null3 null3null9
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 4final3
final3
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 2 null9class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 00 RequiredParameter7
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 4class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 5 null0
ArgumentCountError1null3 null3null9
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 4final3
final3
class BaseRequiredParameter extends Base { public function __construct() { throw new \ArgumentCountError(); } } class Derived extends Base { public function something( string $baseParam, Base $extraParam = new BaseRequiredParameter() ): string { return "$baseParam + {$extraParam->something()}"; } } 2 null9class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 00 RequiredParameter7
ArgumentCountError1null3 class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 07null9
class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 12class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 21
class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 16class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 21
RequiredParameter4
class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 12 null0null1 class Base { public function something(string $baseParam): string { return $baseParam; } } class Derived extends Base { public function something( string $baseParam, string|RequiredParameter $extraParam = new RequiredParameter(), ): string { return "$baseParam + $extraParam"; } } 15