... | @@ -143,16 +143,6 @@ class FooBar { |
... | @@ -143,16 +143,6 @@ class FooBar { |
|
|
|
|
|
## [PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md)
|
|
## [PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md)
|
|
|
|
|
|
|
|
|
|
[PSR-1](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md)
|
|
|
|
|
|
|
|
- ~~Opening braces for classes MUST go on the next line, and closing braces MUST go on the next line after the body.~~
|
|
|
|
- ~~Opening braces for methods MUST go on the next line, and closing braces MUST go on the next line after the body.~~
|
|
|
|
|
|
|
|
[PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Autoloading Standard
|
|
Autoloading Standard
|
|
====================
|
|
====================
|
|
|
|
|
... | @@ -227,3 +217,1012 @@ The following gist is a sample SplClassLoader implementation that can |
... | @@ -227,3 +217,1012 @@ The following gist is a sample SplClassLoader implementation that can |
|
load your classes if you follow the autoloader interoperability
|
|
load your classes if you follow the autoloader interoperability
|
|
standards proposed above. It is the current recommended way to load PHP
|
|
standards proposed above. It is the current recommended way to load PHP
|
|
5.3 classes that follow these standards.
|
|
5.3 classes that follow these standards.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
[PSR-1](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md)
|
|
|
|
|
|
|
|
- ~~Opening braces for classes MUST go on the next line, and closing braces MUST go on the next line after the body.~~
|
|
|
|
- ~~Opening braces for methods MUST go on the next line, and closing braces MUST go on the next line after the body.~~
|
|
|
|
|
|
|
|
Basic Coding Standard
|
|
|
|
=====================
|
|
|
|
|
|
|
|
This section of the standard comprises what should be considered the standard
|
|
|
|
coding elements that are required to ensure a high level of technical
|
|
|
|
interoperability between shared PHP code.
|
|
|
|
|
|
|
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
|
|
|
|
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
|
|
|
|
interpreted as described in [RFC 2119].
|
|
|
|
|
|
|
|
[RFC 2119]: http://www.ietf.org/rfc/rfc2119.txt
|
|
|
|
[PSR-0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
|
|
|
|
[PSR-4]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md
|
|
|
|
|
|
|
|
|
|
|
|
1. Overview
|
|
|
|
-----------
|
|
|
|
|
|
|
|
- Files MUST use only `<?php` and `<?=` tags.
|
|
|
|
|
|
|
|
- Files MUST use only UTF-8 without BOM for PHP code.
|
|
|
|
|
|
|
|
- Files SHOULD *either* declare symbols (classes, functions, constants, etc.)
|
|
|
|
*or* cause side-effects (e.g. generate output, change .ini settings, etc.)
|
|
|
|
but SHOULD NOT do both.
|
|
|
|
|
|
|
|
- Namespaces and classes MUST follow an "autoloading" PSR: [[PSR-0], [PSR-4]].
|
|
|
|
|
|
|
|
- Class names MUST be declared in `StudlyCaps`.
|
|
|
|
|
|
|
|
- Class constants MUST be declared in all upper case with underscore separators.
|
|
|
|
|
|
|
|
- Method names MUST be declared in `camelCase`.
|
|
|
|
|
|
|
|
|
|
|
|
2. Files
|
|
|
|
--------
|
|
|
|
|
|
|
|
### 2.1. PHP Tags
|
|
|
|
|
|
|
|
PHP code MUST use the long `<?php ?>` tags or the short-echo `<?= ?>` tags; it
|
|
|
|
MUST NOT use the other tag variations.
|
|
|
|
|
|
|
|
### 2.2. Character Encoding
|
|
|
|
|
|
|
|
PHP code MUST use only UTF-8 without BOM.
|
|
|
|
|
|
|
|
### 2.3. Side Effects
|
|
|
|
|
|
|
|
A file SHOULD declare new symbols (classes, functions, constants,
|
|
|
|
etc.) and cause no other side effects, or it SHOULD execute logic with side
|
|
|
|
effects, but SHOULD NOT do both.
|
|
|
|
|
|
|
|
The phrase "side effects" means execution of logic not directly related to
|
|
|
|
declaring classes, functions, constants, etc., *merely from including the
|
|
|
|
file*.
|
|
|
|
|
|
|
|
"Side effects" include but are not limited to: generating output, explicit
|
|
|
|
use of `require` or `include`, connecting to external services, modifying ini
|
|
|
|
settings, emitting errors or exceptions, modifying global or static variables,
|
|
|
|
reading from or writing to a file, and so on.
|
|
|
|
|
|
|
|
The following is an example of a file with both declarations and side effects;
|
|
|
|
i.e, an example of what to avoid:
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
// side effect: change ini settings
|
|
|
|
ini_set('error_reporting', E_ALL);
|
|
|
|
|
|
|
|
// side effect: loads a file
|
|
|
|
include "file.php";
|
|
|
|
|
|
|
|
// side effect: generates output
|
|
|
|
echo "<html>\n";
|
|
|
|
|
|
|
|
// declaration
|
|
|
|
function foo()
|
|
|
|
{
|
|
|
|
// function body
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
The following example is of a file that contains declarations without side
|
|
|
|
effects; i.e., an example of what to emulate:
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
// declaration
|
|
|
|
function foo()
|
|
|
|
{
|
|
|
|
// function body
|
|
|
|
}
|
|
|
|
|
|
|
|
// conditional declaration is *not* a side effect
|
|
|
|
if (! function_exists('bar')) {
|
|
|
|
function bar()
|
|
|
|
{
|
|
|
|
// function body
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
3. Namespace and Class Names
|
|
|
|
----------------------------
|
|
|
|
|
|
|
|
Namespaces and classes MUST follow [PSR-0].
|
|
|
|
|
|
|
|
This means each class is in a file by itself, and is in a namespace of at
|
|
|
|
least one level: a top-level vendor name.
|
|
|
|
|
|
|
|
Class names MUST be declared in `StudlyCaps`.
|
|
|
|
|
|
|
|
Code written for PHP 5.3 and after MUST use formal namespaces.
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
// PHP 5.3 and later:
|
|
|
|
namespace Vendor\Model;
|
|
|
|
|
|
|
|
class Foo
|
|
|
|
{
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Code written for 5.2.x and before SHOULD use the pseudo-namespacing convention
|
|
|
|
of `Vendor_` prefixes on class names.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
// PHP 5.2.x and earlier:
|
|
|
|
class Vendor_Model_Foo
|
|
|
|
{
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
4. Class Constants, Properties, and Methods
|
|
|
|
-------------------------------------------
|
|
|
|
|
|
|
|
The term "class" refers to all classes, interfaces, and traits.
|
|
|
|
|
|
|
|
### 4.1. Constants
|
|
|
|
|
|
|
|
Class constants MUST be declared in all upper case with underscore separators.
|
|
|
|
For example:
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Model;
|
|
|
|
|
|
|
|
class Foo
|
|
|
|
{
|
|
|
|
const VERSION = '1.0';
|
|
|
|
const DATE_APPROVED = '2012-06-01';
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 4.2. Properties
|
|
|
|
|
|
|
|
This guide intentionally avoids any recommendation regarding the use of
|
|
|
|
`$StudlyCaps`, `$camelCase`, or `$under_score` property names.
|
|
|
|
|
|
|
|
Whatever naming convention is used SHOULD be applied consistently within a
|
|
|
|
reasonable scope. That scope may be vendor-level, package-level, class-level,
|
|
|
|
or method-level.
|
|
|
|
|
|
|
|
### 4.3. Methods
|
|
|
|
|
|
|
|
Method names MUST be declared in `camelCase()`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
|
|
|
|
|
|
|
|
|
|
|
|
Coding Style Guide
|
|
|
|
==================
|
|
|
|
|
|
|
|
This guide extends and expands on [PSR-1], the basic coding standard.
|
|
|
|
|
|
|
|
The intent of this guide is to reduce cognitive friction when scanning code
|
|
|
|
from different authors. It does so by enumerating a shared set of rules and
|
|
|
|
expectations about how to format PHP code.
|
|
|
|
|
|
|
|
The style rules herein are derived from commonalities among the various member
|
|
|
|
projects. When various authors collaborate across multiple projects, it helps
|
|
|
|
to have one set of guidelines to be used among all those projects. Thus, the
|
|
|
|
benefit of this guide is not in the rules themselves, but in the sharing of
|
|
|
|
those rules.
|
|
|
|
|
|
|
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
|
|
|
|
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
|
|
|
|
interpreted as described in [RFC 2119].
|
|
|
|
|
|
|
|
[RFC 2119]: http://www.ietf.org/rfc/rfc2119.txt
|
|
|
|
[PSR-0]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
|
|
|
|
[PSR-1]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md
|
|
|
|
|
|
|
|
|
|
|
|
1. Overview
|
|
|
|
-----------
|
|
|
|
|
|
|
|
- Code MUST follow a "coding style guide" PSR [[PSR-1]].
|
|
|
|
|
|
|
|
- Code MUST use 4 spaces for indenting, not tabs.
|
|
|
|
|
|
|
|
- There MUST NOT be a hard limit on line length; the soft limit MUST be 120
|
|
|
|
characters; lines SHOULD be 80 characters or less.
|
|
|
|
|
|
|
|
- There MUST be one blank line after the `namespace` declaration, and there
|
|
|
|
MUST be one blank line after the block of `use` declarations.
|
|
|
|
|
|
|
|
- Opening braces for classes MUST go on the next line, and closing braces MUST
|
|
|
|
go on the next line after the body.
|
|
|
|
|
|
|
|
- Opening braces for methods MUST go on the next line, and closing braces MUST
|
|
|
|
go on the next line after the body.
|
|
|
|
|
|
|
|
- Visibility MUST be declared on all properties and methods; `abstract` and
|
|
|
|
`final` MUST be declared before the visibility; `static` MUST be declared
|
|
|
|
after the visibility.
|
|
|
|
|
|
|
|
- Control structure keywords MUST have one space after them; method and
|
|
|
|
function calls MUST NOT.
|
|
|
|
|
|
|
|
- Opening braces for control structures MUST go on the same line, and closing
|
|
|
|
braces MUST go on the next line after the body.
|
|
|
|
|
|
|
|
- Opening parentheses for control structures MUST NOT have a space after them,
|
|
|
|
and closing parentheses for control structures MUST NOT have a space before.
|
|
|
|
|
|
|
|
### 1.1. Example
|
|
|
|
|
|
|
|
This example encompasses some of the rules below as a quick overview:
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Package;
|
|
|
|
|
|
|
|
use FooInterface;
|
|
|
|
use BarClass as Bar;
|
|
|
|
use OtherVendor\OtherPackage\BazClass;
|
|
|
|
|
|
|
|
class Foo extends Bar implements FooInterface
|
|
|
|
{
|
|
|
|
public function sampleFunction($a, $b = null)
|
|
|
|
{
|
|
|
|
if ($a === $b) {
|
|
|
|
bar();
|
|
|
|
} elseif ($a > $b) {
|
|
|
|
$foo->bar($arg1);
|
|
|
|
} else {
|
|
|
|
BazClass::bar($arg2, $arg3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
final public static function bar()
|
|
|
|
{
|
|
|
|
// method body
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
2. General
|
|
|
|
----------
|
|
|
|
|
|
|
|
### 2.1 Basic Coding Standard
|
|
|
|
|
|
|
|
Code MUST follow all rules outlined in [PSR-1].
|
|
|
|
|
|
|
|
### 2.2 Files
|
|
|
|
|
|
|
|
All PHP files MUST use the Unix LF (linefeed) line ending.
|
|
|
|
|
|
|
|
All PHP files MUST end with a single blank line.
|
|
|
|
|
|
|
|
The closing `?>` tag MUST be omitted from files containing only PHP.
|
|
|
|
|
|
|
|
### 2.3. Lines
|
|
|
|
|
|
|
|
There MUST NOT be a hard limit on line length.
|
|
|
|
|
|
|
|
The soft limit on line length MUST be 120 characters; automated style checkers
|
|
|
|
MUST warn but MUST NOT error at the soft limit.
|
|
|
|
|
|
|
|
Lines SHOULD NOT be longer than 80 characters; lines longer than that SHOULD
|
|
|
|
be split into multiple subsequent lines of no more than 80 characters each.
|
|
|
|
|
|
|
|
There MUST NOT be trailing whitespace at the end of non-blank lines.
|
|
|
|
|
|
|
|
Blank lines MAY be added to improve readability and to indicate related
|
|
|
|
blocks of code.
|
|
|
|
|
|
|
|
There MUST NOT be more than one statement per line.
|
|
|
|
|
|
|
|
### 2.4. Indenting
|
|
|
|
|
|
|
|
Code MUST use an indent of 4 spaces, and MUST NOT use tabs for indenting.
|
|
|
|
|
|
|
|
> N.b.: Using only spaces, and not mixing spaces with tabs, helps to avoid
|
|
|
|
> problems with diffs, patches, history, and annotations. The use of spaces
|
|
|
|
> also makes it easy to insert fine-grained sub-indentation for inter-line
|
|
|
|
> alignment.
|
|
|
|
|
|
|
|
### 2.5. Keywords and True/False/Null
|
|
|
|
|
|
|
|
PHP [keywords] MUST be in lower case.
|
|
|
|
|
|
|
|
The PHP constants `true`, `false`, and `null` MUST be in lower case.
|
|
|
|
|
|
|
|
[keywords]: http://php.net/manual/en/reserved.keywords.php
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. Namespace and Use Declarations
|
|
|
|
---------------------------------
|
|
|
|
|
|
|
|
When present, there MUST be one blank line after the `namespace` declaration.
|
|
|
|
|
|
|
|
When present, all `use` declarations MUST go after the `namespace`
|
|
|
|
declaration.
|
|
|
|
|
|
|
|
There MUST be one `use` keyword per declaration.
|
|
|
|
|
|
|
|
There MUST be one blank line after the `use` block.
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Package;
|
|
|
|
|
|
|
|
use FooClass;
|
|
|
|
use BarClass as Bar;
|
|
|
|
use OtherVendor\OtherPackage\BazClass;
|
|
|
|
|
|
|
|
// ... additional PHP code ...
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
4. Classes, Properties, and Methods
|
|
|
|
-----------------------------------
|
|
|
|
|
|
|
|
The term "class" refers to all classes, interfaces, and traits.
|
|
|
|
|
|
|
|
### 4.1. Extends and Implements
|
|
|
|
|
|
|
|
The `extends` and `implements` keywords MUST be declared on the same line as
|
|
|
|
the class name.
|
|
|
|
|
|
|
|
The opening brace for the class MUST go on its own line; the closing brace
|
|
|
|
for the class MUST go on the next line after the body.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Package;
|
|
|
|
|
|
|
|
use FooClass;
|
|
|
|
use BarClass as Bar;
|
|
|
|
use OtherVendor\OtherPackage\BazClass;
|
|
|
|
|
|
|
|
class ClassName extends ParentClass implements \ArrayAccess, \Countable
|
|
|
|
{
|
|
|
|
// constants, properties, methods
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Lists of `implements` MAY be split across multiple lines, where each
|
|
|
|
subsequent line is indented once. When doing so, the first item in the list
|
|
|
|
MUST be on the next line, and there MUST be only one interface per line.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Package;
|
|
|
|
|
|
|
|
use FooClass;
|
|
|
|
use BarClass as Bar;
|
|
|
|
use OtherVendor\OtherPackage\BazClass;
|
|
|
|
|
|
|
|
class ClassName extends ParentClass implements
|
|
|
|
\ArrayAccess,
|
|
|
|
\Countable,
|
|
|
|
\Serializable
|
|
|
|
{
|
|
|
|
// constants, properties, methods
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 4.2. Properties
|
|
|
|
|
|
|
|
Visibility MUST be declared on all properties.
|
|
|
|
|
|
|
|
The `var` keyword MUST NOT be used to declare a property.
|
|
|
|
|
|
|
|
There MUST NOT be more than one property declared per statement.
|
|
|
|
|
|
|
|
Property names SHOULD NOT be prefixed with a single underscore to indicate
|
|
|
|
protected or private visibility.
|
|
|
|
|
|
|
|
A property declaration looks like the following.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Package;
|
|
|
|
|
|
|
|
class ClassName
|
|
|
|
{
|
|
|
|
public $foo = null;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 4.3. Methods
|
|
|
|
|
|
|
|
Visibility MUST be declared on all methods.
|
|
|
|
|
|
|
|
Method names SHOULD NOT be prefixed with a single underscore to indicate
|
|
|
|
protected or private visibility.
|
|
|
|
|
|
|
|
Method names MUST NOT be declared with a space after the method name. The
|
|
|
|
opening brace MUST go on its own line, and the closing brace MUST go on the
|
|
|
|
next line following the body. There MUST NOT be a space after the opening
|
|
|
|
parenthesis, and there MUST NOT be a space before the closing parenthesis.
|
|
|
|
|
|
|
|
A method declaration looks like the following. Note the placement of
|
|
|
|
parentheses, commas, spaces, and braces:
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Package;
|
|
|
|
|
|
|
|
class ClassName
|
|
|
|
{
|
|
|
|
public function fooBarBaz($arg1, &$arg2, $arg3 = [])
|
|
|
|
{
|
|
|
|
// method body
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 4.4. Method Arguments
|
|
|
|
|
|
|
|
In the argument list, there MUST NOT be a space before each comma, and there
|
|
|
|
MUST be one space after each comma.
|
|
|
|
|
|
|
|
Method arguments with default values MUST go at the end of the argument
|
|
|
|
list.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Package;
|
|
|
|
|
|
|
|
class ClassName
|
|
|
|
{
|
|
|
|
public function foo($arg1, &$arg2, $arg3 = [])
|
|
|
|
{
|
|
|
|
// method body
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Argument lists MAY be split across multiple lines, where each subsequent line
|
|
|
|
is indented once. When doing so, the first item in the list MUST be on the
|
|
|
|
next line, and there MUST be only one argument per line.
|
|
|
|
|
|
|
|
When the argument list is split across multiple lines, the closing parenthesis
|
|
|
|
and opening brace MUST be placed together on their own line with one space
|
|
|
|
between them.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Package;
|
|
|
|
|
|
|
|
class ClassName
|
|
|
|
{
|
|
|
|
public function aVeryLongMethodName(
|
|
|
|
ClassTypeHint $arg1,
|
|
|
|
&$arg2,
|
|
|
|
array $arg3 = []
|
|
|
|
) {
|
|
|
|
// method body
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 4.5. `abstract`, `final`, and `static`
|
|
|
|
|
|
|
|
When present, the `abstract` and `final` declarations MUST precede the
|
|
|
|
visibility declaration.
|
|
|
|
|
|
|
|
When present, the `static` declaration MUST come after the visibility
|
|
|
|
declaration.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
namespace Vendor\Package;
|
|
|
|
|
|
|
|
abstract class ClassName
|
|
|
|
{
|
|
|
|
protected static $foo;
|
|
|
|
|
|
|
|
abstract protected function zim();
|
|
|
|
|
|
|
|
final public static function bar()
|
|
|
|
{
|
|
|
|
// method body
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 4.6. Method and Function Calls
|
|
|
|
|
|
|
|
When making a method or function call, there MUST NOT be a space between the
|
|
|
|
method or function name and the opening parenthesis, there MUST NOT be a space
|
|
|
|
after the opening parenthesis, and there MUST NOT be a space before the
|
|
|
|
closing parenthesis. In the argument list, there MUST NOT be a space before
|
|
|
|
each comma, and there MUST be one space after each comma.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
bar();
|
|
|
|
$foo->bar($arg1);
|
|
|
|
Foo::bar($arg2, $arg3);
|
|
|
|
```
|
|
|
|
|
|
|
|
Argument lists MAY be split across multiple lines, where each subsequent line
|
|
|
|
is indented once. When doing so, the first item in the list MUST be on the
|
|
|
|
next line, and there MUST be only one argument per line.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
$foo->bar(
|
|
|
|
$longArgument,
|
|
|
|
$longerArgument,
|
|
|
|
$muchLongerArgument
|
|
|
|
);
|
|
|
|
```
|
|
|
|
|
|
|
|
5. Control Structures
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
The general style rules for control structures are as follows:
|
|
|
|
|
|
|
|
- There MUST be one space after the control structure keyword
|
|
|
|
- There MUST NOT be a space after the opening parenthesis
|
|
|
|
- There MUST NOT be a space before the closing parenthesis
|
|
|
|
- There MUST be one space between the closing parenthesis and the opening
|
|
|
|
brace
|
|
|
|
- The structure body MUST be indented once
|
|
|
|
- The closing brace MUST be on the next line after the body
|
|
|
|
|
|
|
|
The body of each structure MUST be enclosed by braces. This standardizes how
|
|
|
|
the structures look, and reduces the likelihood of introducing errors as new
|
|
|
|
lines get added to the body.
|
|
|
|
|
|
|
|
|
|
|
|
### 5.1. `if`, `elseif`, `else`
|
|
|
|
|
|
|
|
An `if` structure looks like the following. Note the placement of parentheses,
|
|
|
|
spaces, and braces; and that `else` and `elseif` are on the same line as the
|
|
|
|
closing brace from the earlier body.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
if ($expr1) {
|
|
|
|
// if body
|
|
|
|
} elseif ($expr2) {
|
|
|
|
// elseif body
|
|
|
|
} else {
|
|
|
|
// else body;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
The keyword `elseif` SHOULD be used instead of `else if` so that all control
|
|
|
|
keywords look like single words.
|
|
|
|
|
|
|
|
|
|
|
|
### 5.2. `switch`, `case`
|
|
|
|
|
|
|
|
A `switch` structure looks like the following. Note the placement of
|
|
|
|
parentheses, spaces, and braces. The `case` statement MUST be indented once
|
|
|
|
from `switch`, and the `break` keyword (or other terminating keyword) MUST be
|
|
|
|
indented at the same level as the `case` body. There MUST be a comment such as
|
|
|
|
`// no break` when fall-through is intentional in a non-empty `case` body.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
switch ($expr) {
|
|
|
|
case 0:
|
|
|
|
echo 'First case, with a break';
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
echo 'Second case, which falls through';
|
|
|
|
// no break
|
|
|
|
case 2:
|
|
|
|
case 3:
|
|
|
|
case 4:
|
|
|
|
echo 'Third case, return instead of break';
|
|
|
|
return;
|
|
|
|
default:
|
|
|
|
echo 'Default case';
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 5.3. `while`, `do while`
|
|
|
|
|
|
|
|
A `while` statement looks like the following. Note the placement of
|
|
|
|
parentheses, spaces, and braces.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
while ($expr) {
|
|
|
|
// structure body
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Similarly, a `do while` statement looks like the following. Note the placement
|
|
|
|
of parentheses, spaces, and braces.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
do {
|
|
|
|
// structure body;
|
|
|
|
} while ($expr);
|
|
|
|
```
|
|
|
|
|
|
|
|
### 5.4. `for`
|
|
|
|
|
|
|
|
A `for` statement looks like the following. Note the placement of parentheses,
|
|
|
|
spaces, and braces.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
for ($i = 0; $i < 10; $i++) {
|
|
|
|
// for body
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 5.5. `foreach`
|
|
|
|
|
|
|
|
A `foreach` statement looks like the following. Note the placement of
|
|
|
|
parentheses, spaces, and braces.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
foreach ($iterable as $key => $value) {
|
|
|
|
// foreach body
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
### 5.6. `try`, `catch`
|
|
|
|
|
|
|
|
A `try catch` block looks like the following. Note the placement of
|
|
|
|
parentheses, spaces, and braces.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
try {
|
|
|
|
// try body
|
|
|
|
} catch (FirstExceptionType $e) {
|
|
|
|
// catch body
|
|
|
|
} catch (OtherExceptionType $e) {
|
|
|
|
// catch body
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
6. Closures
|
|
|
|
-----------
|
|
|
|
|
|
|
|
Closures MUST be declared with a space after the `function` keyword, and a
|
|
|
|
space before and after the `use` keyword.
|
|
|
|
|
|
|
|
The opening brace MUST go on the same line, and the closing brace MUST go on
|
|
|
|
the next line following the body.
|
|
|
|
|
|
|
|
There MUST NOT be a space after the opening parenthesis of the argument list
|
|
|
|
or variable list, and there MUST NOT be a space before the closing parenthesis
|
|
|
|
of the argument list or variable list.
|
|
|
|
|
|
|
|
In the argument list and variable list, there MUST NOT be a space before each
|
|
|
|
comma, and there MUST be one space after each comma.
|
|
|
|
|
|
|
|
Closure arguments with default values MUST go at the end of the argument
|
|
|
|
list.
|
|
|
|
|
|
|
|
A closure declaration looks like the following. Note the placement of
|
|
|
|
parentheses, commas, spaces, and braces:
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
$closureWithArgs = function ($arg1, $arg2) {
|
|
|
|
// body
|
|
|
|
};
|
|
|
|
|
|
|
|
$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
|
|
|
|
// body
|
|
|
|
};
|
|
|
|
```
|
|
|
|
|
|
|
|
Argument lists and variable lists MAY be split across multiple lines, where
|
|
|
|
each subsequent line is indented once. When doing so, the first item in the
|
|
|
|
list MUST be on the next line, and there MUST be only one argument or variable
|
|
|
|
per line.
|
|
|
|
|
|
|
|
When the ending list (whether or arguments or variables) is split across
|
|
|
|
multiple lines, the closing parenthesis and opening brace MUST be placed
|
|
|
|
together on their own line with one space between them.
|
|
|
|
|
|
|
|
The following are examples of closures with and without argument lists and
|
|
|
|
variable lists split across multiple lines.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
$longArgs_noVars = function (
|
|
|
|
$longArgument,
|
|
|
|
$longerArgument,
|
|
|
|
$muchLongerArgument
|
|
|
|
) {
|
|
|
|
// body
|
|
|
|
};
|
|
|
|
|
|
|
|
$noArgs_longVars = function () use (
|
|
|
|
$longVar1,
|
|
|
|
$longerVar2,
|
|
|
|
$muchLongerVar3
|
|
|
|
) {
|
|
|
|
// body
|
|
|
|
};
|
|
|
|
|
|
|
|
$longArgs_longVars = function (
|
|
|
|
$longArgument,
|
|
|
|
$longerArgument,
|
|
|
|
$muchLongerArgument
|
|
|
|
) use (
|
|
|
|
$longVar1,
|
|
|
|
$longerVar2,
|
|
|
|
$muchLongerVar3
|
|
|
|
) {
|
|
|
|
// body
|
|
|
|
};
|
|
|
|
|
|
|
|
$longArgs_shortVars = function (
|
|
|
|
$longArgument,
|
|
|
|
$longerArgument,
|
|
|
|
$muchLongerArgument
|
|
|
|
) use ($var1) {
|
|
|
|
// body
|
|
|
|
};
|
|
|
|
|
|
|
|
$shortArgs_longVars = function ($arg) use (
|
|
|
|
$longVar1,
|
|
|
|
$longerVar2,
|
|
|
|
$muchLongerVar3
|
|
|
|
) {
|
|
|
|
// body
|
|
|
|
};
|
|
|
|
```
|
|
|
|
|
|
|
|
Note that the formatting rules also apply when the closure is used directly
|
|
|
|
in a function or method call as an argument.
|
|
|
|
|
|
|
|
```php
|
|
|
|
<?php
|
|
|
|
$foo->bar(
|
|
|
|
$arg1,
|
|
|
|
function ($arg2) use ($var1) {
|
|
|
|
// body
|
|
|
|
},
|
|
|
|
$arg3
|
|
|
|
);
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
7. Conclusion
|
|
|
|
--------------
|
|
|
|
|
|
|
|
There are many elements of style and practice intentionally omitted by this
|
|
|
|
guide. These include but are not limited to:
|
|
|
|
|
|
|
|
- Declaration of global variables and global constants
|
|
|
|
|
|
|
|
- Declaration of functions
|
|
|
|
|
|
|
|
- Operators and assignment
|
|
|
|
|
|
|
|
- Inter-line alignment
|
|
|
|
|
|
|
|
- Comments and documentation blocks
|
|
|
|
|
|
|
|
- Class name prefixes and suffixes
|
|
|
|
|
|
|
|
- Best practices
|
|
|
|
|
|
|
|
Future recommendations MAY revise and extend this guide to address those or
|
|
|
|
other elements of style and practice.
|
|
|
|
|
|
|
|
|
|
|
|
Appendix A. Survey
|
|
|
|
------------------
|
|
|
|
|
|
|
|
In writing this style guide, the group took a survey of member projects to
|
|
|
|
determine common practices. The survey is retained herein for posterity.
|
|
|
|
|
|
|
|
### A.1. Survey Data
|
|
|
|
|
|
|
|
url,http://www.horde.org/apps/horde/docs/CODING_STANDARDS,http://pear.php.net/manual/en/standards.php,http://solarphp.com/manual/appendix-standards.style,http://framework.zend.com/manual/en/coding-standard.html,http://symfony.com/doc/2.0/contributing/code/standards.html,http://www.ppi.io/docs/coding-standards.html,https://github.com/ezsystems/ezp-next/wiki/codingstandards,http://book.cakephp.org/2.0/en/contributing/cakephp-coding-conventions.html,https://github.com/UnionOfRAD/lithium/wiki/Spec%3A-Coding,http://drupal.org/coding-standards,http://code.google.com/p/sabredav/,http://area51.phpbb.com/docs/31x/coding-guidelines.html,https://docs.google.com/a/zikula.org/document/edit?authkey=CPCU0Us&hgd=1&id=1fcqb93Sn-hR9c0mkN6m_tyWnmEvoswKBtSc0tKkZmJA,http://www.chisimba.com,n/a,https://github.com/Respect/project-info/blob/master/coding-standards-sample.php,n/a,Object Calisthenics for PHP,http://doc.nette.org/en/coding-standard,http://flow3.typo3.org,https://github.com/propelorm/Propel2/wiki/Coding-Standards,http://developer.joomla.org/coding-standards.html
|
|
|
|
voting,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,no,no,no,?,yes,no,yes
|
|
|
|
indent_type,4,4,4,4,4,tab,4,tab,tab,2,4,tab,4,4,4,4,4,4,tab,tab,4,tab
|
|
|
|
line_length_limit_soft,75,75,75,75,no,85,120,120,80,80,80,no,100,80,80,?,?,120,80,120,no,150
|
|
|
|
line_length_limit_hard,85,85,85,85,no,no,no,no,100,?,no,no,no,100,100,?,120,120,no,no,no,no
|
|
|
|
class_names,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,studly,lower_under,studly,lower,studly,studly,studly,studly,?,studly,studly,studly
|
|
|
|
class_brace_line,next,next,next,next,next,same,next,same,same,same,same,next,next,next,next,next,next,next,next,same,next,next
|
|
|
|
constant_names,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper,upper
|
|
|
|
true_false_null,lower,lower,lower,lower,lower,lower,lower,lower,lower,upper,lower,lower,lower,upper,lower,lower,lower,lower,lower,upper,lower,lower
|
|
|
|
method_names,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel,lower_under,camel,camel,camel,camel,camel,camel,camel,camel,camel,camel
|
|
|
|
method_brace_line,next,next,next,next,next,same,next,same,same,same,same,next,next,same,next,next,next,next,next,same,next,next
|
|
|
|
control_brace_line,same,same,same,same,same,same,next,same,same,same,same,next,same,same,next,same,same,same,same,same,same,next
|
|
|
|
control_space_after,yes,yes,yes,yes,yes,no,yes,yes,yes,yes,no,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes,yes
|
|
|
|
always_use_control_braces,yes,yes,yes,yes,yes,yes,no,yes,yes,yes,no,yes,yes,yes,yes,no,yes,yes,yes,yes,yes,yes
|
|
|
|
else_elseif_line,same,same,same,same,same,same,next,same,same,next,same,next,same,next,next,same,same,same,same,same,same,next
|
|
|
|
case_break_indent_from_switch,0/1,0/1,0/1,1/2,1/2,1/2,1/2,1/1,1/1,1/2,1/2,1/1,1/2,1/2,1/2,1/2,1/2,1/2,0/1,1/1,1/2,1/2
|
|
|
|
function_space_after,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no,no
|
|
|
|
closing_php_tag_required,no,no,no,no,no,no,no,no,yes,no,no,no,no,yes,no,no,no,no,no,yes,no,no
|
|
|
|
line_endings,LF,LF,LF,LF,LF,LF,LF,LF,?,LF,?,LF,LF,LF,LF,?,,LF,?,LF,LF,LF
|
|
|
|
static_or_visibility_first,static,?,static,either,either,either,visibility,visibility,visibility,either,static,either,?,visibility,?,?,either,either,visibility,visibility,static,?
|
|
|
|
control_space_parens,no,no,no,no,no,no,yes,no,no,no,no,no,no,yes,?,no,no,no,no,no,no,no
|
|
|
|
blank_line_after_php,no,no,no,no,yes,no,no,no,no,yes,yes,no,no,yes,?,yes,yes,no,yes,no,yes,no
|
|
|
|
class_method_control_brace,next/next/same,next/next/same,next/next/same,next/next/same,next/next/same,same/same/same,next/next/next,same/same/same,same/same/same,same/same/same,same/same/same,next/next/next,next/next/same,next/same/same,next/next/next,next/next/same,next/next/same,next/next/same,next/next/same,same/same/same,next/next/same,next/next/next
|
|
|
|
|
|
|
|
### A.2. Survey Legend
|
|
|
|
|
|
|
|
`indent_type`:
|
|
|
|
The type of indenting. `tab` = "Use a tab", `2` or `4` = "number of spaces"
|
|
|
|
|
|
|
|
`line_length_limit_soft`:
|
|
|
|
The "soft" line length limit, in characters. `?` = not discernible or no response, `no` means no limit.
|
|
|
|
|
|
|
|
`line_length_limit_hard`:
|
|
|
|
The "hard" line length limit, in characters. `?` = not discernible or no response, `no` means no limit.
|
|
|
|
|
|
|
|
`class_names`:
|
|
|
|
How classes are named. `lower` = lowercase only, `lower_under` = lowercase with underscore separators, `studly` = StudlyCase.
|
|
|
|
|
|
|
|
`class_brace_line`:
|
|
|
|
Does the opening brace for a class go on the `same` line as the class keyword, or on the `next` line after it?
|
|
|
|
|
|
|
|
`constant_names`:
|
|
|
|
How are class constants named? `upper` = Uppercase with underscore separators.
|
|
|
|
|
|
|
|
`true_false_null`:
|
|
|
|
Are the `true`, `false`, and `null` keywords spelled as all `lower` case, or all `upper` case?
|
|
|
|
|
|
|
|
`method_names`:
|
|
|
|
How are methods named? `camel` = `camelCase`, `lower_under` = lowercase with underscore separators.
|
|
|
|
|
|
|
|
`method_brace_line`:
|
|
|
|
Does the opening brace for a method go on the `same` line as the method name, or on the `next` line?
|
|
|
|
|
|
|
|
`control_brace_line`:
|
|
|
|
Does the opening brace for a control structure go on the `same` line, or on the `next` line?
|
|
|
|
|
|
|
|
`control_space_after`:
|
|
|
|
Is there a space after the control structure keyword?
|
|
|
|
|
|
|
|
`always_use_control_braces`:
|
|
|
|
Do control structures always use braces?
|
|
|
|
|
|
|
|
`else_elseif_line`:
|
|
|
|
When using `else` or `elseif`, does it go on the `same` line as the previous closing brace, or does it go on the `next` line?
|
|
|
|
|
|
|
|
`case_break_indent_from_switch`:
|
|
|
|
How many times are `case` and `break` indented from an opening `switch` statement?
|
|
|
|
|
|
|
|
`function_space_after`:
|
|
|
|
Do function calls have a space after the function name and before the opening parenthesis?
|
|
|
|
|
|
|
|
`closing_php_tag_required`:
|
|
|
|
In files containing only PHP, is the closing `?>` tag required?
|
|
|
|
|
|
|
|
`line_endings`:
|
|
|
|
What type of line ending is used?
|
|
|
|
|
|
|
|
`static_or_visibility_first`:
|
|
|
|
When declaring a method, does `static` come first, or does the visibility come first?
|
|
|
|
|
|
|
|
`control_space_parens`:
|
|
|
|
In a control structure expression, is there a space after the opening parenthesis and a space before the closing parenthesis? `yes` = `if ( $expr )`, `no` = `if ($expr)`.
|
|
|
|
|
|
|
|
`blank_line_after_php`:
|
|
|
|
Is there a blank line after the opening PHP tag?
|
|
|
|
|
|
|
|
`class_method_control_brace`:
|
|
|
|
A summary of what line the opening braces go on for classes, methods, and control structures.
|
|
|
|
|
|
|
|
### A.3. Survey Results
|
|
|
|
|
|
|
|
indent_type:
|
|
|
|
tab: 7
|
|
|
|
2: 1
|
|
|
|
4: 14
|
|
|
|
line_length_limit_soft:
|
|
|
|
?: 2
|
|
|
|
no: 3
|
|
|
|
75: 4
|
|
|
|
80: 6
|
|
|
|
85: 1
|
|
|
|
100: 1
|
|
|
|
120: 4
|
|
|
|
150: 1
|
|
|
|
line_length_limit_hard:
|
|
|
|
?: 2
|
|
|
|
no: 11
|
|
|
|
85: 4
|
|
|
|
100: 3
|
|
|
|
120: 2
|
|
|
|
class_names:
|
|
|
|
?: 1
|
|
|
|
lower: 1
|
|
|
|
lower_under: 1
|
|
|
|
studly: 19
|
|
|
|
class_brace_line:
|
|
|
|
next: 16
|
|
|
|
same: 6
|
|
|
|
constant_names:
|
|
|
|
upper: 22
|
|
|
|
true_false_null:
|
|
|
|
lower: 19
|
|
|
|
upper: 3
|
|
|
|
method_names:
|
|
|
|
camel: 21
|
|
|
|
lower_under: 1
|
|
|
|
method_brace_line:
|
|
|
|
next: 15
|
|
|
|
same: 7
|
|
|
|
control_brace_line:
|
|
|
|
next: 4
|
|
|
|
same: 18
|
|
|
|
control_space_after:
|
|
|
|
no: 2
|
|
|
|
yes: 20
|
|
|
|
always_use_control_braces:
|
|
|
|
no: 3
|
|
|
|
yes: 19
|
|
|
|
else_elseif_line:
|
|
|
|
next: 6
|
|
|
|
same: 16
|
|
|
|
case_break_indent_from_switch:
|
|
|
|
0/1: 4
|
|
|
|
1/1: 4
|
|
|
|
1/2: 14
|
|
|
|
function_space_after:
|
|
|
|
no: 22
|
|
|
|
closing_php_tag_required:
|
|
|
|
no: 19
|
|
|
|
yes: 3
|
|
|
|
line_endings:
|
|
|
|
?: 5
|
|
|
|
LF: 17
|
|
|
|
static_or_visibility_first:
|
|
|
|
?: 5
|
|
|
|
either: 7
|
|
|
|
static: 4
|
|
|
|
visibility: 6
|
|
|
|
control_space_parens:
|
|
|
|
?: 1
|
|
|
|
no: 19
|
|
|
|
yes: 2
|
|
|
|
blank_line_after_php:
|
|
|
|
?: 1
|
|
|
|
no: 13
|
|
|
|
yes: 8
|
|
|
|
class_method_control_brace:
|
|
|
|
next/next/next: 4
|
|
|
|
next/next/same: 11
|
|
|
|
next/same/same: 1
|
|
|
|
same/same/same: 6
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
###### References
|
|
|
|
|
|
|
|
- [PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md)
|
|
|
|
- [PSR-1](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md)
|
|
|
|
- [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
|
|
|
|
- [Symfony Coding Standards](http://symfony.com/doc/master/contributing/code/standards.html) |
|
|
|
\ No newline at end of file |