Hướng dẫn can we extend two class php? - chúng ta có thể mở rộng hai lớp php không?

Chỉnh sửa: 2020 Php 5.4+ và 7+

Kể từ Php 5.4.0, có "đặc điểm" - bạn có thể sử dụng nhiều đặc điểm hơn trong một lớp, vì vậy điểm quyết định cuối cùng sẽ là liệu bạn có thực sự muốn thừa kế hay bạn chỉ cần một số "tính năng" (đặc điểm). Đặc điểm, mơ hồ nói, một giao diện đã được triển khai có nghĩa là chỉ là useD.really an inheritance or you just need some "feature"(trait). Trait is, vaguely said, an already implemented interface that is meant to be just used.


Hiện đang được chấp nhận câu trả lời của @FRANCK sẽ hoạt động nhưng trên thực tế, nó không phải là một bản năng kế mà là một trường hợp trẻ em được xác định ngoài phạm vi, cũng có `__call ()` tốc ký-xem xét chỉ bằng cách sử dụng `$ này (args) `Bất cứ nơi nào bạn cần phương thức lớp bên ngoài trong lớp" mở rộng ".

Câu trả lời chính xác

Không, bạn không thể, không thực sự, như hướng dẫn sử dụng từ khóa extends nói:

Một lớp mở rộng luôn phụ thuộc vào một lớp cơ sở duy nhất, nghĩa là nhiều kế thừa không được hỗ trợ.

Câu trả lời thực sự

Tuy nhiên, như @Adam đã đề xuất chính xác, điều này không cấm bạn sử dụng nhiều kế thừa phân cấp.

Bạn có thể mở rộng một lớp, với một lớp khác và một lớp khác với ...

Vì vậy, ví dụ khá đơn giản về điều này sẽ là:

class firstInheritance{}
class secondInheritance extends firstInheritance{}
class someFinalClass extends secondInheritance{}
//...and so on...

Lưu ý quan trọng

Như bạn có thể nhận thấy, bạn chỉ có thể thực hiện nhiều (2+) theo phân cấp nếu bạn có quyền kiểm soát tất cả các lớp có trong quy trình - điều đó có nghĩa là, bạn không thể áp dụng giải pháp này, ví dụ: Với các lớp học tích hợp hoặc với các lớp bạn chỉ đơn giản là không thể chỉnh sửa - nếu bạn muốn làm điều đó, bạn sẽ bị bỏ lại với giải pháp @FRANCK - các trường hợp trẻ em.you can only do multiple(2+) intehritance by hierarchy if you have control over all classes included in the process - that means, you can't apply this solution e.g. with built-in classes or with classes you simply can't edit - if you want to do that, you are left with the @Franck solution - child instances.

... và cuối cùng là ví dụ với một số đầu ra:

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."
".PHP_EOL; } } class B extends A{ function b_hi(){ echo "I am b of B".PHP_EOL."
".PHP_EOL; } } class C extends B{ function c_hi(){ echo "I am c of C".PHP_EOL."
".PHP_EOL; } } $myTestInstance = new C(); $myTestInstance->a_hi(); $myTestInstance->b_hi(); $myTestInstance->c_hi();

Đầu ra nào

I am a of A 
I am b of B 
I am c of C 

Sibian0218 tại Gmail Dot Com ¶

4 năm trước

Sam Tigall ¶

Nemanja ¶

gino dot d tại amail dot com ¶

Shaun tại slickdesign dot com dot au ¶:

Trừ khi tự động tải được sử dụng, các lớp phải được xác định trước khi chúng được sử dụng. Nếu một lớp mở rộng một lớp khác, thì lớp cha phải được khai báo trước cấu trúc lớp con. Quy tắc này áp dụng cho các lớp kế thừa các lớp và giao diện khác.

Ghi chú::

Nó không được phép ghi đè một thuộc tính đọc-viết với thuộc tính readonly hoặc ngược lại.

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."
".PHP_EOL; } } class B extends A{ function b_hi(){ echo "I am b of B".PHP_EOL."
".PHP_EOL; } } class C extends B{ function c_hi(){ echo "I am c of C".PHP_EOL."
".PHP_EOL; } } $myTestInstance = new C(); $myTestInstance->a_hi(); $myTestInstance->b_hi(); $myTestInstance->c_hi();
2

Ví dụ #1 ví dụ kế thừa

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."
".PHP_EOL; } } class B extends A{ function b_hi(){ echo "I am b of B".PHP_EOL."
".PHP_EOL; } } class C extends B{ function c_hi(){ echo "I am c of C".PHP_EOL."
".PHP_EOL; } } $myTestInstance = new C(); $myTestInstance->a_hi(); $myTestInstance->b_hi(); $myTestInstance->c_hi();
3

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."
".PHP_EOL; } } class B extends A{ function b_hi(){ echo "I am b of B".PHP_EOL."
".PHP_EOL; } } class C extends B{ function c_hi(){ echo "I am c of C".PHP_EOL."
".PHP_EOL; } } $myTestInstance = new C(); $myTestInstance->a_hi(); $myTestInstance->b_hi(); $myTestInstance->c_hi();
4

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."
".PHP_EOL; } } class B extends A{ function b_hi(){ echo "I am b of B".PHP_EOL."
".PHP_EOL; } } class C extends B{ function c_hi(){ echo "I am c of C".PHP_EOL."
".PHP_EOL; } } $myTestInstance = new C(); $myTestInstance->a_hi(); $myTestInstance->b_hi(); $myTestInstance->c_hi();
5

Trả về loại tương thích với các lớp bên trong

Trước PHP 8.1, hầu hết các lớp hoặc phương thức nội bộ đã không khai báo loại trả lại của họ và bất kỳ loại hoàn trả nào được cho phép khi mở rộng chúng.

Kể từ Php 8.1.0, hầu hết các phương thức nội bộ bắt đầu "dự kiến" khai báo loại trả lại của họ, trong trường hợp đó, loại phương thức trả về phải tương thích với cha mẹ được mở rộng; Nếu không, một thông báo không nhận được được phát ra. Lưu ý rằng việc thiếu một tuyên bố hoàn trả rõ ràng cũng được coi là sự không phù hợp đặc trưng, ​​và do đó dẫn đến thông báo từ chối.

Nếu loại trả về không thể được khai báo cho một phương thức ghi đè do các mối quan tâm tương thích phiên bản chéo PHP, một thuộc tính

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."
".PHP_EOL; } } class B extends A{ function b_hi(){ echo "I am b of B".PHP_EOL."
".PHP_EOL; } } class C extends B{ function c_hi(){ echo "I am c of C".PHP_EOL."
".PHP_EOL; } } $myTestInstance = new C(); $myTestInstance->a_hi(); $myTestInstance->b_hi(); $myTestInstance->c_hi();
6 có thể được thêm vào để im lặng thông báo không dùng nữa.

Ví dụ #2 Phương thức ghi đè không khai báo bất kỳ loại trả về nào

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."
".PHP_EOL; } } class B extends A{ function b_hi(){ echo "I am b of B".PHP_EOL."
".PHP_EOL; } } class C extends B{ function c_hi(){ echo "I am c of C".PHP_EOL."
".PHP_EOL; } } $myTestInstance = new C(); $myTestInstance->a_hi(); $myTestInstance->b_hi(); $myTestInstance->c_hi();
7

Ví dụ #3 Phương thức ghi đè khai báo loại trả về sai

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."
".PHP_EOL; } } class B extends A{ function b_hi(){ echo "I am b of B".PHP_EOL."
".PHP_EOL; } } class C extends B{ function c_hi(){ echo "I am c of C".PHP_EOL."
".PHP_EOL; } } $myTestInstance = new C(); $myTestInstance->a_hi(); $myTestInstance->b_hi(); $myTestInstance->c_hi();
8

Ví dụ #4 Phương thức ghi đè tuyên bố loại trả về sai mà không có thông báo không dùng nữa

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."
".PHP_EOL; } } class B extends A{ function b_hi(){ echo "I am b of B".PHP_EOL."
".PHP_EOL; } } class C extends B{ function c_hi(){ echo "I am c of C".PHP_EOL."
".PHP_EOL; } } $myTestInstance = new C(); $myTestInstance->a_hi(); $myTestInstance->b_hi(); $myTestInstance->c_hi();
9

