Hướng dẫn can you overload constructor in php? - bạn có thể nạp chồng hàm tạo trong php không?

118

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Tôi đã từ bỏ tất cả hy vọng có thể làm quá tải các nhà xây dựng của mình trong PHP, vì vậy điều tôi thực sự muốn biết là tại sao.

Thậm chí có một lý do cho nó? Nó có tạo ra mã xấu vốn có không? Có phải thiết kế ngôn ngữ được chấp nhận rộng rãi để không cho phép nó, hoặc các ngôn ngữ khác đẹp hơn PHP?

Đã hỏi ngày 30 tháng 1 năm 2010 lúc 21:12Jan 30, 2010 at 21:12

Hướng dẫn can you overload constructor in php? - bạn có thể nạp chồng hàm tạo trong php không?

2

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.

Ví dụ:

public MyClass {
    private function __construct() {
    ...
    }

    public static function makeNewWithParameterA($paramA) {
        $obj = new MyClass(); 
        // other initialization
        return $obj;
    }

    public static function makeNewWithParametersBandC($paramB, $paramC) {
        $obj = new MyClass(); 
        // other initialization
        return $obj;
    }
}

$myObject = MyClass::makeNewWithParameterA("foo");
$anotherObject = MyClass::makeNewWithParametersBandC("bar", 3);

Đã trả lời ngày 1 tháng 2 năm 2010 lúc 7:15Feb 1, 2010 at 7:15

Alex Weinsteinalex WeinsteinAlex Weinstein

9.7558 Huy hiệu vàng43 Huy hiệu bạc59 Huy hiệu Đồng8 gold badges43 silver badges59 bronze badges

5

Bạn có thể sử dụng các đối số biến để tạo ra hiệu ứng tương tự. Nếu không có gõ mạnh, việc thêm nhiều, đưa ra các đối số mặc định và tất cả các "công việc khác xung quanh".

Đã trả lời ngày 30 tháng 1 năm 2010 lúc 21:27Jan 30, 2010 at 21:27

pestilence669pestilence669pestilence669

5.6181 Huy hiệu vàng22 Huy hiệu bạc34 Huy hiệu đồng1 gold badge22 silver badges34 bronze badges

1

Để hoàn thiện, tôi sẽ đề xuất giao diện thông thạo. Ý tưởng là bằng cách thêm

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
8 vào cuối các phương thức của bạn, bạn có thể chuỗi các cuộc gọi cùng nhau. Vì vậy, thay vì

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');

(đơn giản là không hoạt động), bạn có thể làm:

$car = (new Car)
       ->setColor('blue')
       ->setMake('Ford')
       ->setDrive('FWD');

Bằng cách đó, bạn có thể chọn chính xác tài sản bạn muốn đặt. Theo nhiều cách, nó tương tự như chuyển trong một loạt các tùy chọn cho cuộc gọi ban đầu của bạn:

$car = new Car(['make' => 'Ford', 'seats' => 5]);

Đã trả lời ngày 28 tháng 6 năm 2016 lúc 13:46Jun 28, 2016 at 13:46

Hướng dẫn can you overload constructor in php? - bạn có thể nạp chồng hàm tạo trong php không?

CodemonKeyCodemonkeyCodemonkey

4.2694 Huy hiệu vàng39 Huy hiệu bạc73 Huy hiệu đồng4 gold badges39 silver badges73 bronze badges

5

Quá tải thực sự thực sự không được hỗ trợ trong PHP. Như @pestilence đã đề cập, bạn có thể sử dụng các đối số biến. Một số người chỉ sử dụng một mảng kết hợp của các tùy chọn khác nhau để khắc phục điều này.

Đã trả lời ngày 30 tháng 1 năm 2010 lúc 21:30Jan 30, 2010 at 21:30

Dominic Barnesdominic BarnesDominic Barnes

Phim thương hiệu vàng 27,7K88 gold badges64 silver badges89 bronze badges

Hướng dẫn sử dụng PHP: Đối số chức năng, giá trị mặc định

