Permalink
Browse files

php-generator: updated

  • Loading branch information...
dg committed Aug 9, 2018
1 parent 9b18768 commit 8a4b7aca3a6389b38cf5589e4c48d7ef770c7d56
Showing with 131 additions and 8 deletions.
  1. +66 −4 cs/php-generator.texy
  2. +65 −4 en/php-generator.texy
@@ -88,6 +88,8 @@ Výsledkem je:
}
\--

Pokud vlastnost, konstanta, metoda nebo parametr již existuje, bude přepsán.

PHP Generator podporuje všechny nové vlastnosti PHP 7.2:

/--php
@@ -329,19 +331,41 @@ function foo($a)
Jmenný prostor
--------------

Jmenné prostory ([PhpNamespace |api:Nette\PhpGenerator\PhpNamespace]) mohou kromě tříd, rozhraní nebo trait obsahovat i deklarace `use`. Ty se uplatní při generování kódu, takže v definicích používejte plné názvy tříd a ve výsledném kód budou nahrazeny za aliasy nebo plně kvalifikované názvy.
Třídy, vlastnosti a rozhraní (dále jen třídy) lze seskupit do jmenných prostorů reprezentovaných třídou ([PhpNamespace |api:Nette\PhpGenerator\PhpNamespace]):

/--php
$namespace = new Nette\PhpGenerator\PhpNamespace('Foo');

$class = $namespace->addClass('Task');
$interface = $namespace->addInterface('Countable');
$trait = $namespace->addTrait('NameAware');
\--

Pokud třída již existuje, bude přepsána.

Můžete definovat klauzule use:

/--php
$namespace->addUse('Http\Request'); // use Http\Request;
$namespace->addUse('Http\Request', 'HttpReq'); // use Http\Request as HttpReq;
\--

**DŮLEŽITÁ POZNÁMKA:** když je třída součástí jmenného prostoru, je vykreslena mírně odlišně: všechny typy (např. typehinty, návratové typy, název rodičovské třídy,
implementovaná rozhraní a použité traity) *automaticky překládá*. To znamená, že **musíte používat v definice plné názvy tříd**
a ty budou nahrazeny aliasy (podle klauzulí use) nebo plně kvalifikovanými jmény ve výsledném kódu:

/--php
$namespace = new Nette\PhpGenerator\PhpNamespace('Foo');
$namespace->addUse('Bar\AliasedClass');

$class = $namespace->addClass('Demo');
$class->addImplement('Foo\A') // vyhodnotí se jako A
->addTrait('Bar\AliasedClass'); // vyhodnotí se jako AliasedClass
$class->addImplement('Foo\A') // bude přeložen na A
->addTrait('Bar\AliasedClass'); // bude přeložen na AliasedClass

$method = $class->addMethod('method');
$method->addComment('@return ' . $namespace->unresolveName('Foo\D')); // v komentářích překládáme manuálně
$method->addParameter('arg')
->setTypeHint('Bar\OtherClass'); // vyhodnotí se jako \Bar\OtherClass
->setTypeHint('Bar\OtherClass'); // bude přeložen na \Bar\OtherClass

echo $namespace;
\--
@@ -357,12 +381,50 @@ class Demo implements A
{
use AliasedClass;

/**
* @return D
*/
public function method(\Bar\OtherClass $arg)
{
}
}
\--

PHP soubory
-----------

Soubory PHP mohou obsahovat více tříd, jmenných prostorů a komentářů:

/--php
$file = new Nette\PhpGenerator\PhpFile;
$file->addComment('This file is auto-generated.');

$namespace = $file->addNamespace('Foo');
$class = $namespace->addClass('A');
$class->addMethod('hello');

echo $file;
\--

Výsledek:

/--php
<?php

/**
* This file is auto-generated.
*/

namespace Foo;

class A
{
public function hello()
{
}
}
\--

Generování podle vzorů
----------------------

@@ -88,6 +88,8 @@ It results in:
}
\--

If the property, constant, method or parameter already exist, it will be overwritten.

PHP Generator supports all new PHP 7.2 features:

/--php
@@ -329,19 +331,41 @@ function foo($a)
Namespace
---------

Namespaces ([PhpNamespace |api:Nette\PhpGenerator\PhpNamespace]) may include `use` statements in addition to classes, interfaces, or traits. These statements are used when generating code, so use full class names in the definitions and they will be replace with aliases or fully qualified names in the resulting code.
Classes, traits and interfaces (hereinafter classes) can be grouped into namespaces:

/--php
$namespace = new Nette\PhpGenerator\PhpNamespace('Foo');

$class = $namespace->addClass('Task');
$interface = $namespace->addInterface('Countable');
$trait = $namespace->addTrait('NameAware');
\--

If the class already exists, it will be overwritten.

You can define use-statements:

/--php
$namespace->addUse('Http\Request'); // use Http\Request;
$namespace->addUse('Http\Request', 'HttpReq'); // use Http\Request as HttpReq;
\--

**IMPORTANT NOTE:** when the class is part of the namespace, it is rendered slightly differently: all types (ie. type hints, return types, parent class name,
implemented interfaces and used traits) are automatically *resolved*. It means that you have to **use full class names** in definitions
and they will be replaced with aliases (according to the use-statements) or fully qualified names in the resulting code:

/--php
$namespace = new Nette\PhpGenerator\PhpNamespace('Foo');
$namespace->addUse('Bar\AliasedClass');

$class = $namespace->addClass('Demo');
$class->addImplement('Foo\A') // resolves to A
->addTrait('Bar\AliasedClass'); // resolves to AliasedClass
$class->addImplement('Foo\A') // it will resolve to A
->addTrait('Bar\AliasedClass'); // it will resolve to AliasedClass

$method = $class->addMethod('method');
$method->addComment('@return ' . $namespace->unresolveName('Foo\D')); // in comments resolve manually
$method->addParameter('arg')
->setTypeHint('Bar\OtherClass'); // resolves to \Bar\OtherClass
->setTypeHint('Bar\OtherClass'); // it will resolve to \Bar\OtherClass

echo $namespace;
\--
@@ -357,12 +381,49 @@ class Demo implements A
{
use AliasedClass;

/**
* @return D
*/
public function method(\Bar\OtherClass $arg)
{
}
}
\--

PHP Files
---------

PHP files can contains multiple classes, namespaces and comments:

/--php
$file = new Nette\PhpGenerator\PhpFile;
$file->addComment('This file is auto-generated.');

$namespace = $file->addNamespace('Foo');
$class = $namespace->addClass('A');
$class->addMethod('hello');

echo $file;
\--

Result:

/--php
<?php

/**
* This file is auto-generated.
*/

namespace Foo;

class A
{
public function hello()
{
}
}
\--

Generate using Reflection
-------------------------

0 comments on commit 8a4b7ac

Please sign in to comment.