2009-10-21 64 views
22

Tôi có một lớp trong PHP như sau:PHP: Làm thế nào để vượt qua lớp con __construct() đối số cho cha mẹ :: __ construct()?

class ParentClass { 
    function __construct($arg) { 
     // Initialize a/some variable(s) based on $arg 
    } 
} 

Nó có một lớp trẻ, như vậy:

class ChildClass extends ParentClass { 
    function __construct($arg) { 
     // Let the parent handle construction. 
     parent::__construct($arg); 
    } 
} 

gì nếu vì một lý do, các ParentClass cần phải thay đổi để mất hơn một đối số tùy chọn mà tôi muốn lớp Con mình cung cấp "chỉ trong trường hợp"? Trừ khi tôi tái mã ChildClass, nó sẽ chỉ bao giờ lấy một đối số cho hàm tạo, và sẽ chỉ bao giờ vượt qua một đối số đó.

Thực tế này rất hiếm hoặc không tốt đến nỗi trường hợp thông thường là ChildClass không cần phải kế thừa từ ParentClass có các đối số khác nhau?

Về cơ bản, tôi đã thấy trong Python, nơi bạn có thể chuyển số lượng đối số tiềm ẩn chưa biết tới hàm qua số somefunction(*args) trong đó 'args' là một mảng/có thể lặp lại của một số loại. Có điều gì đó như thế này tồn tại trong PHP không? Hoặc tôi có nên cấu trúc lại các lớp này trước khi tiếp tục không?

Trả lời

26

Có gì đó như thế này trong php, mặc dù một chút dài dòng:

$args = func_get_args(); 
call_user_func_array(array($this, 'parent::__construct'), $args); 
+1

Điều này gây ra một vòng lặp vô hạn trên PHP 5.4.14 – Hubro

+0

Sẽ không hoạt động nếu $ này trỏ đến một lớp khác. – mAsT3RpEE

+5

Trong 5.5 (có thể sớm hơn) bạn chỉ có thể làm: 'call_user_func_array ('parent :: __ construct', func_get_args());'; –

1

Vâng, việc thực hiện một lớp con có sử dụng các đối số hàm tạo khác nhau từ cha mẹ là khá tồi. Đặc biệt là trong một ngôn ngữ như PHP, nơi nó được hỗ trợ kém.

Tất nhiên, cách chung để chuyển một tập hợp "bất kỳ đối số nào chúng ta có thể muốn" trong PHP là chuyển một đối số bao gồm một mảng các giá trị cấu hình.

+1

Tất nhiên, có bạn có "Magic Mùi "mã nguồn" (http://c2.com/cgi/wiki?MagicContainer). Những gì bạn cần là một đối tượng tham số (http://c2.com/cgi/wiki?ParameterObject). –

+0

Các container ma thuật là tiếc là sử dụng rộng rãi trong các ứng dụng php, tuy nhiên. – soulmerge

1

Kiểm tra các chức năng trên php.net:

func_get_args 
func_num_args 

Ngoài ra, nếu bạn muốn thực hiện một cuộc tranh cãi không bắt buộc , bạn có thể làm điều này:

class ParentClass { 
    function __construct($arg, $arg2="Default Value") { 
     // Initialize a/some variable(s) based on $arg 
    } 
} 
-5
parent::__construct(func_get_args()); 
+0

Hm, không _not_ giữ đối số theo thứ tự (chỉ cần ném chúng vào một mảng trong đối số đầu tiên). – Wrikken

8

nếu bạn nhận được php lồng lỗi giới hạn, hãy thử này:

$args = func_get_args(); 
call_user_func_array(array('parent', '__construct'), $args); 
+0

source: http://nl3.php.net/manual/en/function.call-user-func-array.php # 94993 –

+1

Tác phẩm này và không giới thiệu vòng lặp vô hạn. –

13

Điều này có thể được thực hiện trong PHP> = 5,6 mà không call_user_func_array() bằng ... (splat) operator:

public function __construct() 
{ 
    parent::__construct(...func_get_args()); 
} 
+0

Giải pháp tuyệt vời và cảm ơn bạn đã chỉ ra yêu cầu về php 5.6! – Philipp

+0

Đây là cách ưa thích của tôi :) Đã chuẩn bị đăng bài cho đến khi tôi nhận thấy bạn đã có. – LeonardChallis

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