Package Home

Zend Framework 2 Documentation (Manual)

PHK Home

File: /_sources/modules/zend.code.generator.introduction.txt

Size:3869
Storage flags:no_autoload,compress/gzip (32%)

.. _zend.code.generator.introduction:

Introduction
============

``Zend\Code\Generator`` provides facilities to generate arbitrary code using an object-oriented interface, both to
create new code as well as to update existing code. While the current implementation is limited to generating *PHP*
code, you can easily extend the base class in order to provide code generation for other tasks: JavaScript,
configuration files, apache vhosts, etc.

.. _zend.code.generator.introduction.theory:

Theory of Operation
-------------------

In the most typical use case, you will simply instantiate a code generator class and either pass it the appropriate
configuration or configure it after instantiation. To generate the code, you will simply echo the object or call
its ``generate()`` method.

.. code-block:: php
   :linenos:

   // Passing configuration to the constructor:
   $file = new Zend\Code\Generator\FileGenerator(array(
       'classes' => array(
           new Zend\Code\Generator\ClassGenerator(
               'World',  // name
               null,     // namespace
               null,     // flags
               null,     // extends
               array(),  // interfaces
               array(),  // properties
               array(
                   new Zend\Code\Generator\MethodGenerator(
                       'hello',                  // name
                       array(),                  // parameters
                       'public',                 // visibility
                       'echo \'Hello world!\';'  // body
                   ),
               )
           ),
       ),
   ));

   // Render the generated file
   echo $file->generate();

   // or write it to a file:
   file_put_contents('World.php', $file->generate());

   // OR

   // Configuring after instantiation
   $method = new Zend\Code\Generator\MethodGenerator();
   $method->setName('hello')
          ->setBody('echo \'Hello world!\';');

   $class = new Zend\Code\Generator\ClassGenerator();
   $class->setName('World')
         ->addMethodFromGenerator($method);

   $file = new Zend\Code\Generator\FileGenerator();
   $file->setClass($class);

   // Render the generated file
   echo $file->generate();

   // or write it to a file:
   file_put_contents('World.php', $file->generate());

Both of the above samples will render the same result:

.. code-block:: php
   :linenos:

   <?php

   class World
   {

       public function hello()
       {
           echo 'Hello world!';
       }

   }

Another common use case is to update existing code -- for instance, to add a method to a class. In such a case, you
must first inspect the existing code using reflection, and then add your new method. ``Zend\Code\Generator`` makes
this trivially simple, by leveraging :ref:`Zend\Code\Reflection <zend.code.reflection>`.

As an example, let's say we've saved the above to the file ``World.php``, and have already included it. We could
then do the following:

.. code-block:: php
   :linenos:

   $class = Zend\Code\Generator\ClassGenerator::fromReflection(
       new Zend\Code\Reflection\ClassReflection('World')
   );

   $method = new Zend\Code\Generator\MethodGenerator();
   $method->setName('mrMcFeeley')
          ->setBody('echo \'Hello, Mr. McFeeley!\';');
   $class->addMethodFromGenerator($method);

   $file = new Zend\Code\Generator\FileGenerator();
   $file->setClass($class);

   // Render the generated file
   echo $file->generate();

   // Or, better yet, write it back to the original file:
   file_put_contents('World.php', $file->generate());

The resulting class file will now look like this:

.. code-block:: php
   :linenos:

   <?php

   class World
   {

       public function hello()
       {
           echo 'Hello world!';
       }

       public function mrMcFeeley()
       {
           echo 'Hellow Mr. McFeeley!';
       }

   }



For more information about the PHK package format: http://phk.tekwire.net