Hướng dẫn can we inherit constructor in php? - chúng ta có thể kế thừa hàm tạo trong php không?

Tôi đồng ý với "quá nhiều PHP", hãy thử điều này:

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } } $instance = new Kiddo;

Tôi đã nhận được kết quả như mong đợi:

Kiddo

ông nội

Đây là một tính năng không phải là một lỗi, hãy kiểm tra điều này để biết tài liệu tham khảo của bạn:

https://bugs.php.net/bug.php?id=42016

Nó chỉ là cách nó hoạt động. Nếu nó thấy nó đến từ bối cảnh phù hợp, phiên bản cuộc gọi này không thực thi một cuộc gọi tĩnh.

Thay vào đó, nó sẽ chỉ đơn giản là giữ $ này và hạnh phúc với nó.

Parent :: Phương thức () hoạt động theo cùng một cách, bạn không phải định nghĩa phương thức là tĩnh nhưng nó có thể được gọi trong cùng một bối cảnh. Hãy thử điều này để thú vị hơn:

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;

Nó cũng hoạt động như mong đợi:

Kiddo

ông nội

Đây là một tính năng không phải là một lỗi, hãy kiểm tra điều này để biết tài liệu tham khảo của bạn:

Nó chỉ là cách nó hoạt động. Nếu nó thấy nó đến từ bối cảnh phù hợp, phiên bản cuộc gọi này không thực thi một cuộc gọi tĩnh.

Thay vào đó, nó sẽ chỉ đơn giản là giữ $ này và hạnh phúc với nó.

Parent :: Phương thức () hoạt động theo cùng một cách, bạn không phải định nghĩa phương thức là tĩnh nhưng nó có thể được gọi trong cùng một bối cảnh. Hãy thử điều này để thú vị hơn:

Nó cũng hoạt động như mong đợi:

if ($this instanceof Kiddo) Kiddo::hello();

Tóm tắt: Trong hướng dẫn này, bạn sẽ học cách gọi hàm tạo cha mẹ từ hàm tạo của lớp con.: in this tutorial, you’ll learn how to call the parent constructor from the constructor of the child class.

Lớp trẻ không có một người xây dựng

Trong hướng dẫn kế thừa, bạn đã học được cách xác định lớp

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3 kế thừa lớp
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
4:

Tuy nhiên, chúng tôi đã thảo luận về các nhà xây dựng của các lớp phụ huynh và con cái trong bối cảnh thừa kế.

Sau đây thêm một hàm tạo vào lớp

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
4, chấp nhận tham số
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
6. Trình xây dựng gán đối số
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
6 cho thuộc tính
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
6:

class BankAccount { private $balance; public function __construct($balance) { $this->balance = $balance; } public function getBalance() { return $this->balance; } public function deposit($amount) { if ($amount > 0) { $this->balance += $amount; } return $this; } }

Code language: HTML, XML (xml)

Lớp

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3 vẫn giữ nguyên và không bao gồm hàm tạo riêng của nó:

