Coding Standards¶
When contributing code to Superdesk Publisher, you must follow its coding standards. To make a long story short, here is the golden rule: Imitate the existing Superdesk Publisher code. Most open-source Bundles and libraries used by Superdesk Publisher also follow the same guidelines, and you should too.
Remember that the main advantage of standards is that every piece of code looks and feels familiar, it’s not about this or that being more readable.
Superdesk Publisher follows the standards defined in the PSR-0, PSR-1, PSR-2 and PSR-4 documents.
Since a picture - or some code - is worth a thousand words, here’s a short example containing most features described below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | <?php
/**
* This file is part of the Superdesk Publisher package.
*
* Copyright 2016 Sourcefabric z.ú. and contributors.
*
* For the full copyright and license information, please see the
* AUTHORS and LICENSE files distributed with this source code.
*
* @copyright 2016 Sourcefabric z.ú.
* @license http://www.superdesk.org/license
*/
namespace Acme;
/**
* Coding standards demonstration.
*/
class FooBar
{
const SOME_CONST = 42;
/**
* @var string
*/
private $fooBar;
/**
* @param string $dummy Some argument description
*/
public function __construct($dummy)
{
$this->fooBar = $this->transformText($dummy);
}
/**
* @return string
*
* @deprecated
*/
public function someDeprecatedMethod()
{
@trigger_error(sprintf('The %s() method is deprecated since version 1.0 and will be removed in 2.0. Use Acme\Baz::someMethod() instead.', __METHOD__), E_USER_DEPRECATED);
return Baz::someMethod();
}
/**
* Transforms the input given as first argument.
*
* @param bool|string $dummy Some argument description
* @param array $options An options collection to be used within the transformation
*
* @return string|null The transformed input
*
* @throws \RuntimeException When an invalid option is provided
*/
private function transformText($dummy, array $options = array())
{
$defaultOptions = array(
'some_default' => 'values',
'another_default' => 'more values',
);
foreach ($options as $option) {
if (!in_array($option, $defaultOptions)) {
throw new \RuntimeException(sprintf('Unrecognized option "%s"', $option));
}
}
$mergedOptions = array_merge(
$defaultOptions,
$options
);
if (true === $dummy) {
return;
}
if ('string' === $dummy) {
if ('values' === $mergedOptions['some_default']) {
return substr($dummy, 0, 5);
}
return ucwords($dummy);
}
}
/**
* Performs some basic check for a given value.
*
* @param mixed $value Some value to check against
* @param bool $theSwitch Some switch to control the method's flow
*
* @return bool|null The resultant check if $theSwitch isn't false, null otherwise
*/
private function reverseBoolean($value = null, $theSwitch = false)
{
if (!$theSwitch) {
return;
}
return !$value;
}
}
|
Structure¶
- Add a single space after each comma delimiter;
- Add a single space around binary operators (
==
,&&
, …), with the exception of the concatenation (.
) operator; - Place unary operators (
!
,--
, …) adjacent to the affected variable; - Always use identical comparison unless you need type juggling;
- Use Yoda conditions when checking a variable against an expression to avoid
an accidental assignment inside the condition statement (this applies to
==
,!=
,===
, and!==
); - Add a comma after each array item in a multi-line array, even after the last one;
- Add a blank line before
return
statements, unless the return is alone inside a statement-group (like anif
statement); - Use just
return;
instead ofreturn null;
when a function must return void early; - Use braces to indicate control structure body regardless of the number of statements it contains;
- Define one class per file - this does not apply to private helper classes that are not intended to be instantiated from the outside and thus are not concerned by the PSR-0 and PSR-4 autoload standards;
- Declare class properties before methods;
- Declare public methods first, then protected ones and finally private ones.
The exceptions to this rule are the class constructor and the
setUp
andtearDown
methods of PHPUnit tests, which should always be the first methods to increase readability; - Use parentheses when instantiating classes regardless of the number of arguments the constructor has;
- Exception and error message strings should be concatenated using
sprintf
. - Calls to
trigger_error
with typeE_USER_DEPRECATED
should be switched to opt-in via@
operator. Read more at Deprecations;
Naming Conventions¶
- Use camelCase, not underscores, for variable, function and method names, arguments;
- Use underscores for option names and parameter names;
- Use namespaces for all classes;
- Prefix abstract classes with
Abstract
. - Suffix interfaces with
Interface
; - Suffix traits with
Trait
; - Suffix exceptions with
Exception
; - Use alphanumeric characters and underscores for file names;
- For type-hinting in PHPDocs and casting, use
bool
(instead ofboolean
orBoolean
),int
(instead ofinteger
),float
(instead ofdouble
orreal
); - Don’t forget to look at the more verbose Conventions document for more subjective naming considerations.
Service Naming Conventions¶
- A service name contains groups, separated by dots;
- The DI alias of the bundle is the first group (e.g.
swp_user
); - Use lowercase letters for service and parameter names;
- A group name uses the underscore notation.
Documentation¶
- Add PHPDoc blocks for all classes, methods, and functions;
- Group annotations together so that annotations of the same type immediately follow each other, and annotations of a different type are separated by a single blank line;
- Omit the
@return
tag if the method does not return anything; - The
@package
and@subpackage
annotations are not used.