2011-07-03 64 views
7

thể trùng lặp:
Can I extend a class using more than 1 class in PHP?Bạn có thể mở rộng hai lớp học trong một lớp không?

Tôi có một lớp học có nhiều lớp trẻ, tuy nhiên tôi bây giờ thêm một lớp mà tôi cũng muốn trở thành một đứa trẻ của phụ huynh, tuy nhiên Tôi cũng muốn sử dụng nhiều chức năng từ một trong các lớp con khác.

Tôi đã nghĩ đến việc di chuyển các chức năng tương ứng từ lớp con khác sang cha mẹ, tuy nhiên không nghĩ rằng điều này thực sự cần thiết vì nó chỉ là hai lớp con sử dụng chúng. Tôi có thể mở rộng từ lớp chính của phụ huynh và từ một trong các lớp con hiện có.

Trả lời

9

Bạn có thể mở rộng lớp con để kế thừa cả cha mẹ và các chức năng của con, mà tôi nghĩ là những gì bạn đang cố gắng làm.

class Parent 
{ 
    protected function _doStuff(); 
} 

class Child extends Parent 
{ 
    protected function _doChildStuff(); 
} 

class Your_Class extends Child 
{ 
    // Access to all of Parent and all of Child's members 
} 

// Your_Class has access to both _doStuff() and _doChildStuff() by inheritance 
+0

Mặc dù như những người khác đã nói, một lớp không thể kế thừa từ hai lớp cùng một lúc (ví dụ: 'kéo dài A, b' hoặc một cái gì đó) – alxbl

+0

Đó là những gì Tôi đã nghĩ đến việc làm nhưng sau đó tôi không nghĩ rằng nó sẽ kế thừa công cụ từ cha mẹ chính. Trong trường hợp này lớp nào là cha mẹ? Làm cách nào để bạn truy cập các hàm/phương thức từ người không phải là cha mẹ? – Brett

+0

Từ 'Your_Class' bạn chỉ có thể gọi chúng bằng cách sử dụng' $ this-> method() 'như thường lệ ... mọi thành viên' protected' và 'public' sẽ được kế thừa. 'Child' là cha của' Your_Class' nhưng bởi đa hình, gợi ý kiểu 'Parent' cũng sẽ chấp nhận một đối tượng' Your_Class'. * Tôi đã thêm một chút chi tiết vào ví dụ mã để chỉ ra rằng * – alxbl

8

Không có php là ngôn ngữ kế thừa đơn. Nếu bạn có thể tìm kiếm tính năng sắp tới trong php 5.4, đó là các đặc điểm.

2

Là câu trả lời có/không, tôi có thể nói không. Bạn không thể mở rộng từ nhiều lớp trong php. nhưng thay vào đó bạn có thể sử dụng interface.

0

Bạn có thể làm điều này bằng cách suy nghĩ ngược lại, tuy nhiên tùy thuộc vào tình huống. Nếu bạn muốn giữ riêng các lớp học của bạn, không ai có thể cung cấp cho bạn câu trả lời hay về cách cấu trúc các đối tượng và thừa kế của bạn trừ khi bạn cung cấp thêm thông tin cho chúng tôi. Cũng nên nhớ rằng quá lo lắng về việc có được cấu trúc lớp đúng là gánh nặng trong các dự án nhỏ và bạn cũng có thể di chuyển các phương thức trên và được thực hiện với nó và tìm hiểu thêm về các lớp sau này.

8

Như đã nói @morphles, tính năng này sẽ có sẵn dưới dạng đặc điểm (như mixins trong các ngôn ngữ khác) trong php 5.4. Tuy nhiên, nếu nó thực sự cần thiết, bạn có thể sử dụng workaround ví dụ:

// your class #1 
class A { 
    function smthA() { echo 'A'; } 
} 

// your class #2 
class B { 
    function smthB() { echo 'B'; } 
} 

// composer class 
class ComposeAB { 
    // list of implemented classes 
    private $classes = array('A', 'B'); 
    // storage for objects of classes 
    private $objects = array(); 

    // creating all objects 
    function __construct() { 
     foreach($this->classes as $className) 
      $this->objects[] = new $className; 
    } 

    // looking for class method in all the objects 
    function __call($method, $args) { 
     foreach($this->objects as $object) { 
      $callback = array($object, $method); 
      if(is_callable($callback)) 
       return call_user_func_array($callback, $args); 
     } 
    } 
} 

$ab = new ComposeAB; 
$ab->smthA(); 
$ab->smthB(); 
+0

Cảm ơn ví dụ về cách giải quyết :) – Brett

+0

Bạn được chào đón) Viết cho tôi nếu bạn không thể thay đổi nó cho nhu cầu của mình. – RReverser

+0

Điều này có tác dụng nếu ComposeAB cần thiết để thực hiện một giao diện chỉ định các hàm trong A và B? Hãy tưởng tượng nếu giao diện có smthA và smthB, ComposeAB đã triển khai một giao diện như vậy, hàm __call có đáp ứng các yêu cầu của giao diện không? – CMCDragonkai

Các vấn đề liên quan