Tôi đã khắc phục điều này chỉ bằng cách sử dụng các giá trị mặc định cho các tham số chức năng. Trong

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
9, đầu tiên liệt kê các tham số cần thiết. Liệt kê các tham số tùy chọn sau đó ở dạng chung
$car = (new Car)
       ->setColor('blue')
       ->setMake('Ford')
       ->setDrive('FWD');
0.

class User
{
    private $db;
    private $userInput;

    public function __construct(Database $db, array $userInput = null)
    {
        $this->db = $db;
        $this->userInput = $userInput;
    }
}

Điều này có thể được khởi tạo như:

$user = new User($db)

hoặc

$user = new User($db, $inputArray);

Đây không phải là một giải pháp hoàn hảo, nhưng tôi đã thực hiện công việc này bằng cách tách các tham số thành các tham số hoàn toàn bắt buộc cho dù khi đối tượng được xây dựng, và, như một nhóm, các tham số tùy chọn được liệt kê theo thứ tự quan trọng.absolutely mandatory parameters no matter when the object is constructed, and, as a group, optional parameters listed in order of importance.

Nó hoạt động.

Đã trả lời ngày 13 tháng 2 năm 2017 lúc 19:00Feb 13, 2017 at 19:00

Hướng dẫn can you overload constructor in php? - bạn có thể nạp chồng hàm tạo trong php không?

Anthony Rutledgeanthony RutledgeAnthony Rutledge

6.2821 Huy hiệu vàng36 Huy hiệu bạc43 Huy hiệu đồng1 gold badge36 silver badges43 bronze badges

Họ nói công việc này:

<?php
class A
{
    function __construct()
    {
        $a = func_get_args();
        $i = func_num_args();
        if (method_exists($this,$f='__construct'.$i)) {
            call_user_func_array(array($this,$f),$a);
        }
    }

    function __construct1($a1)
    {
        echo('__construct with 1 param called: '.$a1.PHP_EOL);
    }

    function __construct2($a1,$a2)
    {
        echo('__construct with 2 params called: '.$a1.','.$a2.PHP_EOL);
    }

    function __construct3($a1,$a2,$a3)
    {
        echo('__construct with 3 params called: '.$a1.','.$a2.','.$a3.PHP_EOL);
    }
}
$o = new A('sheep');
$o = new A('sheep','cat');
$o = new A('sheep','cat','dog');

// results:
// __construct with 1 param called: sheep
// __construct with 2 params called: sheep,cat
// __construct with 3 params called: sheep,cat,dog
?>

Và, có vẻ như mọi người đều hài lòng với nó, nhưng đối với tôi nó không hoạt động ... nếu bạn làm cho nó hoạt động, đó là một loại quá tải ...

Nó lấy tất cả các đối thủ và chuyển chúng cho hàm tạo hàm thứ cấp ...

Đã trả lời ngày 26 tháng 12 năm 2012 lúc 12:38Dec 26, 2012 at 12:38

Hướng dẫn can you overload constructor in php? - bạn có thể nạp chồng hàm tạo trong php không?

Hassan Faghihihassan FaghihiHassan Faghihi

1.7561 Huy hiệu vàng 38 Huy hiệu bạc51 Huy hiệu Đồng1 gold badge38 silver badges51 bronze badges

3

<?php
//php do not automatically call parent class constructor at all if child class has constructor so you have to call parent class constructor explicitly, however parent class constructor is called automatically if child class has no constructor
class MyClass 
{
    function construct1($value1)
    {
        echo "<br/> dummy constructor is called with 1 arguments and it is $value1";
    }
    function construct2($value1,$value2)
    {
        echo "<br/> dummy constructor is called with 2 arguments and it is $value1, $value2";
    }
    function construct3($value1,$value2,$value3)
    {
        echo "<br/> dummy constructor is called with 3 arguments and it is $value1, $value2 , $value3";
    } 
    public function __construct()
    {
        $NoOfArguments = func_num_args(); //return no of arguments passed in function
        $arguments = func_get_args();
        echo "<br/> child constructor is called $NoOfArguments";
        switch ($NoOfArguments) {
            case 1:
                 self::construct1($arguments[0]);
                break;
            case 2:
                self::construct2($arguments[0],$arguments[1]);
                break;

            case 3:
                self::construct3($arguments[0],$arguments[1],$arguments[2]);
                break;

            default:
                echo "Invalid No of arguments passed";
                break;
        }
    }


}
$c = new MyClass();
$c2 = new MyClass("ankit");
$c2 = new MyClass("ankit","Jiya");
$c2 = new MyClass("ankit","Jiya","Kasish");

