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ànBạ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 ĐọcBàn luậnCả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ậnclass 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()}";
}
}
1Quá 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()}";
}
}
9ArgumentCountError 0ArgumentCountError 1ArgumentCountError 2ArgumentCountError 3
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()}";
}
}
7 ArgumentCountError 5ArgumentCountError 6ArgumentCountError 0ArgumentCountError 8ArgumentCountError 9 ArgumentCountError 3RequiredParam 1ArgumentCountError 3
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()}";
}
}
9RequiredParam 4RequiredParam 5RequiredParam 6 RequiredParam 7
RequiredParam 8RequiredParam 9 RequiredParameter 0
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()}";
}
}
9RequiredParameter 2RequiredParam 5RequiredParam 6 RequiredParameter 5
RequiredParam 8RequiredParam 9
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()}";
}
}
9RequiredParameter 9class 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()}";
}
}
9final 1ArgumentCountError 8final 3
ArgumentCountError 1final 3
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()}";
}
}
4final 3final 3
final 9 null 0null 1 null 2
null 3ArgumentCountError 3final 9null 6
null 3 null 8null 9
null 3 ArgumentCountError 3final 9RequiredParameter 3
RequiredParameter 4
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: PHPclass 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()}";
}
}
1class 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 RequiredParameter 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()}";
}
}
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 null 0ArgumentCountError 1null 3 null 3null 9
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()}";
}
}
4final 3final 3
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 null 9class 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 RequiredParameter 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()}";
}
}
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 null 0ArgumentCountError 1null 3 null 3null 9
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()}";
}
}
4final 3final 3
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 null 9class 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 RequiredParameter 7ArgumentCountError 1null 3
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";
}
}
07null 9class 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";
}
}
21class 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";
}
}
21RequiredParameter 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";
}
}
12 null 0null 1 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
Bạn có thể ghi đè các phương thức trong PHP không?
Bạn có thể ghi đè bất kỳ phương thức nào của lớp cha bằng cách tạo mã cần thiết từ mẫu được xác định trước..
PHP có hỗ trợ ghi đè chức năng cha mẹ không?
Ghi đè chỉ phù hợp với các lớp dẫn xuất, trong đó lớp cha đã xác định một phương thức và lớp dẫn xuất muốn ghi đè phương thức đó.Trong PHP, bạn chỉ có thể quá tải các phương thức bằng phương pháp ma thuật __call.you can only overload methods using the magic method __call .
Chúng ta có thể có hai chức năng có cùng tên trong PHP tại sao hoặc tại sao không?
Câu trả lời ngắn gọn: Không. Chỉ có thể là một hàm có tên nhất định.No. There can only be one function with a given name.
Chúng ta có thể ghi đè hàm tạo trong PHP không?
Trong PHP, quy tắc duy nhất để ghi đè các nhà xây dựng là không có quy tắc nào!Các hàm tạo có thể được ghi đè với bất kỳ chữ ký nào.Các thông số của chúng có thể được thay đổi tự do và không có hậu quả.Constructors can be overridden with any signature. Their parameters can be changed freely and without consequence. |