|
|
@@ -0,0 +1,1204 @@
|
|
|
+<?xml version="1.0" encoding="UTF-8"?>
|
|
|
+<!-- EN-Revision: 24249 -->
|
|
|
+<!-- Reviewed: no -->
|
|
|
+<appendix id="coding-standard">
|
|
|
+ <title>Padrão de Codificação do Zend Framework para PHP</title>
|
|
|
+
|
|
|
+ <sect1 id="coding-standard.overview">
|
|
|
+ <title>Visão geral</title>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.overview.scope">
|
|
|
+ <title>Escopo</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Este documento fornece instruções para formatação e documentação de código a
|
|
|
+ indivíduos e times que contribuem com o Zend Framework. Muitos desenvolvedores que
|
|
|
+ utilizam o Zend Framework acham que estes padrões são igualmente importantes para
|
|
|
+ que seu estilo de codificação permaneça consistente com todo o código do Framework.
|
|
|
+ Vale também notar que é necessário esforço significativo para especificar padrões de
|
|
|
+ codificação por completo.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <note>
|
|
|
+ <para>
|
|
|
+ Por vezes, desenvolvedores consideram o estabelecimento de um padrão mais
|
|
|
+ importante do que o padrão sugere de verdade ao nível mais detalhado de design.
|
|
|
+ As instruções nos padrões de codificação do Zend Framework absorvem práticas que
|
|
|
+ funcionaram bem no projeto do Framework. Você pode alterar tais padrões ou
|
|
|
+ usá-los "as is" de acordo com os termos de nossa <ulink
|
|
|
+ url="http://framework.zend.com/license">licença</ulink>.
|
|
|
+ </para>
|
|
|
+ </note>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Os tópicos abordados nos padrões de codificação do Zend Framework incluem:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <itemizedlist>
|
|
|
+ <listitem>
|
|
|
+ <para>Formatação de arquivos <acronym>PHP</acronym></para>
|
|
|
+ </listitem>
|
|
|
+
|
|
|
+ <listitem>
|
|
|
+ <para>Convenções de nomenclatura</para>
|
|
|
+ </listitem>
|
|
|
+
|
|
|
+ <listitem>
|
|
|
+ <para>Estilo de codificação</para>
|
|
|
+ </listitem>
|
|
|
+
|
|
|
+ <listitem>
|
|
|
+ <para>Documentação em linha de código</para>
|
|
|
+ </listitem>
|
|
|
+ </itemizedlist>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.overview.goals">
|
|
|
+ <title>Objetivos</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Padrões de codificação são importantes em qualquer projeto de desenvolvimento, mas
|
|
|
+ são particularmente importantes quando muitos desenvolvedores estão trabalhando no
|
|
|
+ mesmo projeto. Eles ajudam a garantir que o código possua alta qualidade, poucos
|
|
|
+ bugs e possam ser facilmente mantidos.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+ </sect1>
|
|
|
+
|
|
|
+ <sect1 id="coding-standard.php-file-formatting">
|
|
|
+ <title>Formatação de Arquivos PHP</title>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.php-file-formatting.general">
|
|
|
+ <title>Geral</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Para arquivos que contenham somente código <acronym>PHP</acronym>, a tag de
|
|
|
+ fechamento ("?>") nunca é permitida. Ela não é exigida pelo <acronym>PHP</acronym> e
|
|
|
+ omiti-la previne a injeção acidental de espaços em branco desnecessários na
|
|
|
+ resposta.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <note>
|
|
|
+ <para>
|
|
|
+ <emphasis>Importante</emphasis>: A inclusão de dados binários arbitrários, como
|
|
|
+ permitido pela função <methodname>__HALT_COMPILER()</methodname>, é proibida a
|
|
|
+ partir de arquivos <acronym>PHP</acronym> no projeto Zend Framework ou de
|
|
|
+ arquivos derivados deles. O uso deste recurso é permitido somente para alguns
|
|
|
+ scripts de instalação.
|
|
|
+ </para>
|
|
|
+ </note>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.php-file-formatting.indentation">
|
|
|
+ <title>Indentação</title>
|
|
|
+
|
|
|
+ <para>A indentação deve consistir de 4 espaços. Tabulações não são permitidas.</para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.php-file-formatting.max-line-length">
|
|
|
+ <title>Comprimento máximo de linha</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ O comprimento desejável das linhas é 80 caracteres. Isto significa que
|
|
|
+ desenvolvedores do Zend Framework devem se esforçar para manter cada linha de seus
|
|
|
+ códigos com menos que 80 caracteres onde possível e prático. Entretanto, linhas
|
|
|
+ maiores são aceitáveis em algumas circunstâncias. O comprimento máximo de qualquer
|
|
|
+ linha de código <acronym>PHP</acronym> é 120 caracteres.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.php-file-formatting.line-termination">
|
|
|
+ <title>Quebra de linha</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Quebras de linha seguem a convenção de arquivos de texto Unix. As linhas devem
|
|
|
+ terminar com um único caractere de quebra -- linefeed (LF). Caracteres de quebra são
|
|
|
+ representados como ordinal 10 ou hexadecimal 0x0A.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Nota: Não use retornos -- carriage returns (CR) -- como é a convenção em arquivos
|
|
|
+ dos sistemas Apple (0x0D) ou a combinação de retorno e quebra
|
|
|
+ (<acronym>CRLF</acronym>), como é o padrão dos sistemas Windows (0x0D, 0x0A).
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+ </sect1>
|
|
|
+
|
|
|
+ <sect1 id="coding-standard.naming-conventions">
|
|
|
+ <title>Convenções de Nomenclatura</title>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.naming-conventions.classes">
|
|
|
+ <title>Classes</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ O Zend Framework utiliza um padrão de nomes de classes de forma que os nomes das
|
|
|
+ classes mapeiam diretamente os diretórios onde estão armazenadas. O diretório raiz
|
|
|
+ da biblioteca padrão do Zend Framework é o diretório "Zend/" e o diretório raiz da
|
|
|
+ biblioteca de extras é "ZendX/". Todas as classes do Zend Framework são armazenadas
|
|
|
+ hierarquicamente sob tais diretórios.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Nomes de classes devem conter somente caracteres alfanuméricos. Números são
|
|
|
+ permitidos em nomes de classes mas são desencorajados na maioria dos casos.
|
|
|
+ Underscores são permitidos somente no lugar de separador de diretórios. O arquivo
|
|
|
+ "<filename>Zend/Db/Table.php</filename>", por exemplo, deve mapear a classe de nome
|
|
|
+ "<classname>Zend_Db_Table</classname>".
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Se um nome de classe é composto de mais de uma palavra, a primeira letra de cada
|
|
|
+ nova palavra deve ser maiúscula. Letras maiúsculas em sequência não são permitidas.
|
|
|
+ A classe "Zend_PDF", por exemplo, não é permitida, enquanto
|
|
|
+ "<classname>Zend_Pdf</classname>" é.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Estas convenções definem um mecanismo de pseudonamespace para o Framework. O Zend
|
|
|
+ Framework irá adotar o recurso de namespace do <acronym>PHP</acronym> assim que ele
|
|
|
+ se tornar disponível e prático para nossos desenvolvedores os utilizarem em suas
|
|
|
+ aplicações.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Exemplos desta convenção de nomenclatura podem ser vistos em nomes de classes nas
|
|
|
+ bibliotecas padrão e de extras.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <note>
|
|
|
+ <para>
|
|
|
+ <emphasis>Importante</emphasis>: Códigos que devem ser disponibilizados junto às
|
|
|
+ bibliotecas do Zend Framework mas não são parte das bibliotecas padrão ou de
|
|
|
+ extras (por exemplo, código de aplicação ou bibliotecas que não são distribuídas
|
|
|
+ pela Zend) nunca devem iniciar com "Zend_" ou "ZendX_".
|
|
|
+ </para>
|
|
|
+ </note>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.naming-conventions.abstracts">
|
|
|
+ <title>Classes abstratas</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Em geral, classes abstratas seguem as mesmas convenções de <link
|
|
|
+ linkend="coding-standard.naming-conventions.classes">classes</link>, com uma
|
|
|
+ regra adicional: nomes de classes abstratas devem terminar com o termo "Abstract",
|
|
|
+ que não pode ser precedido por um underscore. Por exemplo,
|
|
|
+ <classname>Zend_Controller_Plugin_Abstract</classname> é considerado um nome
|
|
|
+ inválido, mas <classname>Zend_Controller_PluginAbstract</classname> ou
|
|
|
+ <classname>Zend_Controller_Plugin_PluginAbstract</classname> seriam nomes válidos.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <note>
|
|
|
+ <para>
|
|
|
+ Esta convenção de codificação é nova na versão 1.9.0 do Zend Framework. Classes
|
|
|
+ de datas anteriores a esta versão podem não seguir esta regra mas serão
|
|
|
+ renomeadas no futuro a fim de obedecê-la.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A razão de tal mudança é o uso de namespace. Como pretendemos que o Zend
|
|
|
+ Framework 2.0 utilize <acronym>PHP</acronym> 5.3, utilizaremos namespaces. A
|
|
|
+ maneira mais fácil de automatizar a conversão para namespaces é simplemente
|
|
|
+ converter underscores para o separador de namespace -- mas sob as antigas
|
|
|
+ convenções de nomenclatura isto deixa o nome da classe como somente "Abstract"
|
|
|
+ ou "Interface" -- as quais são palavras-chave reservadas em
|
|
|
+ <acronym>PHP</acronym>. Se prefixarmos o nome do (sub)componente ao nome da
|
|
|
+ classe, podemos evitar tais problemas.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Para ilustrar a situação, considere converter a classe
|
|
|
+ <classname>Zend_Controller_Request_Abstract</classname> para utilizar
|
|
|
+ namespaces:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+namespace Zend\Controller\Request;
|
|
|
+
|
|
|
+abstract class Abstract
|
|
|
+{
|
|
|
+ // ...
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Claramente isto não irá funcionar. Sob as novas convenções de nomenclatura,
|
|
|
+ entretanto, isso se tornaria:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+namespace Zend\Controller\Request;
|
|
|
+
|
|
|
+abstract class RequestAbstract
|
|
|
+{
|
|
|
+ // ...
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Ainda retemos a semântica e a separação de namespace enquanto omitimos os
|
|
|
+ problemas com palavras-chave; ao mesmo tempo, a classe abstrata é melhor
|
|
|
+ descrita.
|
|
|
+ </para>
|
|
|
+ </note>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.naming-conventions.interfaces">
|
|
|
+ <title>Interfaces</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Em geral, interfaces seguem as mesmas convenções de <link
|
|
|
+ linkend="coding-standard.naming-conventions.classes">classes</link>, com uma
|
|
|
+ regra adicional: nomes de interface podem opcionalmente terminar com o termo
|
|
|
+ "Interface", que não pode ser precedido por um underscore. Por exemplo,
|
|
|
+ <classname>Zend_Controller_Plugin_Interface</classname> é considerado um nome
|
|
|
+ inválido, mas <classname>Zend_Controller_PluginInterface</classname> ou
|
|
|
+ <classname>Zend_Controller_Plugin_PluginInterface</classname> seriam nomes válidos.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Embora esta regra não seja obrigatória, ela é fortemente recomendada, já que provê
|
|
|
+ uma boa pista visual aos desenvolvedores sobre quais arquivos contém interfaces em
|
|
|
+ vez de classes.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <note>
|
|
|
+ <para>
|
|
|
+ Esta convenção de nomenclatura é nova na versão 1.9.0 do Zend Framework. Classes
|
|
|
+ de datas anteriores a esta versão podem não seguir esta regra, mas serão
|
|
|
+ renomeadas no futuro a fim de obedecê-la. Veja <link
|
|
|
+ linkend="coding-standard.naming-conventions.abstracts">a seção
|
|
|
+ anterior</link> para informações sobre a razão da mudança.
|
|
|
+ </para>
|
|
|
+ </note>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.naming-conventions.filenames">
|
|
|
+ <title>Nomes de arquivos</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Para todos os outros arquivos, somente caracteres alfanuméricos, underscores e
|
|
|
+ hifens são permitidos. Espaços são estritamente proibidos.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Qualquer arquivo que contenha código <acronym>PHP</acronym> deve terminar com a
|
|
|
+ extensão "<filename>.php</filename>", com a notável exceção de scripts de view. Os
|
|
|
+ exemplos a seguir mostram nomes de arquivo aceitáveis para classes do Zend
|
|
|
+ Framework:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+Zend/Db.php
|
|
|
+
|
|
|
+Zend/Controller/Front.php
|
|
|
+
|
|
|
+Zend/View/Helper/FormRadio.php
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Nomes de arquivos devem mapear nomes de classes, como descrito acima.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.naming-conventions.functions-and-methods">
|
|
|
+ <title>Funções e métodos</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Nomes de funções devem conter somente caracteres alfanuméricos, não sendo
|
|
|
+ underscores permitidos. Números são permitidos mas desencorajados na maioria dos
|
|
|
+ casos.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Nomes de funções devem sempre começar com letra minúscula e, quando consistir de
|
|
|
+ mais de uma palavra, a primeira letra de cada palavra deve ser maiúscula. Esta
|
|
|
+ formatação é comumente chamada de "camelCase".
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A utilização de verbos é geralmente encorajada, devendo os nomes de funções ser tão
|
|
|
+ verbais quanto prático a fim de descrever de forma clara seu propósito e
|
|
|
+ comportamento.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Estes são exemplos de nomes aceitáveis de funções:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+filterInput()
|
|
|
+
|
|
|
+getElementById()
|
|
|
+
|
|
|
+widgetFactory()
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Para programação orientada a objetos, acessores de variáveis estáticas ou de
|
|
|
+ instância devem sempre ser prefixados com "get" ou "set". Ao implementar padrões de
|
|
|
+ design (“design patterns”), como o singleton ou o factory, o nome do método deve
|
|
|
+ conter o nome do padrão onde prático a fim de descrever claramente seu
|
|
|
+ comportamento.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Para métodos de objetos que são declarados com o modificador "private" ou
|
|
|
+ "protected", o primeiro caractere do nome do método deve ser um underscore. Esta é a
|
|
|
+ única aplicação aceitável de um underscore em um nome de método. Métodos declarados
|
|
|
+ como "public" nunca devem conter um underscore.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Funções em escopo global (também chamadas de "funções flutuantes") são permitidas
|
|
|
+ mas desencorajadas na maioria dos casos. Considere encapsular estas funções em uma
|
|
|
+ classe estática.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.naming-conventions.variables">
|
|
|
+ <title>Variáveis</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Nomes de variáveis devem conter somente caracteres alfanuméricos, não sendo
|
|
|
+ underscores permitidos. Números são permitidos mas são desencorajados na maioria dos
|
|
|
+ casos.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Para variáveis de instância declaradas com o modificador "private" ou "protected", o
|
|
|
+ primeiro caractere do nome da variável deve ser um underscore. Esta é a única
|
|
|
+ aplicação aceitável de um underscore em nome de variável. Variáveis-membras
|
|
|
+ declaradas com "public" nunca devem começar com um underscore.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Assim como nomes de funções (veja seção 3.3), nomes de variáveis devem sempre
|
|
|
+ começar com uma letra minúscula e seguir a convenção "camelCase".
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A utilização de verbos é encorajada, ou seja, variáveis devem sempre ser tão verbais
|
|
|
+ quanto prático para descrever os dados que o desenvolvedor pretende armazenar nelas.
|
|
|
+ Nomes concisos de variáveis como "<varname>$i</varname>" e "<varname>$n</varname>"
|
|
|
+ são desencorajados para todos os contextos de laço, exceto os menores. Se um loop
|
|
|
+ contém mais de 20 linhas de código então as variáveis de índice devem ter nomes mais
|
|
|
+ descritivos.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.naming-conventions.constants">
|
|
|
+ <title>Constantes</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Constantes devem conter tanto caracteres alfanuméricos quanto underscores. Números
|
|
|
+ são permitidos.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Todas as letras usadas em um nome de constante devem ser maiúsculas, enquanto todas
|
|
|
+ as palavras devem ser separadas por underscores.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Por exemplo, <constant>EMBED_SUPPRESS_EMBED_EXCEPTION</constant> é permitido
|
|
|
+ enquanto <constant>EMBED_SUPPRESSEMBEDEXCEPTION</constant> não.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Constantes devem ser definidas como membras de classe com o modificador "const".
|
|
|
+ Definir constantes em escopo global com a função "define" é permitido mas fortemente
|
|
|
+ desencorajado.
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+ </sect1>
|
|
|
+
|
|
|
+ <sect1 id="coding-standard.coding-style">
|
|
|
+ <title>Estilo de Codificação</title>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.coding-style.php-code-demarcation">
|
|
|
+ <title>Demarcação de código PHP</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Código <acronym>PHP</acronym> deve sempre ser delimitado pelas tags na forma
|
|
|
+ completa, padrão do <acronym>PHP</acronym>:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+<?php
|
|
|
+
|
|
|
+?>
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Tags reduzidas nunca não permitidas. Para arquivos que contenham somente código
|
|
|
+ <acronym>PHP</acronym>, a tag de fechamento deve sempre ser omitida (veja <link
|
|
|
+ linkend="coding-standard.php-file-formatting.general">a seção Geral</link>).
|
|
|
+ </para>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.coding-style.strings">
|
|
|
+ <title>Strings</title>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.strings.literals">
|
|
|
+ <title>Strings literais</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Quando uma string é literal (não contém substituição de variáveis), o apóstrofo
|
|
|
+ ou "aspa simples" deve sempre ser utilizado para demarcar a string:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$a = 'Example String';
|
|
|
+]]></programlisting>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.strings.literals-containing-apostrophes">
|
|
|
+ <title>Strings literais contendo apóstrofos</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Quando uma string literal em si contém apóstrofos, é permitido demarcar a string
|
|
|
+ com aspas ou "aspas duplas". Isto é especialmente útil para sentenças
|
|
|
+ <constant>SQL</constant>:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$sql = "SELECT `id`, `name` from `people` "
|
|
|
+ . "WHERE `name`='Fred' OR `name`='Susan'";
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Esta sintaxe é preferível a escapar os apóstrofos uma vez que é muito mais
|
|
|
+ legível.
|
|
|
+ </para>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.strings.variable-substitution">
|
|
|
+ <title>Substituição de variáveis</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A substituição de variáveis é permitida utilizando qualquer uma destas formas:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$greeting = "Hello $name, welcome back!";
|
|
|
+
|
|
|
+$greeting = "Hello {$name}, welcome back!";
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Por consistência, esta forma não é permitida:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$greeting = "Hello ${name}, welcome back!";
|
|
|
+]]></programlisting>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.strings.string-concatenation">
|
|
|
+ <title>Concatenação de strings</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Strings devem ser concatenadas utilizando o operador ".". Um espaço deve sempre
|
|
|
+ ser adicionado antes e depois do operador "." para melhorar a legibilidade:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$company = 'Zend' . ' ' . 'Technologies';
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Ao concatenar strings com o operador "." encoraja-se quebrar a expressão em
|
|
|
+ múltiplas linhas para facilitar a leitura. Nestes casos, cada linha sucessiva
|
|
|
+ deve ser indentada com espaços em branco de forma que o operador "." fique
|
|
|
+ alinhado com o operador "=":
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$sql = "SELECT `id`, `name` FROM `people` "
|
|
|
+ . "WHERE `name` = 'Susan' "
|
|
|
+ . "ORDER BY `name` ASC ";
|
|
|
+]]></programlisting>
|
|
|
+ </sect3>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.coding-style.arrays">
|
|
|
+ <title>Arrays</title>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.arrays.numerically-indexed">
|
|
|
+ <title>Arrays numericamente indexados</title>
|
|
|
+
|
|
|
+ <para>Números negativos não são permitidos como índices.</para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Um array indexado deve iniciar com um número não-negativo. Entretanto, índices
|
|
|
+ iniciados em números diferentes de 0 são desencorajados.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Ao declarar arrays indexados com a função <type>Array</type>, um espaço deve ser
|
|
|
+ adicionado após cada vírgula delimitadora para aumentar a legibilidade:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$sampleArray = array(1, 2, 3, 'Zend', 'Studio');
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ É permitido declarar arrays indexados em várias linhas utilizando o construtor
|
|
|
+ "array". Neste caso, cada linha sucessiva deve ser indentada com espaços de
|
|
|
+ forma que o começo de cada linha fique alinhado:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$sampleArray = array(1, 2, 3, 'Zend', 'Studio',
|
|
|
+ $a, $b, $c,
|
|
|
+ 56.44, $d, 500);
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Alternativamente, o item inicial do array pode começar na linha seguinte. Neste
|
|
|
+ caso, ele deve ser indentado em um nível a mais que a linha que contém a
|
|
|
+ declaração do array e todas as linhas sucessivas devem ter a mesma indentação. O
|
|
|
+ parêntese de fechamento deve estar em uma linha a parte no mesmo nível de
|
|
|
+ indentação da linha que contém a declaração do array:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$sampleArray = array(
|
|
|
+ 1, 2, 3, 'Zend', 'Studio',
|
|
|
+ $a, $b, $c,
|
|
|
+ 56.44, $d, 500,
|
|
|
+);
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Ao usar esta última declaração, encorajamos utilizar uma vírgula após o último
|
|
|
+ item do array. Isto minimiza o impacto de adicionar novos itens em linhas
|
|
|
+ sucessivas e ajuda a garantir que nenhum erro ocorra devido à ausência de uma
|
|
|
+ vírgula.
|
|
|
+ </para>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.arrays.associative">
|
|
|
+ <title>Arrays associativos</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Ao declarar arrays associativos com o construtor <type>Array</type>, encoraja-se
|
|
|
+ quebrar a expressão em várias linhas. Neste caso, cada linha sucessiva deve ser
|
|
|
+ indentada com espaços em branco de forma que as chaves e os valores fiquem
|
|
|
+ alinhados:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$sampleArray = array('firstKey' => 'firstValue',
|
|
|
+ 'secondKey' => 'secondValue');
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Alternativamente, o item inicial do array pode começar na linha seguinte. Neste
|
|
|
+ caso, ele deve ser indentado a um nível a mais que a linha contendo a declaração
|
|
|
+ do array e todas as linhas sucessivas devem ter a mesma indentação. O parêntese
|
|
|
+ de fechamento deve estar em uma linha própria, no mesmo nível de indentação da
|
|
|
+ linha que contém a declaração do array. Para legibilidade, os vários operadores
|
|
|
+ de atribuição "=>" devem ser espaçados de forma a ficarem alinhados.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+$sampleArray = array(
|
|
|
+ 'firstKey' => 'firstValue',
|
|
|
+ 'secondKey' => 'secondValue',
|
|
|
+);
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Ao utilizar esta última declaração, encorajamos utilizar uma vírgula após o
|
|
|
+ último item do array; isto minimiza o impacto de adicionar novos itens em linhas
|
|
|
+ sucessivas e ajuda a garantir que nenhum erro ocorra devido à ausência de uma
|
|
|
+ vírgula.
|
|
|
+ </para>
|
|
|
+ </sect3>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.coding-style.classes">
|
|
|
+ <title>Classes</title>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.classes.declaration">
|
|
|
+ <title>Declaração de classe</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Classes devem ser nomeadas de acordo com a convenção de nomenclatura do Zend
|
|
|
+ Framework.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A chave deve ser sempre escrita na linha abaixo do nome da classe.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Toda classe deve ter um bloco de documentação em conformidade ao padrão do
|
|
|
+ PHPDocumentor.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Todo código em uma classe deve ser indentado com quatro espaços.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Apenas uma única classe é permitida em cada arquivo <acronym>PHP</acronym>.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A inserção de código adicional em arquivos de classe é permitida, mas
|
|
|
+ desencorajada. Em tais arquivos, duas linhas em branco devem separar a classe de
|
|
|
+ qualquer código <acronym>PHP</acronym> no arquivo.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A seguir, um exemplo de declaração de classe aceitável:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+/**
|
|
|
+ * Bloco de documentação aqui.
|
|
|
+ */
|
|
|
+class SampleClass
|
|
|
+{
|
|
|
+ // todo conteúdo de classe
|
|
|
+ // deve ser indentado quatro espaços
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Classes que estendem outras classes ou que implementam interfaces devem declarar
|
|
|
+ suas dependências na mesma linha, quando possível.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+class SampleClass extends FooAbstract implements BarInterface
|
|
|
+{
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Se estas operações fizerem com que o comprimento da linha exceda o <link
|
|
|
+ linkend="coding-standard.php-file-formatting.max-line-length">comprimento
|
|
|
+ máximo</link>, quebre a linha antes das palavras-chave "extends" e/ou
|
|
|
+ "implements", e indente tais linhas em mais um nível.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+class SampleClass
|
|
|
+ extends FooAbstract
|
|
|
+ implements BarInterface
|
|
|
+{
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Se a classe implementa múltiplas interfaces e a declaração excede o comprimento
|
|
|
+ máximo da linha, quebre após cada interface separada por vírgula e indente os
|
|
|
+ nomes das interfaces de forma a ficarem alinhados.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+class SampleClass
|
|
|
+ implements BarInterface,
|
|
|
+ BazInterface
|
|
|
+{
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.classes.member-variables">
|
|
|
+ <title>Variáveis membras de classes</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Variáveis-membras devem ser nomeadas de acordo com as convenções de nomenclatura
|
|
|
+ de variáveis do Zend Framework.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Quaisquer variáveis declaradas em uma classe devem ser listadas no topo da
|
|
|
+ classe, acima da declaração de quaisquer métodos.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ O construtor <emphasis>var</emphasis> não é permitido. Variáveis-membras devem
|
|
|
+ sempre declarar sua visibilidade usando um dos modificadores
|
|
|
+ <property>private</property>, <property>protected</property> ou
|
|
|
+ <property>public</property>. Dar acesso direto a variáveis-membras declarando-as
|
|
|
+ como públicas é permitido mas desencorajado. Em vez disso, utilize métodos
|
|
|
+ acessores (set e get).
|
|
|
+ </para>
|
|
|
+ </sect3>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.coding-style.functions-and-methods">
|
|
|
+ <title>Funções e métodos</title>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.functions-and-methods.declaration">
|
|
|
+ <title>Declaração de funções e métodos</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Funções devem ser nomeadas de acordo com as convenções de nomenclatura do Zend
|
|
|
+ Framework.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Métodos dentro de classes devem sempre declarar sua visibilidade usando um dos
|
|
|
+ modificadores <property>private</property>, <property>protected</property> ou
|
|
|
+ <property>public</property>.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Assim como ocorre com classes, a chave deve sempre ser escrita na linha abaixo
|
|
|
+ do nome da função. Espaços entre o nome da função e o parêntese de abertura para
|
|
|
+ os argumentos não são permitidos.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Funções em escopo global são fortemente desencorajadas.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A seguir, um exemplo de declaração aceitável de função em uma classe:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+/**
|
|
|
+ * Bloco de documentação aqui
|
|
|
+ */
|
|
|
+class Foo
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * Bloco de documentação aqui
|
|
|
+ */
|
|
|
+ public function bar()
|
|
|
+ {
|
|
|
+ // todo conteúdo de função
|
|
|
+ // deve ser identado quatro espaços
|
|
|
+ }
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Quando a lista de argumentos exceder o <link
|
|
|
+ linkend="coding-standard.php-file-formatting.max-line-length">comprimento
|
|
|
+ máximo de linha</link> você pode introduzir quebras de linha. Argumentos
|
|
|
+ adicionais à função/método devem ser identados um nível a mais que o da
|
|
|
+ declaração da função/método. Uma quebra de linha deve ser colocada antes do
|
|
|
+ parêntese de fechamento de argumentos, que deve então ser colocado na mesma
|
|
|
+ linha da chave de abertura da função/método com uma espaço separando os dois, e
|
|
|
+ no mesmo nível de identação da declaração da função/método. A seguir, um exemplo
|
|
|
+ de tal situação:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+/**
|
|
|
+ * Bloco de documentação aqui
|
|
|
+ */
|
|
|
+class Foo
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * Bloco de documentação aqui
|
|
|
+ */
|
|
|
+ public function bar($arg1, $arg2, $arg3,
|
|
|
+ $arg4, $arg5, $arg6
|
|
|
+ ) {
|
|
|
+ // todo conteúdo de função
|
|
|
+ // deve ser identado quatro espaços
|
|
|
+ }
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <note>
|
|
|
+ <para>
|
|
|
+ O único mecanismo de passagem de parâmetro permitido em uma declaração de
|
|
|
+ método é a passagem por referência.
|
|
|
+ </para>
|
|
|
+ </note>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+/**
|
|
|
+ * Bloco de documentação aqui
|
|
|
+ */
|
|
|
+class Foo
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * Bloco de documentação aqui
|
|
|
+ */
|
|
|
+ public function bar(&$baz)
|
|
|
+ {}
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Passagem por referência em tempo de chamada é estritamente proibido.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ O valor de retorno não deve ser cercado por parênteses. Isto pode embaraçar a
|
|
|
+ legibilidade, além de quebrar o código caso um método seja modificado
|
|
|
+ posteriormente para retornar por referência.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+/**
|
|
|
+ * Bloco de documentação aqui
|
|
|
+ */
|
|
|
+class Foo
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * ERRADO
|
|
|
+ */
|
|
|
+ public function bar()
|
|
|
+ {
|
|
|
+ return($this->bar);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * CERTO
|
|
|
+ */
|
|
|
+ public function bar()
|
|
|
+ {
|
|
|
+ return $this->bar;
|
|
|
+ }
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.functions-and-methods.usage">
|
|
|
+ <title>Uso de funções e métodos</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Argumentos de funções devem ser separados por um único espaço após a vírgula
|
|
|
+ delimitadora. A seguir, um exemplo de chamada aceitável de função que utiliza
|
|
|
+ três argumentos:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+threeArguments(1, 2, 3);
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Passagem por referência em tempo de chamada é estritamente proibido. Veja na
|
|
|
+ seção de declaração de funções a maneira apropriada de passar argumentos de
|
|
|
+ função por referência.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Ao passar arrays como argumentos para uma função, a chamada da função pode
|
|
|
+ incluir a indicação "array" e pode ser quebrada em múltiplas linhas para
|
|
|
+ aumentar a legibilidade. Em tais casos, as instruções para a escrita de arrays
|
|
|
+ ainda se aplicam:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+threeArguments(array(1, 2, 3), 2, 3);
|
|
|
+
|
|
|
+threeArguments(array(1, 2, 3, 'Zend', 'Studio',
|
|
|
+ $a, $b, $c,
|
|
|
+ 56.44, $d, 500), 2, 3);
|
|
|
+
|
|
|
+threeArguments(array(
|
|
|
+ 1, 2, 3, 'Zend', 'Studio',
|
|
|
+ $a, $b, $c,
|
|
|
+ 56.44, $d, 500
|
|
|
+), 2, 3);
|
|
|
+]]></programlisting>
|
|
|
+ </sect3>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standard.coding-style.control-statements">
|
|
|
+ <title>Expressões de controle</title>
|
|
|
+
|
|
|
+ <sect3 id="coding-standard.coding-style.control-statements.if-else-elseif">
|
|
|
+ <title>If/Else/Elseif</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Expressões de controle baseadas nos construtores <emphasis>if</emphasis> e
|
|
|
+ <emphasis>elseif</emphasis> devem ter um único espaço antes do parêntese de
|
|
|
+ abertura do condicional e um único espaço depois do parêntese de fechamento.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Dentro das expressões condicionais entre os parênteses, os operadores devem ser
|
|
|
+ separados por espaços para maior legibilidade. Parênteses aninhados são
|
|
|
+ encorajados a fim de melhorar o agrupamento lógico de expressões condicionais
|
|
|
+ maiores.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A chave de abertura deve ser escrita na mesma linha da expressão condicional,
|
|
|
+ enquanto a chave de fechamento deve sempre ser escrita na sua própria linha.
|
|
|
+ Qualquer conteúdo dentro das chaves deve ser indentado utilizando quatro
|
|
|
+ espaços.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+if ($a != 2) {
|
|
|
+ $a = 2;
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Se a expressão condicional fizer com que a linha exceda o <link
|
|
|
+ linkend="coding-standard.php-file-formatting.max-line-length">comprimento
|
|
|
+ máximo</link> e possuir várias cláusulas você pode quebrar a condicional em
|
|
|
+ várias linhas. Em tais casos, quebre a linha antes de um operador lógico e
|
|
|
+ indente a linha de forma a ficar alinhada abaixo do primeiro caractere da
|
|
|
+ cláusula condicional. O parêntese de fechamento no condicional será então
|
|
|
+ colocado em uma linha junto à chave de abertura com um espaço separando os dois,
|
|
|
+ em um nível de indentação equivalente ao da expressão de controle de abertura.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+if (($a == $b)
|
|
|
+ && ($b == $c)
|
|
|
+ || (Foo::CONST == $d)
|
|
|
+) {
|
|
|
+ $a = $d;
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A intenção deste último formato de declaração é prevenir problemas ao adicionar
|
|
|
+ ou remover cláusulas da condicional durante revisões posteriores.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Para expressões "if" que incluem "elseif" ou "else", as convenções de formatação
|
|
|
+ são similares às do construtor "if". Os exemplos a seguir demonstram a
|
|
|
+ formatação apropriada para expressões "if" com construtores "else" e/ou
|
|
|
+ "elseif":
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+if ($a != 2) {
|
|
|
+ $a = 2;
|
|
|
+} else {
|
|
|
+ $a = 7;
|
|
|
+}
|
|
|
+
|
|
|
+if ($a != 2) {
|
|
|
+ $a = 2;
|
|
|
+} elseif ($a == 3) {
|
|
|
+ $a = 4;
|
|
|
+} else {
|
|
|
+ $a = 7;
|
|
|
+}
|
|
|
+
|
|
|
+if (($a == $b)
|
|
|
+ && ($b == $c)
|
|
|
+ || (Foo::CONST == $d)
|
|
|
+) {
|
|
|
+ $a = $d;
|
|
|
+} elseif (($a != $b)
|
|
|
+ || ($b != $c)
|
|
|
+) {
|
|
|
+ $a = $c;
|
|
|
+} else {
|
|
|
+ $a = $b;
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ O <acronym>PHP</acronym> permite que expressões sejam escritas sem chaves em
|
|
|
+ algumas circunstâncias. Este padrão de codificação, no entando, não faz
|
|
|
+ diferenciação alguma -- todas expressões "if", "elseif" ou "else" devem utilizar
|
|
|
+ chaves.
|
|
|
+ </para>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standards.coding-style.control-statements.switch">
|
|
|
+ <title>Switch</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Expressões de controle escritas com a expressão "switch" devem ter um único
|
|
|
+ espaço antes do parêntese de abertura da expressão condicional e após o
|
|
|
+ parêntese de fechamento.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Todo o conteúdo dentro da expressão "switch" deve ser indentado utilizando
|
|
|
+ quatro espaços e o conteúdo abaixo de cada expressão "case" deve ser indentado
|
|
|
+ utilizando quatro espaços adicionais.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+switch ($numPeople) {
|
|
|
+ case 1:
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 2:
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+}
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ O construtor <property>default</property> nunca deve ser omitido de uma
|
|
|
+ expressão <property>switch</property>.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <note>
|
|
|
+ <para>
|
|
|
+ Em alguns casos é útil escrever uma expressão <property>case</property> que
|
|
|
+ recai sobre a próxima omitindo um <property>break</property> ou
|
|
|
+ <property>return</property>. Para diferenciar tais casos de bugs, qualquer
|
|
|
+ expressão <property>case</property> onde o <property>break</property> ou o
|
|
|
+ <property>return</property> sejam omitidos devem conter um comentário
|
|
|
+ indicando que a quebra foi intencionalmente omitida.
|
|
|
+ </para>
|
|
|
+ </note>
|
|
|
+ </sect3>
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+ <sect2 id="coding-standards.inline-documentation">
|
|
|
+ <title>Documentação em linha de código</title>
|
|
|
+
|
|
|
+ <sect3 id="coding-standards.inline-documentation.documentation-format">
|
|
|
+ <title>Formato de documentação</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Todos blocos de documentação ("docblocks") devem ser compatíveis com o formato
|
|
|
+ phpDocumentor. Descrever o formato phpDocumentor está além do escopo deste
|
|
|
+ documento. Para mais informações, visite: <ulink
|
|
|
+ url="http://phpdoc.org/">http://phpdoc.org/</ulink>
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Todo arquivo de classe deve conter um docblock em nível de arquivo no topo de
|
|
|
+ cada arquivo e um docblock em nível de classe imediatamente acima da classe.
|
|
|
+ Exemplos de tais docblocks podem ser vistos abaixo.
|
|
|
+ </para>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standards.inline-documentation.files">
|
|
|
+ <title>Arquivos</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Todo arquivo que contém código <acronym>PHP</acronym> deve ter um docblock no
|
|
|
+ topo do arquivo contendo no mínimo estas tags do phpDocumentor:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+/**
|
|
|
+ * Descrição resumida do arquivo
|
|
|
+ *
|
|
|
+ * Descrição longa do arquivo (se houver)...
|
|
|
+ *
|
|
|
+ * LICENÇA: Informação sobre licença
|
|
|
+ *
|
|
|
+ * @category Zend
|
|
|
+ * @package Zend_Magic
|
|
|
+ * @subpackage Wand
|
|
|
+ * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
|
|
|
+ * @license http://framework.zend.com/license BSD License
|
|
|
+ * @version $Id:$
|
|
|
+ * @link http://framework.zend.com/package/PackageName
|
|
|
+ * @since File available since Release 1.5.0
|
|
|
+*/
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A anotação <property>@category</property> deve ter o valor "Zend".
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A anotação <property>@package</property> deve ser utilizada e deve ser
|
|
|
+ equivalente ao nome do componente da classe contida no arquivo. Tipicamente, o
|
|
|
+ nome do componente possuirá apenas dois segmentos, o prefixo "Zend" e o nome do
|
|
|
+ componente.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A anotação <property>@subpackage</property> é opcional. Caso informada, deve ser
|
|
|
+ o nome do subcomponente menos o prefixo da classe. No exemplo acima, assume-se
|
|
|
+ que a classe no arquivo ou é "<classname>Zend_Magic_Wand</classname>" ou utiliza
|
|
|
+ tal nome de classe como parte de seu prefixo.
|
|
|
+ </para>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standards.inline-documentation.classes">
|
|
|
+ <title>Classes</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Toda classe deve ter um docblock que contenha no mínimo estas tags do
|
|
|
+ phpDocumentor:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+/**
|
|
|
+ * Descrição resumida da classe
|
|
|
+ *
|
|
|
+ * Descrição longa da classe (se houver)...
|
|
|
+ *
|
|
|
+ * @category Zend
|
|
|
+ * @package Zend_Magic
|
|
|
+ * @subpackage Wand
|
|
|
+ * @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
|
|
|
+ * @license http://framework.zend.com/license BSD License
|
|
|
+ * @version Release: @package_version@
|
|
|
+ * @link http://framework.zend.com/package/PackageName
|
|
|
+ * @since Class available since Release 1.5.0
|
|
|
+ * @deprecated Class deprecated in Release 2.0.0
|
|
|
+ */
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A anotação <property>@category</property> deve ter o valor "Zend".
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A anotação <property>@package</property> deve ser informada e deve ser
|
|
|
+ equivalente ao componente a que a classe pertence; tipicamente, terá apenas dois
|
|
|
+ segmentos: o prefixo "Zend" e o nome do componente.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ A anotação <property>@subpackage</property> é opcional. Caso informada, deve ser
|
|
|
+ o nome do subcomponente menos o prefixo da classe. No exemplo acima, assume-se
|
|
|
+ que a classe descrita ou é "<classname>Zend_Magic_Wand</classname>" ou utiliza
|
|
|
+ este nome como parte do seu prefixo.
|
|
|
+ </para>
|
|
|
+ </sect3>
|
|
|
+
|
|
|
+ <sect3 id="coding-standards.inline-documentation.functions">
|
|
|
+ <title>Funções</title>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Toda função, incluindo métodos de objetos, deve possuir um docblock que contenha
|
|
|
+ no mínimo:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <itemizedlist>
|
|
|
+ <listitem><para>Uma descrição da função</para></listitem>
|
|
|
+ <listitem><para>Todos os argumentos</para></listitem>
|
|
|
+ <listitem><para>Todos os possíveis valores de retorno</para></listitem>
|
|
|
+ </itemizedlist>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Não é necessário utilizar a tag "@access" já que o nível de acesso é conhecido
|
|
|
+ através do modificador "public", "private" ou "protected" utilizado na
|
|
|
+ declaração.
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <para>
|
|
|
+ Se uma função ou método pode disparar uma exceção, utilize @throws para todas as
|
|
|
+ classes de exceção:
|
|
|
+ </para>
|
|
|
+
|
|
|
+ <programlisting language="php"><![CDATA[
|
|
|
+@throws exceptionclass [description]
|
|
|
+]]></programlisting>
|
|
|
+ </sect3>
|
|
|
+ </sect2>
|
|
|
+ </sect1>
|
|
|
+</appendix>
|
|
|
+<!--
|
|
|
+vim:se ts=4 sw=4 et:
|
|
|
+-->
|