Estándares de codificación de Zend Framework para PHPIntroducciónAlcance Este documento provee las pautas para el formato del código y
la documentación a personas y equipos que contribuyan con Zend
Framework. Muchos de los desarrolladores que usan Zend Framework
han encontrado útiles estos estándares debido a que el estilo de
su código permanece consistente con otros códigos fuente basados
en Zend Framework. También debe resaltarse que especificar
completamente los estándares de código requiere un esfuerzo
significativo. Nota: A veces, los desarrolladores consideran el
establecimiento de estándares más importante que lo que el
estándar sugiere realmente al nivel más detallado de diseño.
Estas pautas en los estándares de código de Zend Framework
han demostrado funcionar bien en otros projectos de Zend
Framework. Puede modificar estos estándares o usarlos en
conformidad con los términos de nuestra licencia Temas incluídos en los estándares de código de Zend
Framework: Dar formato a archivos PHP
Convenciones de nombradoEstilo de códigoDocumentación integradaObjetivos Los estándares de código resultan importantes en cualquier
proyecto de desarrollo, pero son especialmente importantes
cuando muchos desarrolladores trabajan en el mismo proyecto. Los
estándares de código ayudan a asegurar que el código tenga una
alta calidad, menos errores, y pueda ser mantenido fácilmente.
Formato de archivos PHPGeneral Para archivos que contengan únicamente código
PHP , la etiqueta de cierre ("?>") no
está permitida. No es requerida por PHP , y
omitirla evita la inyección de espacios en blanco en la
respuesta. IMPORTANTE: La inclusión de datos
binarios arbitrarios permitidos por
__HALT_COMPILER() está
prohibida en los archivos PHP de Zend
Framework, así como en cualquier fichero derivado. El uso de
esta característica sólo está permitido en algunos scripts
de instalación. IdentaciónLa identación suele estar compuesta por 4 espacios. Las
tabulaciones no están permitidas.Tamaño máximo de línea La longitud recomendable para una línea de código es de 80
caracteres. Esto significa que los desarrolladores de Zend
deberían intentar mantener cada línea de su código por debajo de
los 80 caracteres, siempre que sea posible. No obstante, líneas
más largas pueden ser aceptables en algunas situaciones. El
tamaño máximo de cualquier línea de código
PHP es de 120 caracteres. Final de línea El Final de Línea sigue la convención de archivos de texto
Unix. Las líneas deben acabar con un carácter linefeed (LF). Los
caracteres Linefeed están representados con el número 10
ordinal, o el número 0x0A hexadecimal. Nota: No use retornos de carro (carriage returns, CR) como en
las fuentes de Apple (0x0D) o la combinación de retorno de carro
- linefeed ( CRLF ) estandar para sistemas
operativos Windows (0x0D, 0x0A). Convenciones de NombresClases Zend Framework se estandariza una convencion de nombres de
clases donde los nombres de las clases apuntan directamente a
las carpetas en las que estan contenidas. La carpeta raiz de la
biblioteca estandar de Zend Framework es la carpeta "Zend/",
mientras que la carpeta raíz de las bibliotecas extra de Zend
Framework es la carpeta "ZendX/". Todas las clases de Zend
Framework están almacenadas jerárquicamente bajo estas carpetas
raíz. Los nombres de clases pueden contener sólo caracteres
alfanuméricos. Los números están permitidos en los nombres de
clase, pero desaconsejados en la mayoría de casos. Las barras
bajas (_) están permitidas solo como separador de ruta (el
archivo " Zend/Db/Table.php " debe apuntar
al nombre de clase " Zend_Db_Table "). Si el nombre de una clase esta compuesto por mas de una
palabra, la primera letra de cada palabra debe aparecer en
mayúsculas. Poner en mayúsculas las letras siguientes no está
permitido, ej: "Zend_PDF" no está permitido, mientras que "
Zend_Pdf " es admisible. Estas convenciones definen un mecanismo de pseudo-espacio de
nombres para Zend Framework. Zend Framework adoptará la
funcionalidad PHP de espacio de nombres
cuando esté disponible y sea factible su uso en las aplicaciones
de nuestros desarrolladores. Vea los nombres de clase en las bibliotecas estandar y
adicionales (extras) como ejemplos de esta convención de
nombres. IMPORTANTE: El código que deba
distribuirse junto a las bibliotecas de Zend Framework, pero
no forma parte de las bibliotecas estándar o extras de Zend
(e.g.: código o bibliotecas que no estén distribuídas por
Zend) no puede empezar nunca por "Zend_" o "ZendX_". Clases Abstractas En general, las clases abstractas siguen las mismas
convenciones que las clases , con una regla adicional: Los nombres de las
clases abstractas deben acabar con el término, "Abstract", y ese
término no debe ser precedida por un guión bajo. Ejemplo,
Zend_Controller_Plugin_Abstract es
considerado un nombre no válido, pero
Zend_Controller_PluginAbstract o
Zend_Controller_Plugin_PluginAbstract
serian nombres válidos. Esta convención de nombres es nuevo con la versión 1.9.0
de Zend Framework. Las clases que preceden aquella versión
no pueden seguir esta regla, pero serán renombradas en el
futuro a fin de cumplir la regla. Interfaces En general, las clases abstractas siguen las mismas
convenciones que las classes , con una regla adicional: Los nombres de
las interfaces opcionalmente pueden acabar con el término,
"Interface",pero término no debe ser precedida por un guión
bajo. Ejemplo,
Zend_Controller_Plugin_Interface es
considerado un nombre no válido, pero
Zend_Controller_PluginInterface o
Zend_Controller_Plugin_PluginInterface
serian nombres válidos. Si bien esta regla no es necesaria, se recomienda
encarecidamente su uso, ya que proporciona una buena refrencia
visual a los desarrolladores, como saber que archivos contienen
interfaces en lugar de clases. Esta convención de nombres es nuevo con la versión 1.9.0
de Zend Framework. Las clases que preceden aquella versión
no pueden seguir esta regla, pero serán renombradas en el
futuro a fin de cumplir la regla. Nombres de Archivo Para cualquier otro archivo, sólo caracteres alfanuméricos,
barras bajas (_) y guiones (-) están permitidos. Los espacios en
blanco están estrictamente prohibidos. Cualquier archivo que contenga código PHP
debe terminar con la extensión " .php ",
con la excepción de los scripts de la vista. Los siguientes
ejemplos muestran nombres de archivo admisibles para clases de
Zend Framework..: Los nombres de archivo deben apuntar a nombres de clases como
se describe arriba. Funciones y Métodos Los nombres de funciones pueden contener únicamente
caracteres alfanuméricos. Las guiones bajos (_) no estan
permitidos. Los números están permitidos en los nombres de
función pero no se aconseja en la mayoría de los casos. Los nombres de funciones deben empezar siempre con una letra
minúscula. Cuando un nombre de función consiste en más de una
palabra, la primera letra de cada nueva palabra debe estar en
mayúsculas. Esto es llamado comúnmente como formato "camelCase". Por norma general, se recomienda la elocuencia. Los nombres
de función deben ser lo suficientemente elocuentes como para
describir su propósito y comportamiento. Estos son ejemplos de nombres de funciones admisibles: Para la programación orientada a objetos, los métodos de
acceso para las instancias o variables estáticas deben ir
antepuestos con un "get" o un "set". Al implementar el patron de
diseño, tales como el patrón singleton o el patrón factory, el
nombre del método debe contener en la práctica el nombre del
patrón para describir su comportamiento de forma más completa. Para el caso en que los métodos son declarados con el
modificador "private" o "protected", el primer carácter del
nombre de la variable debe ser una barra baja (_). Este es el
único uso admisible de una barra baja en un nombre de método.
Los métodos declarados como públicos no deberían contener nunca
una barra baja. Las funciones de alcance global (también llamadas "funciones
flotantes") están permitidas pero desaconsejadas en la mayoría
de los casos. Considere envolver esas funciones en una clase
estática. Variables Los nombres de variables pueden contener caracteres
alfanuméricos. Las barras bajas (_) no están permitidas. Los
números están permitidos en los nombres de variable pero no se
aconseja en la mayoría de los casos. Para las variables de instancia que son declaradas con el
modificador "private" o "protected", el primer carácter de la
variable debe ser una única barra baja (_). Este es el único
caso admisible de una barra baja en el nombre de una variable.
Las variables declaradas como "public" no pueden empezar nunca
por barra baja. Al igual que los nombres de funciones (ver sección 3.3), los
nombres de variables deben empezar siempre con una letra en
minúscula y seguir la convención "camelCaps". Por norma general, se recomienda la elocuencia. Las variables
deberían ser siempre tan elocuentes como prácticas para
describir los datos que el desarrollador pretende almacenar en
ellas. Variables escuetas como " $i " y "
$n " están desaconsejadas, salvo para el
contexto de los bucles más pequeños. Si un bucle contiene más de
20 líneas de código, las variables de índice deberían tener
nombres más descriptivos. Constantes Las constantes pueden contener tanto caracteres alfanuméricos
como barras bajas (_). Los números están permitidos. Todos las letras pertenecientes al nombre de una constante
deben aparecer en mayúsculas. Las palabras dentro del nombre de una constante deben
separarse por barras bajas (_). Por ejemplo,
EMBED_SUPPRESS_EMBED_EXCEPTION está
permitido, pero
EMBED_SUPPRESSEMBEDEXCEPTION no. Las constantes deben ser definidas como miembros de clase con
el modificador "const". Definir constantes en el alcance global
con la función "define" está permitido pero no recomendado.
Estilo de códigoDemarcación de código PHP El código PHP debe estar delimitado
siempre por la forma completa de las etiquetas
PHP estándar:
]]> Las etiquetas cortas (short tags) no se permiten nunca. Para
archivos que contengan únicamente código PHP
, la etiqueta de cierrre debe omitirse siempre (Ver ).
Cadenas de Caracteres Cadenas Literales de Caracteres Cuando una cadena es literal (no contiene sustitución de
variables), el apóstrofo o "comilla" debería ser usado
siempre para delimitar la cadena: Cadenas Literales de Caracteres que Contengan
Apóstrofos Cuando una cadena literal de caracteres contega
apóstrofos, es permitido delimitar la cadena de caracteres
con "comillas dobles". Esto es especialmente útil para
sentencias SQL : En esta sintáxis es preferible escapar apóstrofes, ya que
es mucho más fácil de leer. Sustitución de Variables La sustitución de variables está permitida en cualquiera
de estas formas: Por consistencia, esta forma no está permitida: Concatenación de cadenas Las cadenas deben ser concatenadas usando el operador
punto ("."). Un espacio debe añadirse siempre antes y
después del operador "." para mejorar la legibilidad: Al concatenar cadenas con el operador ".", se recomienda
partir la sentencia en múltiples líneas para mejorar la
legibilidad. En estos casos, cada linea sucesiva debe llevar
un margen de espacios en blanco de forma que el operador "."
está alineado bajo el operador "=": ArraysArrays Indexados NuméricamenteNo están permitidos números negativos como índices. Un array indexado puede empezar por cualquier valor no
negativo, sin embargo, no se recomiendan índices base
distintos a 0. Al declarar arrays indexados con la función
array , un espacio de
separación deben añadirse después de cada coma, para mejorar
la legibilidad: Se permite declarar arrays indexados multilínea usando la
construcción "array". En este caso, cada línea sucesiva debe
ser tabulada con cuatro espacios de forma que el principio
de cada línea está alineado: Alternativamente, el elemento inicial del array puede
comenzar en la siguiente línea. Si es así, debe ser alineado
en un nivel de sangría superior a la línea que contiene la
declaración del array, y todas las sucesivas líneas deben
tener la mismo indentación, el paréntesis de cierre debe ser
en una nueva línea al mismo nivel de indentación que la
línea que contiene la declaración del array: Al utilizar esta última declaración, recomendamos la
utilización de una coma detrás de el último elemento de la
matriz, lo que minimizará el impacto de añadir nuevos
elementos en las siguientes líneas, y ayuda a garantizar que
no se produzcan errores debido a la falta de una coma.
Arrays Asociativos Al declarar arrays asociativos con la construcción
array , se recomienda partir la
declaración en múltiples líneas. En este caso, cada línea
sucesiva debe ser tabuladas con cuatro espacios de forma que
tanto las llaves como los valores están alineados: 'firstValue',
'secondKey' => 'secondValue');
]]> Alternativamente, el elemento inicial del array puede
comenzar en la siguiente línea. Si es así, debe ser alineado
en un nivel de sangría superior a la línea que contiene la
declaración del array, y todas las sucesivas líneas deben
tener la mismo indentación, el paréntesis de cierre debe ser
en una nueva línea al mismo nivel de indentación que la
línea que contiene la declaración del array: Para mejor
legibilidad, los diversos operadores de asiganción "=>"
deben ser rellenados con espacios en blanco hasta que se
alinien. 'firstValue',
'secondKey' => 'secondValue',
);
]]> Al utilizar esta última declaración, recomendamos la
utilización de una coma detrás de el último elemento de la
matriz, lo que minimizará el impacto de añadir nuevos
elementos en las siguientes líneas, y ayuda a garantizar que
no se produzcan errores debido a la falta de una coma. ClasesDeclaración de clases Las Clases deben ser nombradas de acuerdo a las
convencion de nombres de Zend Framework. La llave "{" deberá escribirse siempre en la línea debajo
del nombre de la clase ("one true brace"). Cada clase debe contener un bloque de documentación
acorde con el estándar de PHPDocumentor. Todo el código contenido en una clase debe ser separado
con cuatro espacios. Únicamente una clase está permitida por archivo
PHP . Incluir código adicional en archivos de clase está
permitido pero esta desaconsejado. En archivos de ese tipo,
dos líneas en blanco deben separar la clase de cualquier
código PHP adicional en el archivo de
clase. A continuación se muestra un ejemplo de una declaración
de clase que es permitida: Las clases que extiendan otras clases o interfaces
deberían declarar sus dependencias en la misma línea siempre
que sea posible. Si como resultado de esas declaraciones, la longitud de
la línea excede la longitud del Tamaño máximo de línea , se debe romper la línea
antes de la palabra clave "extends" y / o "implements" e
indentarlo con un nivel de indentación (4 espacios). If the class implements multiple interfaces and the
declaration exceeds the maximum line length, break after
each comma separating the interfaces, and indent the
interface names such that they align. Variables de miembros de clase Las variables de miembros de clase deben ser nombradas de
acuerdo con las conveciones de nombrado de variables de Zend
Framework. Cualquier variable declarada en una clase debe ser
listada en la parte superior de la clase, por encima de las
declaraciones de cualquier método. La construcción var no está
permitido. Las variables de miembro siempre declaran su
visibilidad usando uno los modificadores
private ,
protected , o
public. Dar acceso a las variables
de miembro declarándolas directamente como public está
permitido pero no se aconseja en favor de accesor methods
(set & get). Funciones y MétodosDeclaración de Funciones y Métodos Las Funciones deben ser nombradas de acuerdo a las
convenciones de nombrado de Zend Framework. Los métodos dentro de clases deben declarar siempre su
visibilidad usando un modificador
private ,
protected , o
public . Como en las clases, la llave "{" debe ser escrita en la
línea siguiente al nombre de la función ("one true brace"
form). No está permitido un espacio entre el nombre de la
función y el paróntesis de apertura para los argumentos. Las funciones de alcance global no están permitidas. Lo siguiente es un ejemplo de una declaración admisible
de una función en una clase: In cases where the argument list exceeds the maximum line length , you may introduce line
breaks. Additional arguments to the function or method must
be indented one additional level beyond the function or
method declaration. A line break should then occur before
the closing argument paren, which should then be placed on
the same line as the opening brace of the function or method
with one space separating the two, and at the same
indentation level as the function or method declaration. The
following is an example of one such situation: NOTA: El paso por referencia es el
único mecanismo de paso de parámetros permitido en una
declaración de método. La llamada por referencia está estrictamente prohibida. El valor de retorno no debe estar indicado entre
paréntesis. Esto podría afectar a la legibilidad, además de
romper el código si un método se modifica posteriormente
para que devuelva por referencia. bar);
}
/**
* CORRECTO
*/
public function bar()
{
return $this->bar;
}
}
]]>Uso de Funciones y Métodos Los argumentos de la función tendrían que estar separados
por un único espacio posterior después del delimitador coma.
A continuación se muestra un ejemplo de una invocación
admisible de una función que recibe tres argumentos: La llamada por referencia está estrictamente prohibida.
Vea la sección de declaraciones de funciones para el método
correcto de pasar argumentos por referencia. Al pasar arrays como argumentos a una función, la llamada
a la función puede incluir el indicador "hint" y puede
separarse en múltiples líneas para aumentar la legibilidad.
En esos casos, se aplican las pautas normales para escribir
arrays: Sentencias de ControlIf/Else/Elseif Las sentencias de control basadas en las construcciones
if y elseif
deben tener un solo espacio en blanco antes del paréntesis
de apertura del condicional y un solo espacio en blanco
después del paréntesis de cierre. Dentro de las sentencias condicionales entre paréntesis,
los operadores deben separarse con espacios, por
legibilidad. Se aconseja el uso de paréntesis internos para
mejorar la agrupación lógica en expresiones condicionales
más largas. La llave de apertura "{" se escribe en la misma línea que
la sentencia condicional. La llave de cierre "}" se escribe
siempre en su propia línea. Cualquier contenido dentro de
las llaves debe separarse con cuatro espacios en blanco. If the conditional statement causes the line length to
exceed the maximum line length and has several clauses, you
may break the conditional into multiple lines. In such a
case, break the line prior to a logic operator, and pad the
line such that it aligns under the first character of the
conditional clause. The closing paren in the conditional
will then be placed on a line with the opening brace, with
one space separating the two, at an indentation level
equivalent to the opening control statement. The intention of this latter declaration format is to
prevent issues when adding or removing clauses from the
conditional during later revisions. Para las declaraciones "if" que incluyan "elseif" o
"else", las convenciones de formato son similares a la
construcción "if". Los ejemplos siguientes demuestran el
formato correcto para declaraciones "if" con construcciones
"else" y/o "elseif":
PHP permite escribir sentencias sin
llaves -{}- en algunas circunstancias. Este estándar de
código no hace ninguna diferenciación- toda sentencia "if",
"elseif" o "else" debe usar llaves. El uso de la construcción "elseif" está permitido pero no
se aconseja, en favor de la combinación "else if". Switch Las declaraciones de control escritas con la declaración
"switch" deben tener un único espacio en blanco antes del
paréntesis de apertura del condicional y después del
paréntesis de cierre. Todo contenido dentro de una declaración "switch" debe
separarse usando cuatro espacios. El contenido dentro de
cada declaración "case" debe separarse usando cuatro
espacios adicionales. La construcción default no debe
omitirse nunca en una declaración
switch . NOTA: En ocasiones, resulta útil
escribir una declaración case que
salta al siguiente case al no incluir un
break o
return dentro de ese case. Para
distinguir estos casos de posibles errores, cualquier
declaración donde break o
return sean omitidos deberán
contener un comentario indicando que se omitieron
intencionadamente. Documentación integradaFormato de documentación Todos los bloques de documentación ("docblocks") deben
ser compatibles con el formato de phpDocumentor. Describir
el formato de phpDocumentor está fuera del alcance de este
documento. Para más información, visite: http://phpdoc.org/ Todos los archivos de clase deben contener un bloque de
documentación "a nivel de archivo" al principio de cada
archivo y un bloque de documentación "a nivel de clase"
inmediatamente antes de cada clase. Ejemplo de estos bloques
de documentación pueden encontrarse debajo. Archivos Cada archivo que contenga código PHP
debe tener un bloque de documentación al principio del
archivo que contenga como mínimo las siguientes etiquetas
phpDocumentor: The @category annotation must have a
value of "Zend". The @package annotation must be
assigned, and should be equivalent to the component name of
the class contained in the file; typically, this will only
have two segments, the "Zend" prefix, and the component
name. The @subpackage annotation is
optional. If provided, it should be the subcomponent name,
minus the class prefix. In the example above, the assumption
is that the class in the file is either "
Zend_Magic_Wand ", or uses that
classname as part of its prefix. Clases Cada clase debe contener un bloque de documentación que
contenga como mínimo las siguientes etiquetas phpDocumentor: The @category annotation must have a
value of "Zend". The @package annotation must be
assigned, and should be equivalent to the component to which
the class belongs; typically, this will only have two
segments, the "Zend" prefix, and the component name. The @subpackage annotation is
optional. If provided, it should be the subcomponent name,
minus the class prefix. In the example above, the assumption
is that the class described is either "
Zend_Magic_Wand ", or uses that
classname as part of its prefix. Funciones Cada función, incluyendo métodos de objeto, debe contener
un bloque de documentación que contenga como mínimo: Una descripción de la funciónTodos los argumentosTodos los posibles valores de retorno No es necesario incluir la etiqueta "@access" si el nivel
de acceso es conocido de antemano por el modificador
"public", "private", o "protected" usado para declarar la
función. Si una función/método puede lanzar una excepción, utilice
@throws para todos los tipos de excepciones conocidas: