2010-08-02 44 views
7

Tôi muốn có một phương thức tĩnh trong lớp cha tạo ra các cá thể của bất kỳ lớp con nào mà tôi gọi phương thức này.PHP: gọi hàm tạo con từ phương thức tĩnh trong parent

Một ví dụ để làm điều này rõ ràng hơn:

 
class parent { 
    public static method make_objects($conditions){ 
     for (...){ 
      // here i want to create an instance 
      // of whatever subclass i am calling make_objects on 
      // based on certain $conditions 
     } 
    } 
} 

class sub extends parent{ 
    ... 
} 

$objects = sub::make_objects($some_conditions); 
+0

Không phải bạn thiếu một 'extends'? Thêm vào đó, tôi không thực sự hiểu những gì bạn muốn làm. Bạn có thể đưa ra một ví dụ rõ ràng hơn về những gì 'make_objects' trả về? –

+0

Có, tôi đang thiếu một phần mở rộng. Sẽ có một cơ sở dữ liệu với vô số mục đại diện cho các thể hiện của lớp con và phương thức make_objects trả về các tập con nhất định của các cá thể này dựa trên các điều kiện nhất định. basiccaly im cố gắng để tạo ra một cái gì đó giống như một công cụ orm nhưng với một số tính năng cụ thể tôi cần cho một dự án. – martijnve

Trả lời

8

Tính đến php 5.3 bạn có thể sử dụng từ khóa static cho điều này

<?php 
class A { 
    public static function newInstance() { 
    $rv = new static(); 
    return $rv; 
    } 
} 
class B extends A { } 
class C extends B { } 

$o = A::newInstance(); var_dump($o); 
$o = B::newInstance(); var_dump($o); 
$o = C::newInstance(); var_dump($o); 

in

object(A)#1 (0) { 
} 
object(B)#2 (0) { 
} 
object(C)#1 (0) { 
} 

chỉnh sửa: khác (tương tự) ví dụ

<?php 
class A { 
    public static function newInstance() { 
    $rv = new static(); 
    return $rv; 
    } 

    public function __construct() { echo " A::__construct\n"; } 
} 
class B extends A { 
    public function __construct() { echo " B::__construct\n"; } 
} 
class C extends B { 
    public function __construct() { echo " C::__construct\n"; } 
} 

$types = array('A', 'B', 'C'); 
foreach($types as $t) { 
    echo 't=', $t, "\n"; 
    $o = $t::newInstance(); 
    echo ' type of o=', get_class($o), "\n"; 
} 

in

t=A 
A::__construct 
    type of o=A 
t=B 
B::__construct 
    type of o=B 
t=C 
C::__construct 
    type of o=C 
+0

Tôi hiểu anh ta muốn tạo ra các thể hiện tùy thuộc vào loại anh ta có trong cơ sở dữ liệu của anh ấy. Vì vậy, điều này sẽ không giúp anh ta. –

+0

Có thể, câu hỏi hơi mơ hồ. Chúng ta sẽ thấy. – VolkerK

+0

không có tôi muốn tạo ra trường hợp của tiểu nhưng đối với dòng trong cơ sở dữ liệu của tôi vì vậy nó hink đây là câu trả lời tôi đã hy vọng. Sẽ kiểm tra nó ngay bây giờ. – martijnve

0

Umm, sẽ không có được:

class sub extends parent { 
    public static function make_objects($conditions) { 
    //sub specific stuff here 
    //.... 
    } 
} 
+0

oh tôi thấy tôi quên mở rộng trong mã ví dụ của tôi. nhưng không. các đối tượng thực hiện goin khá dài và compex và sẽ có hàng tá lớp con của cha mẹ để đặt toàn bộ phương thức trong mỗi phân lớp là không mong muốn (mặc dù nó có thể là lựa chọn duy nhất) – martijnve

1

Tôi nghĩ rằng bạn muốn một cái gì đó như thế này:

class parent { 
    public static function make_object($conditionns) { 
    if($conditions == "case1") { 
     return new sub(); 
    } 
    } 
} 

class sub extends parent { 

} 

Bây giờ bạn có thể tạo một thể hiện như thế này:

$instance = parent::make_object("case1"); 

hoặc

$instance = sub::make_object("case1"); 

Nhưng tại sao bạn lại muốn tất cả các lớp tiểu để mở rộng phụ huynh? Không nên bạn nhiều hơn là có một phụ huynh cho các mô hình của bạn (các lớp con) và sau đó một lớp nhà máy, tạo ra các trường hợp cho các mô hình này tùy thuộc vào các điều kiện được đưa ra?

+0

Nhà máy là một ý tưởng rất hay. – Sven

-1

làm cho tầng lớp phụ huynh một lớp trừu tượng và làm cho các phương pháp cha mẹ cũng là một trừu tượng

abstract static class parent { 
    abstract function make_method() { 
     // your process 
    } 
} 

class child extends parent { 
    public function __construct() { 
      parent::make_method(); 
    } 
} 
+0

Trường hợp tĩnh ở đâu? – Sven

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