Hướng dẫn can we have two constructors in a class php? - chúng ta có thể có hai hàm tạo trong một lớp php không?

Tôi đã tạo phương thức này để cho phép sử dụng nó không chỉ trên các hàm tạo mà trong các phương pháp:

Nhà xây dựng của tôi:

function __construct() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('__construct',func_get_args());
    }
}

Phương pháp dosomothing của tôi:

public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}

Cả hai đều hoạt động với phương pháp đơn giản này:

public function overloadMethod($methodName,$params){
    $paramsNumber=sizeof($params);
    //methodName1(), methodName2()...
    $methodNameNumber =$methodName.$paramsNumber;
    if (method_exists($this,$methodNameNumber)) {
        call_user_func_array(array($this,$methodNameNumber),$params);
    }
}

Vì vậy, bạn có thể khai báo

__construct1($arg1), __construct2($arg1,$arg2)...

hoặc

methodName1($arg1), methodName2($arg1,$arg2)...

và như thế :)

Và khi sử dụng:

$myObject =  new MyClass($arg1, $arg2,..., $argN);

nó sẽ gọi

public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
1, nơi bạn đã xác định
public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
2 args

Sau đó, $ myObject -> dosomothing ($ arg1, $ arg2, ..., $ argm)

Nó sẽ gọi

public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
3, nơi bạn đã xác định
public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
4 args;

Các hàm tạo là một phần thực sự quan trọng của lập trình hướng đối tượng dựa trên lớp. Thông qua các cấu trúc, một đối tượng mới được tạo tự động khởi tạo các thuộc tính trước khi nó có thể sử dụng được. Trong PHP, một hàm tạo là một phương thức có tên

public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
5, mà từ khóa
public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
6 tự động gọi sau khi tạo đối tượng. Các hàm tạo cũng có thể chấp nhận các đối số, trong trường hợp đó, khi câu lệnh
public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
6 được viết, bạn cũng cần gửi các đối số cấu trúc cho các tham số.

Bạn cũng có thể thích: Phương pháp quá tải trong PHP

Ở đây, một ví dụ về cách xác định một hàm tạo trong PHP.



class Person
{
    private string $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public function getName() : string
    {
        return $this->name;
    }
}

Bây giờ, bất cứ khi nào một đối tượng của lớp

public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
8 được tạo như vậy.

$person = new Person('Foo');

Trình xây dựng có thể được gọi và nó gán cho FOO FOO cho

public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
9, sau đó có thể được truy cập bằng cách gọi phương thức
public function overloadMethod($methodName,$params){
    $paramsNumber=sizeof($params);
    //methodName1(), methodName2()...
    $methodNameNumber =$methodName.$paramsNumber;
    if (method_exists($this,$methodNameNumber)) {
        call_user_func_array(array($this,$methodNameNumber),$params);
    }
}
0.

Bây giờ, điều gì sẽ xảy ra nếu bạn muốn giới thiệu một hàm tạo khác vào lớp này có các bộ đối số khác nhau. Chẳng hạn, bạn muốn intialize

public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
9 và
public function overloadMethod($methodName,$params){
    $paramsNumber=sizeof($params);
    //methodName1(), methodName2()...
    $methodNameNumber =$methodName.$paramsNumber;
    if (method_exists($this,$methodNameNumber)) {
        call_user_func_array(array($this,$methodNameNumber),$params);
    }
}
2 của người có trình xây dựng này, bạn sẽ làm điều đó như thế nào?

Chà, câu trả lời đơn giản là, bạn có thể. Ít nhất là nguyên bản. PHP thiếu hỗ trợ để khai báo nhiều hàm tạo của các số tham số khác nhau cho một lớp không giống như các ngôn ngữ như Java. Vì vậy, nếu chúng ta tuyên bố một hàm tạo khác trong ví dụ trên như vậy.



class Person
{
    private string $name;
    private string $age;

    public function __construct(string $name)
    {
        $this->name = $name;
    }
    
    public function __construct(string $name, string $age)
    {
        $this->name = $name;
        $this->age = $age;
    }

    public function getName() : string
    {
        return $this->name;
    }
}

