Câu trả lời hiện được chấp nhận bởi @Franck sẽ hoạt động nhưng thực tế nó không phải là nhiều kế thừa mà là một thể hiện con của lớp được xác định ngoài phạm vi, cũng có __call()
cách viết tắt - xem xét sử dụng $this->childInstance->method(args)
bất cứ nơi nào bạn cần phương thức lớp InternalClass trong lớp "mở rộng".
Câu trả lời chính xác
Không, bạn không thể, tương ứng, không thực sự, như hướng dẫn của extends
từ khóa 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 một cách 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 lớp khác và lớp khác với ... và ...
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+) tính phân cấp theo phân cấp nếu bạn có quyền kiểm soát tất cả các lớp 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ụ như với các lớp 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ẽ chỉ còn lại giải pháp @Franck - các thể hiện con.
... 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."<br>".PHP_EOL;
}
}
class B extends A{
function b_hi(){
echo "I am b of B".PHP_EOL."<br>".PHP_EOL;
}
}
class C extends B{
function c_hi(){
echo "I am c of C".PHP_EOL."<br>".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