2001-01-05 13:46:59 +08:00
|
|
|
===========================================================================
|
|
|
|
|| PEAR Coding Standards ||
|
|
|
|
===========================================================================
|
|
|
|
|
|
|
|
$Id$
|
|
|
|
|
|
|
|
-------------
|
|
|
|
[1] Indenting
|
|
|
|
=============
|
|
|
|
|
|
|
|
Use an indent of 4 spaces, with no tabs. If you use Emacs to edit PEAR
|
|
|
|
code, you should set indent-tabs-mode to nil. Here is an example mode
|
|
|
|
hook that will set up Emacs according to these guidelines (you will
|
|
|
|
need to ensure that it is called when you are editing php files):
|
|
|
|
|
|
|
|
(defun php-mode-hook ()
|
|
|
|
(setq tab-width 4
|
|
|
|
c-basic-offset 4
|
|
|
|
c-hanging-comment-ender-p nil
|
2001-05-07 07:44:06 +08:00
|
|
|
indent-tabs-mode
|
|
|
|
(not
|
|
|
|
(and (string-match "/\\(PEAR\\|pear\\)/" (buffer-file-name))
|
|
|
|
(string-match "\.php$" (buffer-file-name))))))
|
2001-01-05 13:46:59 +08:00
|
|
|
|
|
|
|
Here are vim rules for the same thing:
|
|
|
|
|
|
|
|
set expandtab
|
|
|
|
set shiftwidth=4
|
|
|
|
set tabstop=4
|
|
|
|
|
|
|
|
|
|
|
|
----------------------
|
|
|
|
[2] Control Structures
|
|
|
|
======================
|
|
|
|
|
|
|
|
These include if, for, while, switch, etc. Here is an example if statement,
|
|
|
|
since it is the most complicated of them:
|
|
|
|
|
|
|
|
if ((condition1) || (condition2)) {
|
|
|
|
action1;
|
|
|
|
} elseif ((condition3) && (condition4)) {
|
|
|
|
action2;
|
|
|
|
} else {
|
|
|
|
defaultaction;
|
|
|
|
}
|
|
|
|
|
|
|
|
Control statements should have one space between the control keyword
|
|
|
|
and opening parenthesis, to distinguish them from function calls.
|
|
|
|
|
|
|
|
You are strongly encouraged to always use curly braces even in
|
|
|
|
situations where they are technically optional. Having them increases
|
|
|
|
readability and decreases the likelihood of logic errors being
|
|
|
|
introduced when new lines are added.
|
|
|
|
|
|
|
|
For switch statements:
|
|
|
|
|
|
|
|
switch (condition) {
|
|
|
|
case 1:
|
|
|
|
action1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 2:
|
|
|
|
action2;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
defaultaction;
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
[3] Function Calls
|
|
|
|
==================
|
|
|
|
|
|
|
|
Functions should be called with no spaces between the function name,
|
|
|
|
the opening parenthesis, and the first parameter; spaces between commas
|
|
|
|
and each parameter, and no space between the last parameter, the
|
|
|
|
closing parenthesis, and the semicolon. Here's an example:
|
|
|
|
|
|
|
|
$var = foo($bar, $baz, $quux);
|
|
|
|
|
|
|
|
As displayed above, there should be one space on either side of an
|
|
|
|
equals sign used to assign the return value of a function to a
|
|
|
|
variable. In the case of a block of related assignments, more space
|
|
|
|
may be inserted to promote readability:
|
|
|
|
|
|
|
|
$short = foo($bar);
|
|
|
|
$long_variable = foo($baz);
|
|
|
|
|
|
|
|
|
|
|
|
------------------------
|
|
|
|
[4] Function Definitions
|
|
|
|
========================
|
|
|
|
|
|
|
|
Function declaractions follow the "one true brace" convention:
|
|
|
|
|
|
|
|
function fooFunction($arg1, $arg2 = '')
|
|
|
|
{
|
|
|
|
if (condition) {
|
|
|
|
statement;
|
|
|
|
}
|
|
|
|
return $val;
|
|
|
|
}
|
|
|
|
|
|
|
|
Arguments with default values go at the end of the argument list.
|
|
|
|
Always attempt to return a meaningful value from a function if one is
|
|
|
|
appropriate. Here is a slightly longer example:
|
|
|
|
|
|
|
|
function connect(&$dsn, $persistent = false)
|
|
|
|
{
|
|
|
|
if (is_array($dsn)) {
|
|
|
|
$dsninfo = &$dsn;
|
|
|
|
} else {
|
|
|
|
$dsninfo = DB::parseDSN($dsn);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!$dsninfo || !$dsninfo['phptype']) {
|
|
|
|
return $this->raiseError();
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2001-07-18 07:55:10 +08:00
|
|
|
Functions should be named using the "studly caps" style (also referred to as
|
2001-07-18 07:56:46 +08:00
|
|
|
"bumpy case" or "camel caps"). The initial letter of the name is lowercase,
|
2001-07-18 07:55:10 +08:00
|
|
|
and each letter that starts a new "word" is capitalized. Some examples:
|
|
|
|
|
|
|
|
connect() getData() buildSomeWidget()
|
|
|
|
|
|
|
|
Private methods (meaning methods that an intented to be called only from
|
|
|
|
within the same class; PHP does not yet support truly-enforceable private
|
|
|
|
namespaces) are preceeded by a single underscore. For example:
|
|
|
|
|
|
|
|
_sort() _initTree() _validateInput()
|
|
|
|
|
2001-01-05 13:46:59 +08:00
|
|
|
|
|
|
|
------------
|
|
|
|
[5] Comments
|
|
|
|
============
|
|
|
|
|
|
|
|
Inline documentation for classes should follow the PHPDoc convention, similar
|
|
|
|
to Javadoc. More information about PHPDoc can be found here:
|
|
|
|
|
|
|
|
http://www.phpdoc.de/
|
|
|
|
|
|
|
|
Non-documentation comments are strongly encouraged. A general rule of
|
|
|
|
thumb is that if you look at a section of code and think "Wow, I don't
|
|
|
|
want to try and describe that", you need to comment it before you
|
|
|
|
forget how it works.
|
|
|
|
|
|
|
|
C++ style comments (/* */) and standard C comments (// ) are both
|
|
|
|
fine. Use of perl/shell style comments (# ) is discouraged.
|
|
|
|
|
|
|
|
|
|
|
|
------------------
|
|
|
|
[6] Including Code
|
|
|
|
==================
|
|
|
|
|
|
|
|
Anywhere you are unconditionally including a class file, use
|
|
|
|
require_once. Anywhere you are conditionally including a class file
|
|
|
|
(for example, factory methods), use include_once. Either of these will
|
|
|
|
ensure that class files are included only once. They share the same
|
|
|
|
file list, so you don't need to worry about mixing them - a file
|
|
|
|
included with require_once will not be included again by include_once.
|
|
|
|
|
|
|
|
Note: include_once and require_once are statements, not functions. You
|
|
|
|
don't need parentheses around the filename to be included.
|
|
|
|
|
|
|
|
|
|
|
|
-----------------
|
|
|
|
[7] PHP Code Tags
|
|
|
|
=================
|
|
|
|
|
|
|
|
ALWAYS use <?php ?> to delimit PHP code, not the <? ?> shorthand.
|
|
|
|
This is required for PEAR compliance and is also the most portable way
|
|
|
|
to include PHP code on differing operating systems and setups.
|
|
|
|
|
|
|
|
|
|
|
|
-------------------------
|
|
|
|
[8] Header Comment Blocks
|
|
|
|
=========================
|
|
|
|
|
|
|
|
All source code files in the core PEAR distribution should contain the
|
|
|
|
following comment block as the header:
|
|
|
|
|
2001-01-07 13:24:21 +08:00
|
|
|
/* vim: set expandtab tabstop=4 shiftwidth=4: */
|
2001-01-05 13:46:59 +08:00
|
|
|
// +----------------------------------------------------------------------+
|
|
|
|
// | PHP version 4.0 |
|
|
|
|
// +----------------------------------------------------------------------+
|
2001-02-19 01:47:43 +08:00
|
|
|
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group |
|
2001-01-05 13:46:59 +08:00
|
|
|
// +----------------------------------------------------------------------+
|
|
|
|
// | This source file is subject to version 2.0 of the PHP license, |
|
|
|
|
// | that is bundled with this package in the file LICENSE, and is |
|
|
|
|
// | available at through the world-wide-web at |
|
|
|
|
// | http://www.php.net/license/2_02.txt. |
|
|
|
|
// | If you did not receive a copy of the PHP license and are unable to |
|
|
|
|
// | obtain it through the world-wide-web, please send a note to |
|
|
|
|
// | license@php.net so we can mail you a copy immediately. |
|
|
|
|
// +----------------------------------------------------------------------+
|
|
|
|
// | Authors: Original Author <author@example.com> |
|
|
|
|
// | Your Name <you@example.com> |
|
|
|
|
// +----------------------------------------------------------------------+
|
|
|
|
//
|
|
|
|
// $Id$
|
|
|
|
|
|
|
|
There's no hard rule to determine when a new code contributer should be
|
|
|
|
added to the list of authors for a given source file. In general, their
|
|
|
|
changes should fall into the "substantial" category (meaning somewhere
|
|
|
|
around 10% to 20% of code changes). Exceptions could be made for rewriting
|
|
|
|
functions or contributing new logic.
|
|
|
|
|
|
|
|
Simple code reorganization or bug fixes would not justify the addition of a
|
|
|
|
new individual to the list of authors.
|
|
|
|
|
|
|
|
Files not in the core PEAR repository should have a similar block
|
|
|
|
stating the copyright, the license, and the authors. All files should
|
|
|
|
include the modeline comments to encourage consistency.
|
|
|
|
|
|
|
|
|
|
|
|
------------
|
|
|
|
[9] CVS Tags
|
|
|
|
============
|
|
|
|
|
|
|
|
Include the <dollar>Id CVS vendor tag in each file. As each
|
|
|
|
file is edited, add this tag if it's not yet present (or replace existing
|
|
|
|
forms such as "Last Modified:", etc.).
|
|
|
|
|
|
|
|
[NOTE: we have a custom $Horde tag in Horde cvs to track our versions
|
|
|
|
seperately; we could do the same and make a $PEAR tag, that would remain even
|
|
|
|
if PEAR files were put into another source control system, etc...]
|
|
|
|
|
|
|
|
|
|
|
|
-----------------
|
|
|
|
[10] Example URLs
|
|
|
|
=================
|
|
|
|
|
|
|
|
Use "example.com" for all example URLs, per RFC 2606.
|
|
|
|
|
|
|
|
|
|
|
|
---------------------
|
|
|
|
[11] Naming Constants
|
|
|
|
=====================
|
|
|
|
|
|
|
|
Constants should always be uppercase, with underscores to seperate
|
|
|
|
words. Prefix constant names with the name of the class/package they
|
|
|
|
are used in. For example, the constants used by the DB:: package all
|
|
|
|
begin with "DB_".
|
|
|
|
|
|
|
|
True and false are built in to the php language and behave like
|
|
|
|
constants, but should be written in lowercase to distinguish them from
|
|
|
|
user-defined constants.
|