2011-12-16 33 views
8

Làm thế nào tôi có thể gọi một constructor đối tượng đi qua một loạt các thông số để có:Đi qua mảng các tham số cho đối tượng constructor

$array = array($param1, $param2); 

tôi sẽ có thể gọi

$abc = new Abc($param1, $param2); 

xem xét mà tôi không biết có bao nhiêu tham số có thể được đặt trong mảng. Có điều gì đó giống như call_object('Abc', array($param1, $param2)) không?

+3

tại sao không chỉ truyền mảng? 'Abc mới (mảng $)'? – ManseUK

+2

Có lẽ Jeff không viết/kiểm soát các lớp đó ... – VolkerK

+0

@JeffPigarelli có lẽ nếu bạn đã đặt câu hỏi của mình tốt hơn hoặc đưa ra nhiều ví dụ hơn, bạn sẽ không có quá nhiều câu trả lời "không chính xác" ... – ManseUK

Trả lời

2

Giả sử bạn có thể sửa đổi các hàm tạo của đối tượng của bạn, một mẫu như thế này không phải là không phổ biến, nhưng yêu cầu mảng kết hợp như đầu vào:

class Abc { 
    public $prop1; 
    public $prop2; 

    public function __construct($params) { 
    if (is_array($params)) { 
     $this->prop1 = isset($params['prop1']) ? $params['prop1'] : NULL; 
     $this->prop2 = isset($params['prop2']) ? $params['prop2'] : NULL; 
    } 
    } 
} 

// Created as: 
$params = array('prop1'=>12354, 'prop2'=>54321); 
$abc = new Abc($params); 
+0

Điều này đã thắng ' t làm việc nếu bạn muốn sử dụng một hàm tạo đã gõ. – digitaldonkey

4

Lý tưởng là xác định hàm tạo của bạn để lấy một arra y.

Nếu bạn không thể làm điều đó, có một giải pháp có thể xảy ra. Nếu tất cả tham số cho các nhà xây dựng là không bắt buộc, bạn có thể làm một cái gì đó như thế này với call_user_func_array:

$obj = new Abc; 
call_user_func_array(array($obj, '__construct'), $array); 

Điều này dẫn đến constructor của bạn đang chạy hai lần: một lần không có tham số, và một lần với những người trong mảng. Bạn sẽ phải quyết định xem điều này có phù hợp với ứng dụng của bạn hay không.

+0

Uhm! Nếu constructor Abc của bạn cần thông số thì sao? Lỗi nghiêm trọng PHP: Không bắt buộc ArgumentCountError: Quá ít đối số để hàm Abc :: __ construct(), 0 được thông qua. Vì vậy, bạn không thể instanziate đối tượng và sau đó gọi các nhà xây dựng. Tôi đang thiếu một cái gì đó? – guido

+0

@guido "Nếu * tất cả * tham số cho hàm tạo là tùy chọn". Đây là thực hành không tốt: đó là một cách giải quyết. – lonesomeday

10

Làm thế nào để sử dụng ... (toán tử ghép)?

$array = array($param1, $param2); 
$abc = new Abc(...$array); // equal to: new Abc($param1, $param2) 

PHP 5.6 là bắt buộc.

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