Gerador de código PHP
- Oferece suporte a todos os recursos mais recentes do PHP (como ganchos de propriedade, enums, atributos, etc.)
- Permite modificar facilmente as classes existentes
- Saída compatível com o estilo de codificação PSR-12 / PER
- Biblioteca madura, estável e amplamente utilizada
Instalação
Baixe e instale o pacote usando o Composer:
Para compatibilidade com PHP, consulte a tabela.
Aulas
Vamos começar com um exemplo simples de geração de classe usando o ClassType:
Ele renderá este resultado:
Também podemos utilizar uma impressora para gerar o código, que, ao contrário de echo $class
, poderemos configurar ainda mais:
Podemos acrescentar constantes (classe Constante) e propriedades (classe Propriedade):
Ele gera:
E podemos acrescentar métodos:
O resultado é
Os parâmetros promovidos introduzidos pelo PHP 8.0 podem ser passados para o construtor:
O resultado é
As propriedades e classes só de leitura podem ser marcadas via setReadOnly()
.
Se a propriedade adicionada, constante, método ou parâmetro já existir, ela lança uma exceção.
Os membros podem ser removidos usando removeProperty()
, removeConstant()
, removeMethod()
ou removeParameter()
.
Você também pode adicionar objetos existentes Method
, Property
ou Constant
à
classe:
Você pode clonar métodos, propriedades e constantes existentes com um nome diferente usando cloneWithName()
:
Interface ou Traço
Você pode criar interfaces e traços (classes InterfaceType e TraitType):
Usando traços:
Resultado:
Enums
Você pode criar facilmente os enums que o PHP 8.1 traz (classe EnumType):
Resultado:
Você também pode definir equivalentes escalares para casos a fim de criar um enumero de apoio:
É possível adicionar um comentário ou atributos a cada caso usando addComment()
ou addAttribute()
.
Classe Anônima
Dê null
como o nome e você tem uma classe anônima:
Resultado:
Função Global
O código de funções irá gerar a classe GlobalFunction:
Resultado:
Fechamento
O código de fechamentos gerará fechamento de classe:
Resultado:
Função de Seta
Você também pode imprimir o fechamento como função de seta usando a impressora:
Resultado:
Método e Assinatura da Função
Os métodos são representados pelo método de classe. Você pode definir visibilidade, valor de retorno, adicionar comentários, atributos, etc:
Cada parâmetro é representado por um parâmetro de classe. Novamente, você pode definir todos os bens concebíveis:
Para definir os chamados parâmetros de variação (ou também o splat, spread, elipse, desempacotamento ou operador de três
pontos), use setVariadic()
:
Gera:
Método e Função Corpo
O corpo pode ser passado para o método setBody()
de uma vez ou sequencialmente (linha por linha), ligando
repetidamente para addBody()
:
Resultado
Você pode usar porta-lugares especiais para injetar variáveis de forma prática.
Porta-lugares simples ?
Resultado:
Variadic placeholder ...?
Resultado:
Você também pode usar parâmetros nomeados no PHP 8 usando placeholder ...?:
Porta-lugar de fuga usando barra \?
Resultado:
Impressoras e conformidade PSR
A classe Printer é usada para gerar código PHP:
Ele pode gerar código para todos os outros elementos, oferecendo métodos como printFunction()
,
printNamespace()
, etc.
Além disso, a classe PsrPrinter
está disponível, cuja saída está em conformidade com o estilo de
codificação PSR-2 / PSR-12 / PER:
Precisa ajustar o comportamento de acordo com suas necessidades? Crie sua própria impressora herdando a classe
Printer
. Você pode reconfigurar essas variáveis:
Como e por que exatamente o padrão Printer
e o PsrPrinter
diferem? Por que não há apenas uma
impressora, a PsrPrinter
, no pacote?
O padrão Printer
formata o código como fazemos em toda a Nette. Como a Nette foi criada muito antes da PSR, e
também porque a PSR por muitos anos não forneceu padrões a tempo, mas às vezes até com vários anos de atraso da introdução
de um novo recurso no PHP, isso resultou em algumas pequenas diferenças no padrão de codificação. A maior diferença é apenas o uso de
tabulações em vez de espaços. Sabemos que, ao usar tabulações em nossos projetos, permitimos o ajuste da largura, o que é
essencial para pessoas com deficiências
visuais. Um exemplo de uma diferença menor é o posicionamento da chave em uma linha separada para funções e métodos e
sempre. Para nós, a recomendação do PSR é ilógica e leva a uma diminuição da clareza do
código.
Tipos
Cada tipo ou tipo de união/intersecção pode ser passado como uma corda, você também pode usar constantes pré-definidas para tipos nativos:
O mesmo se aplica ao método setReturnType()
.
Literals
Com Literal
você pode passar código PHP arbitrário para, por exemplo, propriedade padrão ou valores de
parâmetros, etc:
Resultado:
Você também pode passar os parâmetros para Literal
e formatá-lo em código PHP válido usando marcadores de lugar especiais:
O literal que representa a criação de um novo objeto é facilmente gerado pelo método new
:
Atributos
Você pode adicionar atributos PHP 8 a todas as classes, métodos, propriedades, constantes, casos de enumeração, funções, fechamentos e parâmetros. Os literais também podem ser usados como valores de parâmetros.
Resultado:
Ganchos de propriedade
Você também pode definir ganchos de propriedade (representados pela classe PropertyHook) para operações get e set, um recurso introduzido no PHP 8.4:
Isso gera:
As propriedades e os ganchos de propriedade podem ser abstratos ou finais:
Visibilidade assimétrica
O PHP 8.4 introduz a visibilidade assimétrica para propriedades. Você pode definir diferentes níveis de acesso para leitura e gravação.
A visibilidade pode ser definida usando o método setVisibility()
com dois parâmetros ou usando
setPublic()
, setProtected()
, ou setPrivate()
com o parâmetro mode
que
especifica se a visibilidade se aplica à obtenção ou à definição da propriedade. O modo padrão é 'get'
.
Isso gera:
Namespace
Classes, traços, interfaces e enumeros (doravante classes) podem ser agrupados em namespaces (PhpNamespace):
Se a classe já existe, ela lança uma exceção.
Você pode definir as declarações de uso:
Para simplificar uma classe, função ou nome constante totalmente qualificado de acordo com os pseudônimos definidos, utilize
o método simplifyName
:
Por outro lado, você pode converter uma classe, função ou nome constante simplificado para uma classe totalmente qualificada
usando o método resolveName
:
Resolução de Nomes de Classe
Quando uma classe faz parte de um namespace, ela é renderizada de forma um pouco diferente: todos os tipos (por exemplo, dicas de tipo, tipos de retorno, nome da classe pai, interfaces implementadas, características usadas e atributos) são automaticamente resolvidos (a menos que você desative essa opção, veja abaixo). Isso significa que você deve usar nomes de classe totalmente qualificados nas definições, e eles serão substituídos por aliases (com base em cláusulas de uso) ou nomes totalmente qualificados no código resultante:
Resultado:
A auto-resolução pode ser desligada desta maneira:
Arquivos PHP
As classes, funções e namespaces podem ser agrupadas em arquivos PHP representados pela classe PhpFile:
Resultado:
Observação: Nenhum código adicional pode ser adicionado aos arquivos fora das funções e classes.
Gerando de acordo com os já existentes
Além de poder modelar classes e funções usando a API descrita acima, você também pode tê-las geradas automaticamente usando as já existentes:
A função e o método estão vazios por padrão. Se você quiser carregá-los também, use desta forma (requer
nikic/php-parser
para ser instalado):
Carregando do arquivo PHP
Você também pode carregar funções, classes, interfaces e enumeros diretamente de uma seqüência de código PHP. Por
exemplo, criamos o objeto ClassType
desta forma:
Ao carregar classes do código PHP, os comentários de linha única fora dos corpos do método são ignorados (por exemplo, para propriedades, etc.) porque esta biblioteca não tem uma API para trabalhar com eles.
Você também pode carregar o arquivo PHP inteiro diretamente, que pode conter qualquer número de classes, funções ou até mesmo vários espaços de nomes:
O comentário inicial do arquivo e a declaração strict_types
também são carregados. Por outro lado, todos os
outros códigos globais são ignorados.
Isto requer que nikic/php-parser
seja instalado.
Se você precisar manipular o código global em arquivos ou declarações individuais em corpos de métodos, é
melhor usar a biblioteca nikic/php-parser
diretamente.
Manipulador de classe
A classe ClassManipulator fornece ferramentas para a manipulação de classes.
O método inheritMethod()
copia um método de uma classe pai ou de uma interface implementada em sua classe. Isso
permite que você substitua o método ou estenda sua assinatura:
O método inheritProperty()
copia uma propriedade de uma classe principal para a sua classe. Isso é útil quando
você deseja ter a mesma propriedade em sua classe, mas possivelmente com um valor padrão diferente:
O método implement()
implementa automaticamente todos os métodos e propriedades da interface ou classe abstrata
fornecida:
Variáveis Dumper
O Dumper retorna uma parábola de representação de uma variável em PHP. Fornece uma saída melhor e mais clara que a
função nativa var_export()
.
Tabela de Compatibilidade
O PhpGenerator 4.1 é compatível com o PHP 8.0 a 8.4.