$person1 = new Person('Amit');

$person2 = new Person('Amit', '12');

PHP sẽ ném một lỗi nghiêm trọng khi chạy mã trên.

Fatal error:  Cannot redeclare Person::__construct() in [...][...] on line 13

Có một cách giải quyết mặc dù thông qua đó người ta có thể tận dụng việc sử dụng nhiều hàm tạo trong một lớp.

Cách giải quyết

Ở đây, một đoạn trích nhỏ trình bày cách sử dụng nhiều hàm tạo trong PHP.

public function doSomething() {
    $paramsNumber=func_num_args();
    if($paramsNumber==0){
        //do something
    }else{
        $this->overload('doSomething',func_get_args());
    }
}
0

Như bạn có thể thấy, lớp có một hàm tạo tiêu chuẩn và phần còn lại của ba là phương pháp lớp bình thường. Nhưng phép thuật nằm trong chính nhà xây dựng.

Ở đây, trước tiên chúng ta cần đếm số lượng đối số được truyền cho hàm tạo bằng

public function overloadMethod($methodName,$params){
    $paramsNumber=sizeof($params);
    //methodName1(), methodName2()...
    $methodNameNumber =$methodName.$paramsNumber;
    if (method_exists($this,$methodNameNumber)) {
        call_user_func_array(array($this,$methodNameNumber),$params);
    }
}
3 và nhận tất cả các đối số được gán bằng
public function overloadMethod($methodName,$params){
    $paramsNumber=sizeof($params);
    //methodName1(), methodName2()...
    $methodNameNumber =$methodName.$paramsNumber;
    if (method_exists($this,$methodNameNumber)) {
        call_user_func_array(array($this,$methodNameNumber),$params);
    }
}
4. Sau đó, tất cả những gì còn lại để chúng tôi làm là gọi hàm phù hợp bằng cách sử dụng call_user_func_array () bằng cách chuyển các đối số gốc dưới dạng đối số thứ hai ____ 25. Và Voila! Bạn đã viết cho mình một triển khai nhiều hàm tạo chức năng trong PHP.

Tiếng kêu bíp! Tiếng kêu bíp! Tôi cũng đang chạy một kênh YouTube mà tôi hy vọng bạn sẽ yêu thích!

Một lớp có thể có hai hàm tạo trong PHP không?

Lưu ý: PHP thiếu hỗ trợ để khai báo nhiều hàm tạo của các số tham số khác nhau cho một lớp không giống như các ngôn ngữ như Java.Nhiều hàm tạo: Nhiều hơn một hàm tạo trong một lớp duy nhất để khởi tạo các trường hợp có sẵn.PHP lacks support for declaring multiple constructors of different numbers of parameters for a class unlike languages such as Java. Multiple Constructors: More than one constructor in a single class for initializing instances are available.

Một lớp có thể có 2 hàm tạo?

Một lớp có thể có nhiều hàm tạo gán các trường theo những cách khác nhau.Đôi khi, có lợi khi chỉ định mọi khía cạnh của dữ liệu của đối tượng bằng cách gán các tham số cho các trường, nhưng lần khác, nó có thể phù hợp để chỉ xác định một hoặc một số. that assign the fields in different ways. Sometimes it's beneficial to specify every aspect of an object's data by assigning parameters to the fields, but other times it might be appropriate to define only one or a few.

Các lớp PHP có cần xây dựng không?

Bạn không bắt buộc phải xác định một hàm tạo trong lớp của mình, nhưng nếu bạn muốn vượt qua bất kỳ tham số nào về xây dựng đối tượng thì bạn cần một., but if you wish to pass any parameters on object construction then you need one.

Bạn có thể quá tải hàm tạo trong PHP không?

Bạn không thể quá tải bất kỳ phương thức nào trong PHP.Nếu bạn muốn có thể khởi tạo một đối tượng PHP trong khi chuyển một số kết hợp các tham số khác nhau, hãy sử dụng mẫu nhà máy với một hàm tạo riêng.. If you want to be able to instantiate a PHP object while passing several different combinations of parameters, use the factory pattern with a private constructor.