Как передать параметр классу, создав класс из строки

#php #class

#php #класс

Вопрос:

Название моего вопроса может быть логически неправильным, потому что я не знаю, как это объяснить 🙂

Вот пример того, что мне нужно. У меня есть мастер-класс и два других класса, которые создает этот мастер-класс. У этих двух классов есть конструкторы с параметрами, и я не знаю, как передать эти параметры.

 class Master {

    function __construct() {
        $this->setup_settings();
        $this->load_classes();
    }

    public function setup_settings() {
        $this->settings['classes'] = array( 'Class_A', 'Class_B' );
    }

    public function load_classes() {
        foreach( $this->settings['classes'] as $class) {
            new $class; //Here are problem!
        }
    }

}

class Class_A {

    function __construct( $setiings ) {
        $this->settings = $settings;
    }

}
class Class_B {

    function __construct( $setiings ) {
        $this->settings = $settings;
    }

}
 

В этом случае у меня ошибка:

 Warning: Missing argument 1 for Class_A ::__construct()
 

Я понимаю, почему это так. Но как передать параметры этому классу таким образом (когда имена классов находятся в массиве)? Когда я создаю строку и передаю ее, у меня возникает ошибка: класс не может быть преобразован в строку.

Комментарии:

1. new $class('some arguments'); ?

2. Да, вы правы. Простой ответ на мой глупый вопрос 🙂 Я думал, что таким образом невозможно передать параметры. Пробовал еще много других… Спасибо

Ответ №1:

Вы забыли аргументы в скобках ($args) .

 $instance = new $objectName($args);
 

ClassA и ClassB у обоих есть конструкторы, которые ожидают вызова параметра $settings . Кстати, вы неправильно написали его там.

Ответ №2:

Вы бы инициализировали объект, как если бы вы написали new Class_A() вместо $class:

 public function load_classes() {
    foreach ($this->settings['classes'] as $class) {
        $obj = new $class($this->settings);
    }
}
 

Ответ №3:

Во-первых, вам нужно исправить имена ваших переменных здесь:

 class Class_A {

    function __construct( $settings // not setiings ) {
        $this->settings = $settings;
    }

}
class Class_B {

    function __construct( $settings // not setiings ) {
        $this->settings = $settings;
    }

}
 

Чтобы передать переменные классам, вы можете сделать:

 public function load_classes() {
        foreach( $this->settings['classes'] as $class) {
            new $class('helloworld'); // or any variable you'd like
        }
    }
 

Однако обратите внимание, что, поскольку вы создаете новый класс, но не присваиваете его какой-либо переменной, вы, вероятно, не сможете увидеть результат.

Попробуйте это вместо этого, если вы хотите увидеть результаты:

 class Master {
    private $result;

    function __construct() {
        $this->setup_settings();
        $result = $this->load_classes();
        $this->result = $result;
    }

    public function getResult()
   {
        return $this->resu<
   }

    public function setup_settings() {
        $this->settings['classes'] = array( 'Class_A', 'Class_B' );
    }

    public function load_classes() {
        foreach( $this->settings['classes'] as $class) {
            $a = new $class('hello');
        $arr[] = $a; // store it in an array
        }

        return $arr; // return the array
    }

}

class Class_A {

    function __construct( $settings ) {
        $this->settings = $settings;
    }

}
class Class_B {

    function __construct( $settings ) {
        $this->settings = $settings;
    }
}

$master = new Master();
var_dump($master->getResult());