Jackdracona tại msn dot com ¶

12 năm trước

I am a of A 
I am b of B 
I am c of C 
0

I am a of A 
I am b of B 
I am c of C 
1

I am a of A 
I am b of B 
I am c of C 
2

I am a of A 
I am b of B 
I am c of C 
3

I am a of A 
I am b of B 
I am c of C 
4

I am a of A 
I am b of B 
I am c of C 
5

Mohammad Istanbouly ¶

5 năm trước

I am a of A 
I am b of B 
I am c of C 
6

I am a of A 
I am b of B 
I am c of C 
7

I am a of A 
I am b of B 
I am c of C 
8

I am a of A 
I am b of B 
I am c of C 
9

Strata_ranger tại hotmail dot com

12 năm trước

use0

use1

use2

use3

use4

use5

Mohammad Istanbouly ¶

5 năm trước

use6

use7

use8

use9

extends0

Strata_ranger tại hotmail dot com

Akashwebdev tại gmail dot com ¶

extends1

extends2

use4

extends4

7 năm trước

12 năm trước

extends5

extends6

extends7

use4

extends9

Mohammad Istanbouly ¶

5 năm trước

final0

final1

final2

final3

final4

Strata_ranger tại hotmail dot com

Akashwebdev tại gmail dot com ¶

final5

final6

final4

7 năm trước

5 năm trước

final8

final9

static0

static1

Strata_ranger tại hotmail dot com

5 năm trước

static2

static3

static4

final4

Strata_ranger tại hotmail dot com

5 năm trước

static6

static7

static8

static9

Strata_ranger tại hotmail dot com

Akashwebdev tại gmail dot com ¶

private final0

private final1

private final2

private final3

final4

7 năm trước

Niemans tại pbsolo dot nl ¶

private final5

private final6

private final7

use4

private final9

2 năm trước

5 năm trước

protected0

protected1

protected2

Strata_ranger tại hotmail dot com

5 năm trước

protected3

protected4

protected5

protected6

protected7

Strata_ranger tại hotmail dot com

12 năm trước

protected8

protected9

public0

public1

Mohammad Istanbouly ¶

5 năm trước

public2

public3

public4

public5

Chúng ta có thể mở rộng hai lớp trong lớp không?

Một lớp chỉ có thể mở rộng một lớp, nhưng thực hiện nhiều giao diện.Một giao diện có thể mở rộng giao diện khác, theo cách tương tự như một lớp có thể mở rộng một lớp khác., but implement many interfaces. An interface can extend another interface, in a similar way as a class can extend another class.

Tại sao chúng ta không thể mở rộng nhiều lớp?

Khi một lớp mở rộng nhiều hơn một lớp thì điều này được gọi là nhiều kế thừa.Ví dụ: Lớp C mở rộng lớp A và B sau đó loại di truyền này được gọi là nhiều kế thừa.. For example: Class C extends class A and B then this type of inheritance is known as multiple inheritance.

Bạn có thể mở rộng một lớp học mở rộng lớp khác không?

Bạn có thể mở rộng một lớp để cung cấp hành vi chuyên môn hơn.Một lớp mở rộng một lớp khác kế thừa tất cả các phương thức và thuộc tính của lớp mở rộng.Ngoài ra, lớp mở rộng có thể ghi đè các phương thức ảo hiện có bằng cách sử dụng từ khóa ghi đè trong định nghĩa phương thức.. A class that extends another class inherits all the methods and properties of the extended class. In addition, the extending class can override the existing virtual methods by using the override keyword in the method definition.

Những gì đang mở rộng lớp trong PHP?

Từ khóa mở rộng được sử dụng để lấy một lớp từ một lớp khác.Điều này được gọi là thừa kế.Một lớp có nguồn gốc có tất cả các thuộc tính công khai và được bảo vệ của lớp mà nó bắt nguồn từ.used to derive a class from another class. This is called inheritance. A derived class has all of the public and protected properties of the class that it is derived from.