| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <appendix id="coding-standard">
- <title>Zend Framework Coding Standard for PHP</title>
- <sect1 id="coding-standard.overview">
- <title>Overview</title>
- <sect2 id="coding-standard.overview.scope">
- <title>Scope</title>
- <para>
- This document provides guidelines for code formatting and documentation to
- individuals and teams contributing to Zend Framework. Many developers using Zend
- Framework have also found these coding standards useful because their code's style
- remains consistent with all Zend Framework code. It is also worth noting that it
- requires significant effort to fully specify coding standards.
- </para>
- <note>
- <para>
- Sometimes developers consider the establishment of a standard more important
- than what that standard actually suggests at the most detailed level of
- design. The guidelines in Zend Framework's coding standards capture practices
- that have worked well on the Zend Framework project. You may modify these
- standards or use them as is in accordance with the terms of our <ulink
- url="http://framework.zend.com/license">license</ulink>.
- </para>
- </note>
- <para>
- Topics covered in Zend Framework's coding standards include:
- </para>
- <itemizedlist>
- <listitem>
- <para><acronym>PHP</acronym> File Formatting</para>
- </listitem>
- <listitem>
- <para>Naming Conventions</para>
- </listitem>
- <listitem>
- <para>Coding Style</para>
- </listitem>
- <listitem>
- <para>Inline Documentation</para>
- </listitem>
- </itemizedlist>
- </sect2>
- <sect2 id="coding-standard.overview.goals">
- <title>Goals</title>
- <para>
- Coding standards are important in any development project, but they are particularly
- important when many developers are working on the same project. Coding standards
- help ensure that the code is high quality, has fewer bugs, and can be easily
- maintained.
- </para>
- </sect2>
- </sect1>
- <sect1 id="coding-standard.php-file-formatting">
- <title>PHP File Formatting</title>
- <sect2 id="coding-standard.php-file-formatting.general">
- <title>General</title>
- <para>
- For files that contain only <acronym>PHP</acronym> code, the closing tag ("?>") is
- never permitted. It is not required by <acronym>PHP</acronym>, and omitting it´
- prevents the accidental injection of trailing white space into the response.
- </para>
- <note>
- <para>
- <emphasis>Important</emphasis>: Inclusion of arbitrary binary data as permitted
- by <methodname>__HALT_COMPILER()</methodname> is prohibited from
- <acronym>PHP</acronym> files in the Zend Framework project or files derived
- from them. Use of this feature is only permitted for some installation scripts.
- </para>
- </note>
- </sect2>
- <sect2 id="coding-standard.php-file-formatting.indentation">
- <title>Indentation</title>
- <para>Indentation should consist of 4 spaces. Tabs are not allowed.</para>
- </sect2>
- <sect2 id="coding-standard.php-file-formatting.max-line-length">
- <title>Maximum Line Length</title>
- <para>
- The target line length is 80 characters. That is to say, Zend Framework developers
- should strive keep each line of their code under 80 characters where possible and
- practical. However, longer lines are acceptable in some circumstances. The maximum
- length of any line of <acronym>PHP</acronym> code is 120 characters.
- </para>
- </sect2>
- <sect2 id="coding-standard.php-file-formatting.line-termination">
- <title>Line Termination</title>
- <para>
- Line termination follows the Unix text file convention. Lines must end with a
- single linefeed (LF) character. Linefeed characters are represented as ordinal 10,
- or hexadecimal 0x0A.
- </para>
- <para>
- Note: Do not use carriage returns (CR) as is the convention in Apple OS's (0x0D) or
- the carriage return - linefeed combination (<acronym>CRLF</acronym>) as is standard
- for the Windows OS (0x0D, 0x0A).
- </para>
- </sect2>
- </sect1>
- <sect1 id="coding-standard.naming-conventions">
- <title>Naming Conventions</title>
- <sect2 id="coding-standard.naming-conventions.classes">
- <title>Classes</title>
- <para>
- Zend Framework standardizes on a class naming convention whereby the names of the
- classes directly map to the directories in which they are stored. The root level
- directory of Zend Framework's standard library is the "Zend/" directory, whereas
- the root level directory of Zend Framework's extras library is the "ZendX/"
- directory. All Zend Framework classes are stored hierarchically under these root
- directories..
- </para>
- <para>
- Class names may only contain alphanumeric characters. Numbers are permitted
- in class names but are discouraged in most cases. Underscores are only permitted in
- place of the path separator; the filename "<filename>Zend/Db/Table.php</filename>"
- must map to the class name "<classname>Zend_Db_Table</classname>".
- </para>
- <para>
- If a class name is comprised of more than one word, the first letter of each new
- word must be capitalized. Successive capitalized letters are not allowed, e.g.
- a class "Zend_PDF" is not allowed while "<classname>Zend_Pdf</classname>" is
- acceptable.
- </para>
- <para>
- These conventions define a pseudo-namespace mechanism for Zend Framework. Zend
- Framework will adopt the <acronym>PHP</acronym> namespace feature when it becomes
- available and is feasible for our developers to use in their applications.
- </para>
- <para>
- See the class names in the standard and extras libraries for examples of this
- classname convention.
- </para>
- <note>
- <para>
- <emphasis>Important</emphasis>: Code that must be deployed alongside
- Zend Framework libraries but is not part of the standard or extras libraries
- (e.g. application code or libraries that are not distributed by Zend) must
- never start with "Zend_" or "ZendX_".
- </para>
- </note>
- </sect2>
- <sect2 id="coding-standard.naming-conventions.abstracts">
- <title>Abstract Classes</title>
- <para>
- In general, abstract classes follow the same conventions as <link
- linkend="coding-standard.naming-conventions.classes">classes</link>,
- with one additional rule: abstract class names must end in the term, "Abstract",
- and that term must not be preceded by an underscore. As an example,
- <classname>Zend_Controller_Plugin_Abstract</classname> is considered an
- invalid name, but <classname>Zend_Controller_PluginAbstract</classname> or
- <classname>Zend_Controller_Plugin_PluginAbstract</classname> would be valid
- names.
- </para>
- <note>
- <para>
- This naming convention is new with version 1.9.0 of Zend Framework. Classes
- that pre-date that version may not follow this rule, but will be renamed in
- the future in order to comply.
- </para>
- <para>
- The rationale for the change is due to namespace usage. As we look towards Zend
- Framework 2.0 and usage of <acronym>PHP</acronym> 5.3, we will be using
- namespaces. The easiest way to automate conversion to namespaces is to simply
- convert underscores to the namespace separator -- but under the old naming
- conventions, this leaves the classname as simply "Abstract" or "Interface" --
- both of which are reserved keywords in <acronym>PHP</acronym>. If we prepend the
- (sub)component name to the classname, we can avoid these issues.
- </para>
- <para>
- To illustrate the situation, consider converting the class
- <classname>Zend_Controller_Request_Abstract</classname> to use namespaces:
- </para>
- <programlisting language="php"><![CDATA[
- namespace Zend\Controller\Request;
- abstract class Abstract
- {
- // ...
- }
- ]]></programlisting>
- <para>
- Clearly, this will not work. Under the new naming conventions, however, this
- would become:
- </para>
- <programlisting language="php"><![CDATA[
- namespace Zend\Controller\Request;
- abstract class RequestAbstract
- {
- // ...
- }
- ]]></programlisting>
- <para>
- We still retain the semantics and namespace separation, while omitting the
- keyword issues; simultaneously, it better describes the abstract class.
- </para>
- </note>
- </sect2>
- <sect2 id="coding-standard.naming-conventions.interfaces">
- <title>Interfaces</title>
- <para>
- In general, interfaces follow the same conventions as <link
- linkend="coding-standard.naming-conventions.classes">classes</link>,
- with one additional rule: interface names may optionally end in the term,
- "Interface", but that term must not be preceded by an underscore. As an example,
- <classname>Zend_Controller_Plugin_Interface</classname> is considered an
- invalid name, but <classname>Zend_Controller_PluginInterface</classname> or
- <classname>Zend_Controller_Plugin_PluginInterface</classname> would be valid
- names.
- </para>
- <para>
- While this rule is not required, it is strongly recommended, as it provides a
- good visual cue to developers as to which files contain interfaces rather than
- classes.
- </para>
- <note>
- <para>
- This naming convention is new with version 1.9.0 of Zend Framework. Classes
- that pre-date that version may not follow this rule, but will be renamed in
- the future in order to comply. See <link
- linkend="coding-standard.naming-conventions.abstracts">the previous
- section</link> for more information on the rationale for this change.
- </para>
- </note>
- </sect2>
- <sect2 id="coding-standard.naming-conventions.filenames">
- <title>Filenames</title>
- <para>
- For all other files, only alphanumeric characters, underscores, and the dash
- character ("-") are permitted. Spaces are strictly prohibited.
- </para>
- <para>
- Any file that contains <acronym>PHP</acronym> code should end with the extension
- "<filename>.php</filename>", with the notable exception of view scripts. The
- following examples show acceptable filenames for Zend Framework classes:
- </para>
- <programlisting language="php"><![CDATA[
- Zend/Db.php
- Zend/Controller/Front.php
- Zend/View/Helper/FormRadio.php
- ]]></programlisting>
- <para>
- File names must map to class names as described above.
- </para>
- </sect2>
- <sect2 id="coding-standard.naming-conventions.functions-and-methods">
- <title>Functions and Methods</title>
- <para>
- Function names may only contain alphanumeric characters. Underscores are not
- permitted. Numbers are permitted in function names but are discouraged in most
- cases.
- </para>
- <para>
- Function names must always start with a lowercase letter. When a function name
- consists of more than one word, the first letter of each new word must be
- capitalized. This is commonly called "camelCase" formatting.
- </para>
- <para>
- Verbosity is generally encouraged. Function names should be as verbose as is
- practical to fully describe their purpose and behavior.
- </para>
- <para>
- These are examples of acceptable names for functions:
- </para>
- <programlisting language="php"><![CDATA[
- filterInput()
- getElementById()
- widgetFactory()
- ]]></programlisting>
- <para>
- For object-oriented programming, accessors for instance or static variables should
- always be prefixed with "get" or "set". In implementing design patterns, such as the
- singleton or factory patterns, the name of the method should contain the pattern
- name where practical to more thoroughly describe behavior.
- </para>
- <para>
- For methods on objects that are declared with the "private" or "protected" modifier,
- the first character of the method name must be an underscore. This is the only
- acceptable application of an underscore in a method name. Methods declared "public"
- should never contain an underscore.
- </para>
- <para>
- Functions in the global scope (a.k.a "floating functions") are permitted but
- discouraged in most cases. Consider wrapping these functions in a static class.
- </para>
- </sect2>
- <sect2 id="coding-standard.naming-conventions.variables">
- <title>Variables</title>
- <para>
- Variable names may only contain alphanumeric characters. Underscores are not
- permitted. Numbers are permitted in variable names but are discouraged in most
- cases.
- </para>
- <para>
- For instance variables that are declared with the "private" or "protected" modifier,
- the first character of the variable name must be a single underscore. This is the
- only acceptable application of an underscore in a variable name. Member variables
- declared "public" should never start with an underscore.
- </para>
- <para>
- As with function names (see section 3.3) variable names must always start with a
- lowercase letter and follow the "camelCaps" capitalization convention.
- </para>
- <para>
- Verbosity is generally encouraged. Variables should always be as verbose as
- practical to describe the data that the developer intends to store in them. Terse
- variable names such as "<varname>$i</varname>" and "<varname>$n</varname>" are
- discouraged for all but the smallest loop contexts. If a loop contains more than
- 20 lines of code, the index variables should have more descriptive names.
- </para>
- </sect2>
- <sect2 id="coding-standard.naming-conventions.constants">
- <title>Constants</title>
- <para>
- Constants may contain both alphanumeric characters and underscores. Numbers are
- permitted in constant names.
- </para>
- <para>
- All letters used in a constant name must be capitalized, while all words in a
- constant name must be separated by underscore characters.
- </para>
- <para>
- For example, <constant>EMBED_SUPPRESS_EMBED_EXCEPTION</constant> is permitted but
- <constant>EMBED_SUPPRESSEMBEDEXCEPTION</constant> is not.
- </para>
- <para>
- Constants must be defined as class members with the "const" modifier. Defining
- constants in the global scope with the "define" function is permitted but strongly
- discouraged.
- </para>
- </sect2>
- </sect1>
- <sect1 id="coding-standard.coding-style">
- <title>Coding Style</title>
- <sect2 id="coding-standard.coding-style.php-code-demarcation">
- <title>PHP Code Demarcation</title>
- <para>
- <acronym>PHP</acronym> code must always be delimited by the full-form, standard
- <acronym>PHP</acronym> tags:
- </para>
- <programlisting language="php"><![CDATA[
- <?php
- ?>
- ]]></programlisting>
- <para>
- Short tags are never allowed. For files containing only <acronym>PHP</acronym>
- code, the closing tag must always be omitted (See <link
- linkend="coding-standard.php-file-formatting.general">General standards</link>).
- </para>
- </sect2>
- <sect2 id="coding-standard.coding-style.strings">
- <title>Strings</title>
- <sect3 id="coding-standard.coding-style.strings.literals">
- <title>String Literals</title>
- <para>
- When a string is literal (contains no variable substitutions), the apostrophe or
- "single quote" should always be used to demarcate the string:
- </para>
- <programlisting language="php"><![CDATA[
- $a = 'Example String';
- ]]></programlisting>
- </sect3>
- <sect3 id="coding-standard.coding-style.strings.literals-containing-apostrophes">
- <title>String Literals Containing Apostrophes</title>
- <para>
- When a literal string itself contains apostrophes, it is permitted to demarcate
- the string with quotation marks or "double quotes". This is especially useful
- for <constant>SQL</constant> statements:
- </para>
- <programlisting language="php"><![CDATA[
- $sql = "SELECT `id`, `name` from `people` "
- . "WHERE `name`='Fred' OR `name`='Susan'";
- ]]></programlisting>
- <para>
- This syntax is preferred over escaping apostrophes as it is much easier to read.
- </para>
- </sect3>
- <sect3 id="coding-standard.coding-style.strings.variable-substitution">
- <title>Variable Substitution</title>
- <para>
- Variable substitution is permitted using either of these forms:
- </para>
- <programlisting language="php"><![CDATA[
- $greeting = "Hello $name, welcome back!";
- $greeting = "Hello {$name}, welcome back!";
- ]]></programlisting>
- <para>
- For consistency, this form is not permitted:
- </para>
- <programlisting language="php"><![CDATA[
- $greeting = "Hello ${name}, welcome back!";
- ]]></programlisting>
- </sect3>
- <sect3 id="coding-standard.coding-style.strings.string-concatenation">
- <title>String Concatenation</title>
- <para>
- Strings must be concatenated using the "." operator. A space must always
- be added before and after the "." operator to improve readability:
- </para>
- <programlisting language="php"><![CDATA[
- $company = 'Zend' . ' ' . 'Technologies';
- ]]></programlisting>
- <para>
- When concatenating strings with the "." operator, it is encouraged to
- break the statement into multiple lines to improve readability. In these
- cases, each successive line should be padded with white space such that the
- "."; operator is aligned under the "=" operator:
- </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>Numerically Indexed Arrays</title>
- <para>Negative numbers are not permitted as indices.</para>
- <para>
- An indexed array may start with any non-negative number, however
- all base indices besides 0 are discouraged.
- </para>
- <para>
- When declaring indexed arrays with the <type>Array</type> function, a trailing
- space must be added after each comma delimiter to improve readability:
- </para>
- <programlisting language="php"><![CDATA[
- $sampleArray = array(1, 2, 3, 'Zend', 'Studio');
- ]]></programlisting>
- <para>
- It is permitted to declare multi-line indexed arrays using the "array"
- construct. In this case, each successive line must be padded with spaces such
- that beginning of each line is aligned:
- </para>
- <programlisting language="php"><![CDATA[
- $sampleArray = array(1, 2, 3, 'Zend', 'Studio',
- $a, $b, $c,
- 56.44, $d, 500);
- ]]></programlisting>
- <para>
- Alternately, the initial array item may begin on the following line. If so,
- it should be padded at one indentation level greater than the line containing
- the array declaration, and all successive lines should have the same
- indentation; the closing paren should be on a line by itself at the same
- indentation level as the line containing the array declaration:
- </para>
- <programlisting language="php"><![CDATA[
- $sampleArray = array(
- 1, 2, 3, 'Zend', 'Studio',
- $a, $b, $c,
- 56.44, $d, 500,
- );
- ]]></programlisting>
- <para>
- When using this latter declaration, we encourage using a trailing comma for
- the last item in the array; this minimizes the impact of adding new items on
- successive lines, and helps to ensure no parse errors occur due to a missing
- comma.
- </para>
- </sect3>
- <sect3 id="coding-standard.coding-style.arrays.associative">
- <title>Associative Arrays</title>
- <para>
- When declaring associative arrays with the <type>Array</type> construct,
- breaking the statement into multiple lines is encouraged. In this case, each
- successive line must be padded with white space such that both the keys and the
- values are aligned:
- </para>
- <programlisting language="php"><![CDATA[
- $sampleArray = array('firstKey' => 'firstValue',
- 'secondKey' => 'secondValue');
- ]]></programlisting>
- <para>
- Alternately, the initial array item may begin on the following line. If so,
- it should be padded at one indentation level greater than the line containing
- the array declaration, and all successive lines should have the same
- indentation; the closing paren should be on a line by itself at the same
- indentation level as the line containing the array declaration. For
- readability, the various "=>" assignment operators should be padded such that
- they align.
- </para>
- <programlisting language="php"><![CDATA[
- $sampleArray = array(
- 'firstKey' => 'firstValue',
- 'secondKey' => 'secondValue',
- );
- ]]></programlisting>
- <para>
- When using this latter declaration, we encourage using a trailing comma for
- the last item in the array; this minimizes the impact of adding new items on
- successive lines, and helps to ensure no parse errors occur due to a missing
- comma.
- </para>
- </sect3>
- </sect2>
- <sect2 id="coding-standard.coding-style.classes">
- <title>Classes</title>
- <sect3 id="coding-standard.coding-style.classes.declaration">
- <title>Class Declaration</title>
- <para>
- Classes must be named according to Zend Framework's naming conventions.
- </para>
- <para>
- The brace should always be written on the line underneath the class name.
- </para>
- <para>
- Every class must have a documentation block that conforms to the PHPDocumentor
- standard.
- </para>
- <para>
- All code in a class must be indented with four spaces.
- </para>
- <para>
- Only one class is permitted in each <acronym>PHP</acronym> file.
- </para>
- <para>
- Placing additional code in class files is permitted but discouraged.
- In such files, two blank lines must separate the class from any additional
- <acronym>PHP</acronym> code in the class file.
- </para>
- <para>
- The following is an example of an acceptable class declaration:
- </para>
- <programlisting language="php"><![CDATA[
- /**
- * Documentation Block Here
- */
- class SampleClass
- {
- // all contents of class
- // must be indented four spaces
- }
- ]]></programlisting>
- <para>
- Classes that extend other classes or which implement interfaces should
- declare their dependencies on the same line when possible.
- </para>
- <programlisting language="php"><![CDATA[
- class SampleClass extends FooAbstract implements BarInterface
- {
- }
- ]]></programlisting>
- <para>
- If as a result of such declarations, the line length exceeds the <link
- linkend="coding-standard.php-file-formatting.max-line-length">maximum line
- length</link>, break the line before the "extends" and/or "implements"
- keywords, and pad those lines by one indentation level.
- </para>
- <programlisting language="php"><![CDATA[
- class SampleClass
- extends FooAbstract
- implements BarInterface
- {
- }
- ]]></programlisting>
- <para>
- 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.
- </para>
- <programlisting language="php"><![CDATA[
- class SampleClass
- implements BarInterface,
- BazInterface
- {
- }
- ]]></programlisting>
- </sect3>
- <sect3 id="coding-standard.coding-style.classes.member-variables">
- <title>Class Member Variables</title>
- <para>
- Member variables must be named according to Zend Framework's variable naming
- conventions.
- </para>
- <para>
- Any variables declared in a class must be listed at the top of the class, above
- the declaration of any methods.
- </para>
- <para>
- The <emphasis>var</emphasis> construct is not permitted. Member variables always
- declare their visibility by using one of the <property>private</property>,
- <property>protected</property>, or <property>public</property> modifiers. Giving
- access to member variables directly by declaring them as public is permitted but
- discouraged in favor of accessor methods (set & get).
- </para>
- </sect3>
- </sect2>
- <sect2 id="coding-standard.coding-style.functions-and-methods">
- <title>Functions and Methods</title>
- <sect3 id="coding-standard.coding-style.functions-and-methods.declaration">
- <title>Function and Method Declaration</title>
- <para>
- Functions must be named according to Zend Framework's function naming
- conventions.
- </para>
- <para>
- Methods inside classes must always declare their visibility by using
- one of the <property>private</property>, <property>protected</property>,
- or <property>public</property> modifiers.
- </para>
- <para>
- As with classes, the brace should always be written on the line underneath the
- function name. Space between the function name and the opening parenthesis for
- the arguments is not permitted.
- </para>
- <para>
- Functions in the global scope are strongly discouraged.
- </para>
- <para>
- The following is an example of an acceptable function declaration in a class:
- </para>
- <programlisting language="php"><![CDATA[
- /**
- * Documentation Block Here
- */
- class Foo
- {
- /**
- * Documentation Block Here
- */
- public function bar()
- {
- // all contents of function
- // must be indented four spaces
- }
- }
- ]]></programlisting>
- <para>
- In cases where the argument list exceeds the <link
- linkend="coding-standard.php-file-formatting.max-line-length">maximum line
- length</link>, 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:
- </para>
- <programlisting language="php"><![CDATA[
- /**
- * Documentation Block Here
- */
- class Foo
- {
- /**
- * Documentation Block Here
- */
- public function bar($arg1, $arg2, $arg3,
- $arg4, $arg5, $arg6
- ) {
- // all contents of function
- // must be indented four spaces
- }
- }
- ]]></programlisting>
- <note>
- <para>
- Pass-by-reference is the only parameter passing mechanism permitted in a
- method declaration.
- </para>
- </note>
- <programlisting language="php"><![CDATA[
- /**
- * Documentation Block Here
- */
- class Foo
- {
- /**
- * Documentation Block Here
- */
- public function bar(&$baz)
- {}
- }
- ]]></programlisting>
- <para>
- Call-time pass-by-reference is strictly prohibited.
- </para>
- <para>
- The return value must not be enclosed in parentheses. This can hinder
- readability, in additional to breaking code if a method is later changed to
- return by reference.
- </para>
- <programlisting language="php"><![CDATA[
- /**
- * Documentation Block Here
- */
- class Foo
- {
- /**
- * WRONG
- */
- public function bar()
- {
- return($this->bar);
- }
- /**
- * RIGHT
- */
- public function bar()
- {
- return $this->bar;
- }
- }
- ]]></programlisting>
- </sect3>
- <sect3 id="coding-standard.coding-style.functions-and-methods.usage">
- <title>Function and Method Usage</title>
- <para>
- Function arguments should be separated by a single trailing space after the
- comma delimiter. The following is an example of an acceptable invocation of a
- function that takes three arguments:
- </para>
- <programlisting language="php"><![CDATA[
- threeArguments(1, 2, 3);
- ]]></programlisting>
- <para>
- Call-time pass-by-reference is strictly prohibited. See the function
- declarations section for the proper way to pass function arguments by-reference.
- </para>
- <para>
- In passing arrays as arguments to a function, the function call may include the
- "array" hint and may be split into multiple lines to improve readability. In
- such cases, the normal guidelines for writing arrays still apply:
- </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>Control Statements</title>
- <sect3 id="coding-standard.coding-style.control-statements.if-else-elseif">
- <title>If/Else/Elseif</title>
- <para>
- Control statements based on the <emphasis>if</emphasis> and
- <emphasis>elseif</emphasis> constructs must have a single space before the
- opening parenthesis of the conditional and a single space after the closing
- parenthesis.
- </para>
- <para>
- Within the conditional statements between the parentheses, operators must be
- separated by spaces for readability. Inner parentheses are encouraged to improve
- logical grouping for larger conditional expressions.
- </para>
- <para>
- The opening brace is written on the same line as the conditional statement. The
- closing brace is always written on its own line. Any content within the braces
- must be indented using four spaces.
- </para>
- <programlisting language="php"><![CDATA[
- if ($a != 2) {
- $a = 2;
- }
- ]]></programlisting>
- <para>
- If the conditional statement causes the line length to exceed the <link
- linkend="coding-standard.php-file-formatting.max-line-length">maximum line
- length</link> 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.
- </para>
- <programlisting language="php"><![CDATA[
- if (($a == $b)
- && ($b == $c)
- || (Foo::CONST == $d)
- ) {
- $a = $d;
- }
- ]]></programlisting>
- <para>
- The intention of this latter declaration format is to prevent issues when
- adding or removing clauses from the conditional during later revisions.
- </para>
- <para>
- For "if" statements that include "elseif" or "else", the formatting conventions
- are similar to the "if" construct. The following examples demonstrate proper
- formatting for "if" statements with "else" and/or "elseif" constructs:
- </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>
- <acronym>PHP</acronym> allows statements to be written without braces in some
- circumstances. This coding standard makes no differentiation- all "if",
- "elseif" or "else" statements must use braces.
- </para>
- </sect3>
- <sect3 id="coding-standards.coding-style.control-statements.switch">
- <title>Switch</title>
- <para>
- Control statements written with the "switch" statement must have a single space
- before the opening parenthesis of the conditional statement and after the
- closing parenthesis.
- </para>
- <para>
- All content within the "switch" statement must be indented using four spaces.
- Content under each "case" statement must be indented using an additional four
- spaces.
- </para>
- <programlisting language="php"><![CDATA[
- switch ($numPeople) {
- case 1:
- break;
- case 2:
- break;
- default:
- break;
- }
- ]]></programlisting>
- <para>
- The construct <property>default</property> should never be omitted from a
- <property>switch</property> statement.
- </para>
- <note>
- <para>
- It is sometimes useful to write a <property>case</property> statement
- which falls through to the next case by not including a
- <property>break</property> or <property>return</property> within that
- case. To distinguish these cases from bugs, any <property>case</property>
- statement where <property>break</property> or <property>return</property>
- are omitted should contain a comment indicating that the break was
- intentionally omitted.
- </para>
- </note>
- </sect3>
- </sect2>
- <sect2 id="coding-standards.inline-documentation">
- <title>Inline Documentation</title>
- <sect3 id="coding-standards.inline-documentation.documentation-format">
- <title>Documentation Format</title>
- <para>
- All documentation blocks ("docblocks") must be compatible with the phpDocumentor
- format. Describing the phpDocumentor format is beyond the scope of this
- document. For more information, visit: <ulink
- url="http://phpdoc.org/">http://phpdoc.org/</ulink>
- </para>
- <para>
- All class files must contain a "file-level" docblock at the top of each file and
- a "class-level" docblock immediately above each class. Examples of such
- docblocks can be found below.
- </para>
- </sect3>
- <sect3 id="coding-standards.inline-documentation.files">
- <title>Files</title>
- <para>
- Every file that contains <acronym>PHP</acronym> code must have a docblock at
- the top of the file that contains these phpDocumentor tags at a minimum:
- </para>
- <programlisting language="php"><![CDATA[
- /**
- * Short description for file
- *
- * Long description for file (if any)...
- *
- * LICENSE: Some license information
- *
- * @category Zend
- * @package Zend_Magic
- * @subpackage Wand
- * @copyright Copyright (c) 2005-2015 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>
- The <property>@category</property> annotation must have a value of "Zend".
- </para>
- <para>
- The <property>@package</property> 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.
- </para>
- <para>
- The <property>@subpackage</property> 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
- "<classname>Zend_Magic_Wand</classname>", or uses that classname as part of its
- prefix.
- </para>
- </sect3>
- <sect3 id="coding-standards.inline-documentation.classes">
- <title>Classes</title>
- <para>
- Every class must have a docblock that contains these phpDocumentor tags at a
- minimum:
- </para>
- <programlisting language="php"><![CDATA[
- /**
- * Short description for class
- *
- * Long description for class (if any)...
- *
- * @category Zend
- * @package Zend_Magic
- * @subpackage Wand
- * @copyright Copyright (c) 2005-2015 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>
- The <property>@category</property> annotation must have a value of "Zend".
- </para>
- <para>
- The <property>@package</property> 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.
- </para>
- <para>
- The <property>@subpackage</property> 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
- "<classname>Zend_Magic_Wand</classname>", or uses that classname as part of its
- prefix.
- </para>
- </sect3>
- <sect3 id="coding-standards.inline-documentation.functions">
- <title>Functions</title>
- <para>
- Every function, including object methods, must have a docblock that contains at
- a minimum:
- </para>
- <itemizedlist>
- <listitem><para>A description of the function</para></listitem>
- <listitem><para>All of the arguments</para></listitem>
- <listitem><para>All of the possible return values</para></listitem>
- </itemizedlist>
- <para>
- It is not necessary to use the "@access" tag because the access level is already
- known from the "public", "private", or "protected" modifier used to declare the
- function.
- </para>
- <para>
- If a function or method may throw an exception, use @throws for all known
- exception classes:
- </para>
- <programlisting language="php"><![CDATA[
- @throws exceptionclass [description]
- ]]></programlisting>
- </sect3>
- </sect2>
- </sect1>
- </appendix>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|