PhpGenerator and PSR output

6 years ago by David Grudl  

Do you need to generate beautifully formatted PHP code? The best way is to use the Nette PhpGenerator library, which has a truly understandable API.

Example:

$class = (new Nette\PhpGenerator\ClassType('Demo'))
	->setFinal()
	->setExtends('ParentClass');

$class->addProperty('id', 1)
	->setVisibility('private')
	->addComment('@var int');

$class->addMethod('getId')
	->addComment('Returns identifier.')
	->setReturnType('int')
	->setBody('return $this->id;');

echo $class;

The output follows the coding standard used in Nette, which is identical to PSR-12 except that it uses tabs instead of spaces for indentation and separates the methods with two blank lines for better readability:

final class Demo extends ParentClass
{
→   /** @var int */
→   private $id = 1;


→   /**
→	* Returns identifier.
→	*/
→   public function getId(): int
→   {
→   →   return $this->id;
→   }
}

PhpGenerator, however, can generate code completely compliant with PSR-12. How to do it?

The expression echo $class is actually an abbreviation that asks the printer Nette\PhpGenerator\Printer and its method printClass($class) to generate code. And the output from this printer conforms to the Nette standard. So it will be enough to use another renderer, specifically PsrPrinter:

$printer = new Nette\PhpGenerator\PsrPrinter;
echo $printer->printClass($class);

Result:

final class Demo extends ParentClass
{
	/** @var int */
	private $id = 1;

	/**
	 * Returns identifier.
	 */
	public function getId(): int
	{
		return $this->id;
	}
}

Using the printer, you can generate code not only for classes, but also for functions (printFunction(), printClosure() and printArrowFunction()), methods (printMethod()), namespaces (printNamespace()), and PHP files (printFile()).

David Grudl Open-source creator and AI specialist who opens doors to the world of artificial intelligence. His projects including Nette and Texy! power websites you visit daily. He contributes to Uměligence and La Trine while hosting Tech Guys. Through AI workshops, he champions technology that genuinely improves people's lives.