?>

Đã trả lời ngày 19 tháng 10 năm 2017 lúc 11:14Oct 19, 2017 at 11:14

Bạn có thể sử dụng các câu lệnh có điều kiện trong hàm tạo của mình và sau đó thực hiện nhiệm vụ của bạn. Ví dụ.

  class Example
  {
      function __construct($no_of_args)

      {// lets assume 2
          switch($no_of_args)
          {
              case 1:
                // write your code
              break;
              case 2:
                //write your 2nd set of code
              break;
              default:
           //write your default statement
         }
      }
   }

    $object1 = new Example(1);  // this will run your 1st case
    $object2 = new Example(2);  // this will run your 2nd case

và như thế...

Jonsca

10.1k26 Huy hiệu vàng54 Huy hiệu bạc61 Huy hiệu Đồng26 gold badges54 silver badges61 bronze badges

Đã trả lời ngày 2 tháng 12 năm 2012 lúc 8:22Dec 2, 2012 at 8:22

DrGeneraldrgeneralDrGeneral

1.47914 Huy hiệu bạc21 Huy hiệu đồng14 silver badges21 bronze badges

Tất nhiên bạn có thể quá tải bất kỳ chức năng nào trong PHP bằng các phương thức ma thuật __call () và __callstatic (). Đó là một chút khó khăn, nhưng việc thực hiện có thể làm chính xác những gì bạn đang tìm kiếm. Dưới đây là tài nguyên trên trang web chính thức của PHP.NET:

https://www.php.net/manual/en/language.oop5.overloading.php#object.call

Và đây là ví dụ hoạt động cho cả phương pháp tĩnh và không tĩnh:

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
0

Và bạn có thể áp dụng điều này cho các hàm tạo bằng cách sử dụng mã sau trong __construct ():

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
1

Khá dễ dàng. Và bạn có thể muốn triển khai __clone () để tạo một bản sao của lớp với phương thức mà bạn gọi mà không có chức năng mà bạn gọi trong mọi trường hợp ...

Thêm câu trả lời này cho tính đầy đủ đối với PHP hiện tại, vì các phiên bản PHP sau này, thực tế bạn có thể làm quá tải các hàm tạo theo một cách nào đó. Mã sau sẽ giúp hiểu,

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
2

Đầu ra:

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
3

Đã trả lời ngày 9 tháng 9 năm 2020 lúc 17:10Sep 9, 2020 at 17:10

parth_07parth_07parth_07

1.25216 huy hiệu bạc20 Huy hiệu đồng16 silver badges20 bronze badges

1

Trong trường hợp này, tôi khuyên bạn nên sử dụng giao diện:

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
4

hơn trong mã của bạn:

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
5

Đã trả lời ngày 7 tháng 2 lúc 8:08Feb 7 at 8:08

Hướng dẫn can you overload constructor in php? - bạn có thể nạp chồng hàm tạo trong php không?

Theo như tôi biết, không được phép quá tải hàm tạo trong PHP, đơn giản là vì các nhà phát triển của PHP không bao gồm chức năng đó - đây là một trong nhiều khiếu nại về PHP.

Tôi đã nghe nói về các thủ thuật và cách giải quyết, nhưng quá tải đúng theo nghĩa OOP bị thiếu. Có thể trong các phiên bản tương lai, nó sẽ được bao gồm.

Đã trả lời ngày 30 tháng 1 năm 2010 lúc 21:20Jan 30, 2010 at 21:20

Hướng dẫn can you overload constructor in php? - bạn có thể nạp chồng hàm tạo trong php không?

SALTSCHARLIE SALTSCHARLIECharlie Salts

12.8k7 Huy hiệu vàng47 Huy hiệu bạc77 Huy hiệu đồng7 gold badges47 silver badges77 bronze badges

Tôi nghĩ rằng chúng ta cũng có thể sử dụng hàm tạo với các đối số mặc định như một sự thay thế tiềm năng để tạo quá tải hàm tạo trong PHP.constructor with default arguments as a potential substitute to constructor overloading in PHP.

Tuy nhiên, thực sự đáng buồn khi quá tải hàm tạo thực sự không được hỗ trợ trong PHP.

Đã trả lời ngày 18 tháng 3 năm 2013 lúc 5:23Mar 18, 2013 at 5:23

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
6

Đã trả lời ngày 18 tháng 8 năm 2018 lúc 12:50Aug 18, 2018 at 12:50

Hướng dẫn can you overload constructor in php? - bạn có thể nạp chồng hàm tạo trong php không?

Anteloveanteloveantelove

2.78420 Huy hiệu bạc19 Huy hiệu đồng20 silver badges19 bronze badges

$car1 = new Car('blue', 'RWD');
$car2 = new Car('Ford', '300hp');
7

Đã trả lời ngày 14 tháng 12 năm 2020 lúc 11:23Dec 14, 2020 at 11:23

Hướng dẫn can you overload constructor in php? - bạn có thể nạp chồng hàm tạo trong php không?

Ali Razaali RazaAli Raza

5925 Huy hiệu bạc13 Huy hiệu Đồng5 silver badges13 bronze badges

Tôi thực sự không phải là chuyên gia OOP, nhưng vì tôi hiểu rằng quá tải nó có nghĩa là khả năng của một phương pháp hành động khác nhau tùy thuộc vào các tham số mà nó nhận được là đầu vào. Điều này rất có thể với PHP, bạn không khai báo các loại đầu vào vì PHP không có gõ mạnh và tất cả quá tải được thực hiện trong thời gian chạy thay vì thời gian biên dịch.

Đã trả lời ngày 30 tháng 1 năm 2010 lúc 22:59Jan 30, 2010 at 22:59

Matteo Rivamatteo RivaMatteo Riva

24.3K12 Huy hiệu vàng71 Huy hiệu bạc104 Huy hiệu đồng12 gold badges71 silver badges104 bronze badges

1

Có thể quá tải trong PHP không?

PHP không hỗ trợ quá tải phương pháp.Trong trường hợp bạn chưa bao giờ nghe nói về quá tải phương thức, điều đó có nghĩa là ngôn ngữ có thể chọn một phương thức dựa trên các tham số bạn đang sử dụng để gọi nó.Điều này là có thể trong nhiều ngôn ngữ lập trình khác như Java, C ++.. In case you've never heard of method overloading, it means that the language can pick a method based on which parameters you're using to call it. This is possible in many other programming languages like Java, C++.

Có thể làm quá tải một hàm tạo?

Các hàm tạo có thể bị quá tải theo cách tương tự như quá tải chức năng.Các hàm tạo quá tải có cùng tên (tên của lớp) nhưng số lượng đối số khác nhau.Tùy thuộc vào số lượng và loại đối số được truyền, hàm tạo tương ứng được gọi.. Overloaded constructors have the same name (name of the class) but the different number of arguments. Depending upon the number and type of arguments passed, the corresponding constructor is called.

Php có hỗ trợ hàm tạo không?

PHP - Hàm __construct Một hàm tạo cho phép bạn khởi tạo các thuộc tính của một đối tượng khi tạo đối tượng.Nếu bạn tạo hàm __construct (), PHP sẽ tự động gọi hàm này khi bạn tạo một đối tượng từ một lớp.Lưu ý rằng hàm xây dựng bắt đầu với hai dấu gạch dưới (__)!A constructor allows you to initialize an object's properties upon creation of the object. If you create a __construct() function, PHP will automatically call this function when you create an object from a class. Notice that the construct function starts with two underscores (__)!