class SavingAccount extends BankAccount { private $interestRate; public function setInterestRate($interestRate) { $this->interestRate = $interestRate; } public function addInterest() { // calculate interest $interest = $this->interestRate * $this->getBalance(); // deposit interest to the balance $this->deposit($interest); } }

Code language: HTML, XML (xml)

Khi bạn tạo một thể hiện mới của

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3, PHP sẽ gọi hàm tạo của lớp
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3. Tuy nhiên, PHP không thể tìm thấy hàm tạo trong
$papa = new Papa;
2. Do đó, nó tiếp tục tìm kiếm hàm tạo của lớp cha của lớp
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3, đó là lớp
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
4. Và nó gọi hàm tạo của lớp
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
4.

Nếu bạn không chuyển một đối số cho hàm tạo của lớp

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3, bạn sẽ gặp lỗi:

$account = new SavingAccount();

Code language: PHP (php)

Error:

Fatal error: Uncaught ArgumentCountError: Too few arguments to function BankAccount::__construct(), 0 passed in ... on line 5 and exactly 1 expected in ...

Code language: JavaScript (javascript)

Nhưng nếu bạn chuyển một đối số cho hàm tạo, nó sẽ hoạt động hoàn hảo:

$account = new SavingAccount(100);

Code language: PHP (php)

Xác định một hàm tạo trong lớp trẻ em

Một lớp trẻ em có thể có hàm tạo riêng của nó. Ví dụ: bạn có thể thêm một hàm tạo vào lớp

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3 như sau:

class SavingAccount extends BankAccount { private $interestRate; public function __construct($interestRate) { $this->interestRate = $interestRate; } public function setInterestRate($interestRate) { $this->interestRate = $interestRate; } public function addInterest() { // calculate interest $interest = $this->interestRate * $this->getBalance(); // deposit interest to the balance $this->deposit($interest); } }

Code language: HTML, XML (xml)

Lớp

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3 có một hàm tạo khởi tạo thuộc tính
$papa = new Papa;
9.

Khi một lớp trẻ có hàm tạo riêng, hàm tạo trong lớp trẻ sẽ không gọi hàm xây dựng của lớp cha.

Ví dụ: sau đây tạo ra một thể hiện mới của lớp

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3 và khởi tạo thuộc tính
if ($this instanceof Kiddo) Kiddo::hello();
1 thành giá trị
if ($this instanceof Kiddo) Kiddo::hello();
2

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
0

Để gọi hàm tạo của lớp cha từ hàm tạo của lớp con, bạn sử dụng cú pháp

if ($this instanceof Kiddo) Kiddo::hello();
3.

Sau đây thay đổi hàm tạo của lớp

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3 chấp nhận hai đối số: số dư & lãi suất. Nó cũng gọi hàm tạo của lớp
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
4 để khởi tạo thuộc tính
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
6:

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
1

Cú pháp để gọi hàm tạo cha mẹ giống như một phương thức thông thường.

Đặt nó tất cả cùng nhau:

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
2

Biểu đồ lớp sau đây minh họa sự kế thừa giữa các lớp

class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
3 và
class Grandpa 
{
    public function __construct()
    {
        echo 'Grandpa
'; Kiddo::hello(); } } class Papa extends Grandpa { public function __construct() { echo 'Papa
'; parent::__construct(); } } class Kiddo extends Papa { public function __construct() { // THIS IS WHERE I NEED TO CALL GRANDPA'S // CONSTRUCTOR AND NOT PAPA'S echo 'Kiddo
'; Grandpa::__construct(); } public function hello() { echo 'Hello
'; } } $instance = new Kiddo;
4:

Hướng dẫn can we inherit constructor in php? - chúng ta có thể kế thừa hàm tạo trong php không?

Bản tóm tắt

  • Trình xây dựng của lớp con không tự động gọi hàm tạo của lớp cha.
  • Sử dụng
    if ($this instanceof Kiddo) Kiddo::hello();
    
    3 để gọi hàm tạo cha mẹ từ hàm tạo trong lớp con.

Bạn có thấy hướng dẫn này hữu ích không?

Là hàm tạo được kế thừa trong PHP?

Kế thừa: Vì sự kế thừa là một khái niệm hướng đối tượng, các hàm tạo được di truyền từ lớp cha sang lớp con có nguồn gốc từ nó. Bất cứ khi nào lớp trẻ có hàm tạo và hàm hủy của riêng mình, chúng được gọi theo thứ tự ưu tiên hoặc sở thích.the Constructors are inherited from parent class to child class derived from it. Whenever the child class has constructor and destructor of their own, these are called in order of priority or preference.

Bạn có thể thừa hưởng một hàm tạo?

Các hàm tạo không phải là thành viên, vì vậy chúng không được thừa hưởng bởi các lớp con, nhưng hàm tạo của siêu lớp có thể được gọi từ lớp con.they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass.

Làm thế nào để bạn gọi một hàm tạo trong PHP?

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 (__)!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 (__)!

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 một cách 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.