PHP có thể có nhiều hàm tạo không?

Bạn không thể đặt hai hàm __construct có chữ ký đối số duy nhất trong một lớp PHP. Tôi muốn làm điều này
class Student
{
protected $id;
protected $name;
// etc.

public function __construct($id){
$this->id = $id;
// other members are still uninitialized
}

public function __construct($row_from_database){
$this->id = $row_from_database->id;
$this->name = $row_from_database->name;
// etc.
}
}

Cách tốt nhất để làm điều này trong PHP là gì?

PHP cho phép các nhà phát triển khai báo các phương thức khởi tạo cho các lớp. Các lớp có phương thức khởi tạo gọi phương thức này trên mỗi đối tượng mới được tạo, vì vậy nó phù hợp với bất kỳ khởi tạo nào mà đối tượng có thể cần trước khi nó được sử dụng

Ghi chú. Các hàm tạo cha không được gọi ngầm nếu lớp con định nghĩa một hàm tạo. Để chạy một hàm tạo cha, một lệnh gọi tới hàm cha. __construct() trong hàm tạo con là bắt buộc. Nếu con không định nghĩa hàm tạo thì nó có thể được kế thừa từ lớp cha giống như một phương thức của lớp bình thường (nếu nó không được khai báo là riêng tư)

Ví dụ #1 Constructor trong kế thừa

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}

class OtherSubClass extends BaseClass {
// inherits BaseClass's constructor
}

// In BaseClass constructor
$obj = new BaseClass();

// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();

// In BaseClass constructor
$obj = new OtherSubClass();
?>

Không giống như các phương pháp khác, được miễn trừ thông thường khi được gia hạn

Hàm tạo là các phương thức thông thường được gọi trong quá trình khởi tạo đối tượng tương ứng của chúng. Như vậy, chúng có thể định nghĩa một số đối số tùy ý, có thể được yêu cầu, có thể có một loại và có thể có một giá trị mặc định. Các đối số của hàm tạo được gọi bằng cách đặt các đối số trong dấu ngoặc đơn sau tên lớp

Ví dụ #2 Sử dụng đối số hàm tạo

class Point {
protected int $x;
protected int $y;

________số 8_______

// Pass both parameters.
$p1 = new Point(4, 5);
// Pass only the required parameter. $y will take its default value of 0.
$p2 = new Point(4);
// With named parameters (as of PHP 8.0):
$p3 = new Point(y: 5, x: 4);
?>

Nếu một lớp không có hàm tạo hoặc hàm tạo không có đối số bắt buộc, thì có thể bỏ qua dấu ngoặc đơn

Các nhà xây dựng kiểu cũ

Trước PHP 8. 0. 0, các lớp trong không gian tên chung sẽ diễn giải một phương thức có tên giống như lớp dưới dạng một hàm tạo kiểu cũ. Cú pháp đó không được dùng nữa và sẽ dẫn đến lỗi class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
0 nhưng vẫn gọi hàm đó là hàm tạo. Nếu cả hai và một phương thức cùng tên được xác định, sẽ được gọi

Trong các lớp được đặt tên hoặc bất kỳ lớp nào kể từ PHP 8. 0. 0, một phương thức được đặt tên giống như lớp không bao giờ có bất kỳ ý nghĩa đặc biệt nào

Luôn sử dụng trong mã mới

Quảng cáo nhà xây dựng

Kể từ PHP 8. 0. 0, các tham số hàm tạo cũng có thể được thăng cấp để tương ứng với một thuộc tính đối tượng. Rất phổ biến đối với các tham số hàm tạo được gán cho một thuộc tính trong hàm tạo nhưng nếu không thì không được vận hành. Quảng cáo trình xây dựng cung cấp cách viết tắt cho trường hợp sử dụng đó. Ví dụ trên có thể viết lại như sau

Ví dụ #3 Sử dụng khuyến mãi thuộc tính hàm tạo

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
1

Khi một đối số hàm tạo bao gồm một công cụ sửa đổi khả năng hiển thị, PHP sẽ hiểu nó là cả thuộc tính đối tượng và đối số hàm tạo và gán giá trị đối số cho thuộc tính. Phần thân của hàm tạo sau đó có thể trống hoặc có thể chứa các câu lệnh khác. Mọi câu lệnh bổ sung sẽ được thực hiện sau khi các giá trị đối số đã được gán cho các thuộc tính tương ứng

Không phải tất cả các đối số cần phải được thúc đẩy. Có thể trộn và kết hợp các đối số được quảng cáo và không được quảng cáo, theo bất kỳ thứ tự nào. Các đối số được quảng cáo không ảnh hưởng đến mã gọi hàm tạo

Ghi chú

Các thuộc tính đối tượng có thể không được gõ có thể gọi được do sự mơ hồ của động cơ sẽ giới thiệu. Do đó, các đối số được quảng cáo có thể không được gõ có thể gọi được. Tuy nhiên, mọi khai báo kiểu khác đều được cho phép

Ghi chú

Các thuộc tính được đặt trên một đối số hàm tạo được thăng cấp sẽ được sao chép sang cả thuộc tính và đối số. Các giá trị mặc định trên đối số hàm tạo được thăng cấp sẽ chỉ được sao chép thành đối số chứ không phải thuộc tính

Mới trong bộ khởi tạo

Kể từ PHP 8. 1. 0, các đối tượng có thể được sử dụng làm giá trị tham số mặc định, biến tĩnh và hằng số toàn cục, cũng như trong các đối số thuộc tính. Các đối tượng cũng có thể được chuyển đến định nghĩa () ngay bây giờ

Ghi chú

Không được phép sử dụng tên lớp động hoặc không phải chuỗi hoặc lớp ẩn danh. Việc sử dụng giải nén đối số không được phép. Không được phép sử dụng các biểu thức không được hỗ trợ làm đối số

Ví dụ #4 Sử dụng new trong trình khởi tạo

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
2

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
3

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
4

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
5

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
6

Phương pháp tạo tĩnh

PHP chỉ hỗ trợ một hàm tạo duy nhất cho mỗi lớp. Tuy nhiên, trong một số trường hợp, có thể mong muốn cho phép một đối tượng được xây dựng theo những cách khác nhau với các đầu vào khác nhau. Cách được đề xuất để làm như vậy là sử dụng các phương thức tĩnh làm trình bao bọc hàm tạo

Ví dụ #5 Sử dụng các phương thức tạo tĩnh

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
7

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
8

class BaseClass {
function __construct() {
print "In BaseClass constructor\n";
}
}
9

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
0

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
1

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
2

class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
3

Hàm tạo có thể được đặt ở chế độ riêng tư hoặc được bảo vệ để ngăn không cho nó được gọi từ bên ngoài. Nếu vậy, chỉ một phương thức tĩnh mới có thể khởi tạo lớp. Bởi vì chúng ở trong cùng một định nghĩa lớp nên chúng có quyền truy cập vào các phương thức riêng tư, ngay cả khi không thuộc cùng một thể hiện đối tượng. Hàm tạo riêng là tùy chọn và có thể có hoặc không có ý nghĩa tùy thuộc vào trường hợp sử dụng

Ba phương thức tĩnh công khai sau đó thể hiện các cách khác nhau để khởi tạo đối tượng

  • class SubClass extends BaseClass {
    function __construct() {
    parent::__construct();
    print "In SubClass constructor\n";
    }
    }
    4 lấy chính xác các tham số cần thiết, sau đó tạo đối tượng bằng cách gọi hàm tạo và trả về kết quả
  • class SubClass extends BaseClass {
    function __construct() {
    parent::__construct();
    print "In SubClass constructor\n";
    }
    }
    5 chấp nhận một chuỗi JSON và tự xử lý một số chuỗi đó để chuyển đổi nó thành định dạng mà hàm tạo mong muốn. Sau đó nó trả về đối tượng mới
  • class SubClass extends BaseClass {
    function __construct() {
    parent::__construct();
    print "In SubClass constructor\n";
    }
    }
    6 chấp nhận một chuỗi XML, tiền xử lý nó và sau đó tạo một đối tượng trống. Hàm tạo vẫn được gọi, nhưng vì tất cả các tham số đều là tùy chọn nên phương thức bỏ qua chúng. Sau đó, nó gán trực tiếp các giá trị cho các thuộc tính đối tượng trước khi trả về kết quả

Trong cả ba trường hợp, từ khóa class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
7 được dịch thành tên của lớp chứa mã. Trong trường hợp này, class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "In SubClass constructor\n";
}
}
8

Làm cách nào để sử dụng hai hàm tạo trong PHP?

Có ba cách để bạn có thể mô phỏng nhiều hàm tạo trong PHP. .
Làm cách nào để khai báo nhiều hàm tạo trong một lớp?
Sử dụng các tham số tùy chọn trong hàm tạo
Sử dụng các phương thức trợ giúp tĩnh trong lớp
Sử dụng call_user_func_array() để mô phỏng nhiều hàm tạo

Tôi có thể có hai hàm tạo không?

Kỹ thuật có hai (hoặc nhiều) hàm tạo trong một lớp được gọi là nạp chồng hàm tạo. Một lớp có thể có nhiều hàm tạo khác nhau về số lượng và/hoặc loại tham số của chúng. Tuy nhiên, không thể có hai hàm tạo có cùng tham số chính xác .

Có quá tải hàm tạo trong PHP không?

Không có phương pháp nạp chồng hàm tạo đơn giản nào trong PHP . Có vài cách giải quyết để đạt được điều này.

Có bao nhiêu cách bạn có thể định nghĩa một hàm tạo trong PHP?

Một hàm tạo có thể có hoặc không có đối số . Hàm tạo có đối số được gọi là hàm tạo được tham số hóa và hàm tạo không có đối số được gọi là hàm tạo không có đối số.