2012-08-09 28 views
7

Tôi đã một số mã tạo Ví dụ quảng cáo với một lớp học năng động (tức là từ một biến):Tạo một thể hiện lớp động theo lập trình trong PHP với các đối số biến?

$instance = new $myClass(); 

Kể từ khi các nhà xây dựng có số lập luận khác nhau tùy thuộc vào $myClass giá trị, Làm thế nào để vượt qua một danh sách biến của các đối số vào tuyên bố mới? Có thể không?

+0

phản ánh suy nghĩ – Esailija

Trả lời

10

Bạn cũng có thể kiểm tra các nhà xây dựng trong đoạn code trên:

$constructorRefl = $refl->getMethod("__construct"); 

print_r($constructorRefl->getParameters()); 

/* 
Array 
(
    [0] => ReflectionParameter Object 
     (
      [name] => a 
     ) 

    [1] => ReflectionParameter Object 
     (
      [name] => b 
     ) 

    [2] => ReflectionParameter Object 
     (
      [name] => c 
     ) 

) 
*/ 
1

Tuyến đường dễ nhất sẽ là sử dụng một mảng.

public function __construct($args = array()) 
{ 
    foreach($array as $k => $v) 
    { 
    if(property_exists('myClass', $k)) // where myClass is your class name. 
    { 
     $this->{$k} = $v; 
    } 
    } 
} 
+0

Đúng, nghĩ về điều đó, tôi chỉ tự hỏi liệu có cách tiếp cận khác có thể không. Bên cạnh đó, thủ thuật property_exists() rất tuyệt vời, cảm ơn rất nhiều! – Cranio

0

Tôi không biết tại sao nhưng tôi không thích sử dụng các nhà điều hành mới trong mã của tôi.

Đây là một hàm tĩnh để tạo một thể hiện của một lớp được gọi là tĩnh.

class ClassName { 
    public static function init(){  
     return (new ReflectionClass(get_called_class()))->newInstanceArgs(func_get_args());   
    } 

    public static function initArray($array=[]){  
     return (new ReflectionClass(get_called_class()))->newInstanceArgs($array);   
    } 

    public function __construct($arg1, $arg2, $arg3){ 
     ///construction code 
    } 
} 

Nếu bạn đang sử dụng nó bên trong một không gian tên bạn cần phải thoát khỏi ReflectionClass như vậy: ReflectionClass \ mới ...

Bây giờ bạn có thể gọi phương thức với một số biến của tham số và nó init() sẽ chuyển nó cho hàm tạo và trả về một đối tượng cho bạn.

Cách bình thường sử dụng mới

$obj = new ClassName('arg1', 'arg2', 'arg3'); 
echo $obj->method1()->method2(); 

Inline cách sử dụng mới

echo (new ClassName('arg1', 'arg2', 'arg3'))->method1()->method2(); 

gọi tĩnh nhờ sủ dụng init thay vì mới

echo ClassName::init('arg1', 'arg2', 'arg3')->method1()->method2(); 

gọi tĩnh sử dụng initArray thay vì mới

echo ClassName::initArray(['arg1', 'arg2', 'arg3'])->method1()->method2(); 

Những điều tốt đẹp về các phương pháp tĩnh là bạn có thể chạy một số hoạt động xây dựng trước trong các phương pháp init như xác nhận lập luận constructor.

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