PhpGenerator 3.4: přímo na tělo

před 4 lety od David Grudl  

PhpGenerator umí pomocí reflexe vytvořit model třídy nebo funkce podle již existující. Snadno tak lze vytvářet například proxy třídy a podobně. Nejnovější verze 3.4 jde ovšem ještě více na tělo.

Tedy přesněji řečeno, jde na těla metod a funkcí. Jejich vnitřní kód totiž dokáže kopírovat taky. Model tak zachovává nejenom ducha, ale i tělo 🙂

Nejprve si připomeňme způsob, jak lze vytvořit model třídy podle existujícího vzoru:

use Nette\PhpGenerator\ClassType;

$class = ClassType::from(Nette\Application\UI\Control::class);
echo $class;

Vykreslená třída je pak poměrně přesnou kopií originální třídy, včetně phpDoc komentářů atd. Od originálu se liší jen ve dvou věcech:

  1. vynechává traity
  2. chybí těla funkcí

Vynechání trait je důsledkem nedostatečných možností reflexe tříd v PHP, kdy je velmi komplikované zjistit, z jaké traity pochází properties nebo metody. Nicméně podpora se možná v některé z příštích verzí objeví.

Co však přinesla verze 3.4, tak je schopnost načítat třídy a funkce včetně kódu v jejich těle. Udělá se to následovně:

$class = ClassType::withBodiesFrom(Nette\Application\UI\Control::class);

$function = Nette\PhpGenerator\GlobalFunction::withBodyFrom('dump');

Tato funkcionalita využívá knihovnu nikic/php-parser, kterou je potřeba doinstalovat:

composer require nikic/php-parser