#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());