php
  • class
  • oop
  • 2015-03-18 1 views 1 likes 
    1

    Названного действительно явные, но я собираюсь дать пример:Создать экземпляр класса на основе строки для имени и массива параметров

    class Foo 
    { 
        public function __construct($param1, $param2) { 
         echo 'Class name: ' . __CLASS__ . "\n" . 
          'param1 = ' . $param1 . "\n" . 
          'param2 = ' . $param2; 
        } 
    } 
    
    $class_name = 'Foo'; 
    $params = 
        [ 
        'content1', 
        'content2' 
        ]; 
    

    Имея этот код, как я могу создать экземпляр Foo , используя параметры в $params.

    Я знаю, что могу сделать

    $class = new $class_name($params); 
    

    Но это будет передавать параметры, как один массив, я хотел бы, чтобы расширить параметры. Следующее было бы поведением, которое я бы хотел:

    $class = new $class_name($param[0], $param[1]); 
    

    Спасибо!

    +0

    Другие, чем послать ответ, что-нибудь еще будет _hack_ , Вы либо хотите 2 аргумента, либо хотите массив аргументов. – AbraCadaver

    ответ

    1

    Если у вас есть 5.6:

    $instance = new $class(...$args); 
    

    Если не использовать отражение:

    $reflect = new ReflectionClass($class); 
    $instance = $reflect->newInstanceArgs($args); 
    
    0

    Я смущаюсь этот пост, потому что на самом деле вы должны разработать либо принять массив параметров или отдельных параметров. Однако, вот в хаком способами:

    Использование другой функции:

    public function init($params) { 
        echo 'Class name: ' . __CLASS__ . "\n" . 
         'param1 = ' . $params[0] . "\n" . 
         'param2 = ' . $params[1]; 
    } 
    
    public function __construct($param1, $param2=null) { 
        if(!is_array($param1)) { 
         $param1 = func_get_args(); 
        } 
        call_user_func_array(array($this, 'init'), $param1); 
    } 
    

    Делая все это в __construct:

    public function __construct($param1, $param2=null) { 
        if(!is_array($param1)) { 
         $param1 = func_get_args(); 
        } 
        echo 'Class name: ' . __CLASS__ . "\n" . 
         'param1 = ' . $param1[0] . "\n" . 
         'param2 = ' . $param1[1]; 
    } 
    
    +0

    Благодарим вас за ответ. Мой пример был только ... примером, я фактически создаю класс, который выполняет указанный метод в указанном классе и передает аргументы этому классу. Вот почему я не могу изменить свой * принимающий * класс. – tleb

    Смежные вопросы