@Vladimir-Hetman

Создание классов в цикле?

Каким образом создать классы в цикле, чтобы не дублировать код.
По идее должно получится 4 класса с одинаковыми метода и свойствами, но разными именами.

То есть, в цикле должно быть так:
class home { }
class red { }
class sky { }
class black { }

Моя кривая попытка сделать это:
$names =["home", "red", "sky", "black"];

for($a = 0;  $a < count($names); $a++){

  class $names[$a]{        
    function __construct(public $name, public $age){}	 
   
    function show_values(){
    echo "$this->name <br> $this->age <br><br>"; 	 	 
    }	 	 	        
  }
}
  • Вопрос задан
  • 325 просмотров
Решения вопроса 2
@humoured
Вы всё на свете найдёте в коробке с карандашами
Подобную ерунду можно делать с помощью eval(), но гораздо лучше разобраться с задачей и решить её нормальным способом.

В качестве попытки угадать задачу, могу предложить функцию class_alias.
Ответ написан
@Vitsliputsli
Код простейшего генератора:
$className = 'Home';
$classFileName = __DIR__ . '/home.php';

$template = <<<'EOD'
<?php
  class <<CLASS_NAME>> {        
    function __construct(public $name, public $age){}	 
   
    function show_values(){
    echo "$this->name <br> $this->age <br><br>"; 	 	 
    }	 	 	        
  }
EOD;

$classCode = str_replace('<<CLASS_NAME>>', $className, $template);
file_put_contents($classFileName, $classCode);

Хотя пока неизвестна истинная задача, может нужно не это.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@rPman
humoured исчерпывающе ответил на это вопрос.
Автор, тебе лучше сформулировать свою задачу а не пытаться искать способ реализации предполагаемого тобой (возможно неверное) решение.

Если есть задача динамического формирования кода (например нужно 100500 классов, отличающихся незначительно но if-ы по коду заметно замедляют его работу и усложняют чтение), особенно крупного, настоятельно рекомендую генерировать файлы и делать их include (имя файла можешь делать по хешу содержимого, если вариантов содержимого много, или по именам атрибутов, определяющих изменения). Так как include отлаживать удобнее, сообщения об ошибках будут понятны и легко проверяемые, а так же сервер такие файлы кеширует и при наличии ускорителей - еще и оптимизирует, eval же компилируется каждый раз при вызове.
Ответ написан
AgentSmith
@AgentSmith
Это мой правильный ответ на твой вопрос
В нормальных языках программирования создать экземпляр любого класса можно с помощью Reflection.
в PHP это тоже возможно:
https://www.php.net/manual/en/reflectionclass.newi...

https://stackoverflow.com/questions/1203625/dynami...
Ответ написан
@pantsarny
Создай базовый класс
Создай 4 класса наследующизся от базового
Ответ написан
@mrStrike
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы