Annotation of embedaddon/php/CODING_STANDARDS, revision 1.1
1.1 ! misho 1: ========================
! 2: PHP Coding Standards
! 3: ========================
! 4:
! 5: This file lists several standards that any programmer, adding or changing
! 6: code in PHP, should follow. Since this file was added at a very late
! 7: stage of the development of PHP v3.0, the code base does not (yet) fully
! 8: follow it, but it's going in that general direction. Since we are now
! 9: well into the version 4 releases, many sections have been recoded to use
! 10: these rules.
! 11:
! 12: Code Implementation
! 13: -------------------
! 14:
! 15: 0. Document your code in source files and the manual. [tm]
! 16:
! 17: 1. Functions that are given pointers to resources should not free them
! 18:
! 19: For instance, ``function int mail(char *to, char *from)`` should NOT free
! 20: to and/or from.
! 21: Exceptions:
! 22:
! 23: - The function's designated behavior is freeing that resource. E.g. efree()
! 24:
! 25: - The function is given a boolean argument, that controls whether or not
! 26: the function may free its arguments (if true - the function must free its
! 27: arguments, if false - it must not)
! 28:
! 29: - Low-level parser routines, that are tightly integrated with the token
! 30: cache and the bison code for minimum memory copying overhead.
! 31:
! 32: 2. Functions that are tightly integrated with other functions within the
! 33: same module, and rely on each other non-trivial behavior, should be
! 34: documented as such and declared 'static'. They should be avoided if
! 35: possible.
! 36:
! 37: 3. Use definitions and macros whenever possible, so that constants have
! 38: meaningful names and can be easily manipulated. The only exceptions
! 39: to this rule are 0 and 1, when used as false and true (respectively).
! 40: Any other use of a numeric constant to specify different behavior
! 41: or actions should be done through a #define.
! 42:
! 43: 4. When writing functions that deal with strings, be sure to remember
! 44: that PHP holds the length property of each string, and that it
! 45: shouldn't be calculated with strlen(). Write your functions in a such
! 46: a way so that they'll take advantage of the length property, both
! 47: for efficiency and in order for them to be binary-safe.
! 48: Functions that change strings and obtain their new lengths while
! 49: doing so, should return that new length, so it doesn't have to be
! 50: recalculated with strlen() (e.g. php_addslashes())
! 51:
! 52: 5. NEVER USE strncat(). If you're absolutely sure you know what you're doing,
! 53: check its man page again, and only then, consider using it, and even then,
! 54: try avoiding it.
! 55:
! 56: 6. Use ``PHP_*`` macros in the PHP source, and ``ZEND_*`` macros in the Zend
! 57: part of the source. Although the ``PHP_*`` macro's are mostly aliased to the
! 58: ``ZEND_*`` macros it gives a better understanding on what kind of macro
! 59: you're calling.
! 60:
! 61: 7. When commenting out code using a #if statement, do NOT use 0 only. Instead
! 62: use "<svn username here>_0". For example, #if FOO_0, where FOO is your
! 63: svn user foo. This allows easier tracking of why code was commented out,
! 64: especially in bundled libraries.
! 65:
! 66: 8. Do not define functions that are not available. For instance, if a
! 67: library is missing a function, do not define the PHP version of the
! 68: function, and do not raise a run-time error about the function not
! 69: existing. End users should use function_exists() to test for the
! 70: existence of a function
! 71:
! 72: 9. Prefer emalloc(), efree(), estrdup(), etc. to their standard C library
! 73: counterparts. These functions implement an internal "safety-net"
! 74: mechanism that ensures the deallocation of any unfreed memory at the
! 75: end of a request. They also provide useful allocation and overflow
! 76: information while running in debug mode.
! 77:
! 78: In almost all cases, memory returned to the engine must be allocated
! 79: using emalloc().
! 80:
! 81: The use of malloc() should be limited to cases where a third-party
! 82: library may need to control or free the memory, or when the memory in
! 83: question needs to survive between multiple requests.
! 84:
! 85: Naming Conventions
! 86: ------------------
! 87:
! 88: 1. Function names for user-level functions should be enclosed with in
! 89: the PHP_FUNCTION() macro. They should be in lowercase, with words
! 90: underscore delimited, with care taken to minimize the letter count.
! 91: Abbreviations should not be used when they greatly decrease the
! 92: readability of the function name itself::
! 93:
! 94: Good:
! 95: 'mcrypt_enc_self_test'
! 96: 'mysql_list_fields'
! 97:
! 98: Ok:
! 99: 'mcrypt_module_get_algo_supported_key_sizes'
! 100: (could be 'mcrypt_mod_get_algo_sup_key_sizes'?)
! 101: 'get_html_translation_table'
! 102: (could be 'html_get_trans_table'?)
! 103:
! 104: Bad:
! 105: 'hw_GetObjectByQueryCollObj'
! 106: 'pg_setclientencoding'
! 107: 'jf_n_s_i'
! 108:
! 109: 2. If they are part of a "parent set" of functions, that parent should
! 110: be included in the user function name, and should be clearly related
! 111: to the parent program or function family. This should be in the form
! 112: of ``parent_*``::
! 113:
! 114: A family of 'foo' functions, for example:
! 115: Good:
! 116: 'foo_select_bar'
! 117: 'foo_insert_baz'
! 118: 'foo_delete_baz'
! 119:
! 120: Bad:
! 121: 'fooselect_bar'
! 122: 'fooinsertbaz'
! 123: 'delete_foo_baz'
! 124:
! 125: 3. Function names used by user functions should be prefixed
! 126: with ``_php_``, and followed by a word or an underscore-delimited list of
! 127: words, in lowercase letters, that describes the function. If applicable,
! 128: they should be declared 'static'.
! 129:
! 130: 4. Variable names must be meaningful. One letter variable names must be
! 131: avoided, except for places where the variable has no real meaning or
! 132: a trivial meaning (e.g. for (i=0; i<100; i++) ...).
! 133:
! 134: 5. Variable names should be in lowercase. Use underscores to separate
! 135: between words.
! 136:
! 137: 6. Method names follow the 'studlyCaps' (also referred to as 'bumpy case'
! 138: or 'camel caps') naming convention, with care taken to minimize the
! 139: letter count. The initial letter of the name is lowercase, and each
! 140: letter that starts a new 'word' is capitalized::
! 141:
! 142: Good:
! 143: 'connect()'
! 144: 'getData()'
! 145: 'buildSomeWidget()'
! 146:
! 147: Bad:
! 148: 'get_Data()'
! 149: 'buildsomewidget'
! 150: 'getI()'
! 151:
! 152: 7. Classes should be given descriptive names. Avoid using abbreviations where
! 153: possible. Each word in the class name should start with a capital letter,
! 154: without underscore delimiters (CampelCaps starting with a capital letter).
! 155: The class name should be prefixed with the name of the 'parent set' (e.g.
! 156: the name of the extension)::
! 157:
! 158: Good:
! 159: 'Curl'
! 160: 'FooBar'
! 161:
! 162: Bad:
! 163: 'foobar'
! 164: 'foo_bar'
! 165:
! 166: Syntax and indentation
! 167: ----------------------
! 168:
! 169: 1. Never use C++ style comments (i.e. // comment). Always use C-style
! 170: comments instead. PHP is written in C, and is aimed at compiling
! 171: under any ANSI-C compliant compiler. Even though many compilers
! 172: accept C++-style comments in C code, you have to ensure that your
! 173: code would compile with other compilers as well.
! 174: The only exception to this rule is code that is Win32-specific,
! 175: because the Win32 port is MS-Visual C++ specific, and this compiler
! 176: is known to accept C++-style comments in C code.
! 177:
! 178: 2. Use K&R-style. Of course, we can't and don't want to
! 179: force anybody to use a style he or she is not used to, but,
! 180: at the very least, when you write code that goes into the core
! 181: of PHP or one of its standard modules, please maintain the K&R
! 182: style. This applies to just about everything, starting with
! 183: indentation and comment styles and up to function declaration
! 184: syntax. Also see Indentstyle_.
! 185:
! 186: .. _Indentstyle: http://www.catb.org/~esr/jargon/html/I/indent-style.html
! 187:
! 188: 3. Be generous with whitespace and braces. Keep one empty line between the
! 189: variable declaration section and the statements in a block, as well as
! 190: between logical statement groups in a block. Maintain at least one empty
! 191: line between two functions, preferably two. Always prefer::
! 192:
! 193: if (foo) {
! 194: bar;
! 195: }
! 196:
! 197: to:
! 198:
! 199: if(foo)bar;
! 200:
! 201: 4. When indenting, use the tab character. A tab is expected to represent
! 202: four spaces. It is important to maintain consistency in indenture so
! 203: that definitions, comments, and control structures line up correctly.
! 204:
! 205: 5. Preprocessor statements (#if and such) MUST start at column one. To
! 206: indent preprocessor directives you should put the # at the beginning
! 207: of a line, followed by any number of whitespace.
! 208:
! 209: Testing
! 210: -------
! 211:
! 212: 1. Extensions should be well tested using *.phpt tests. Read about that
! 213: in README.TESTING.
! 214:
! 215: Documentation and Folding Hooks
! 216: -------------------------------
! 217:
! 218: In order to make sure that the online documentation stays in line with
! 219: the code, each user-level function should have its user-level function
! 220: prototype before it along with a brief one-line description of what the
! 221: function does. It would look like this::
! 222:
! 223: /* {{{ proto int abs(int number)
! 224: Returns the absolute value of the number */
! 225: PHP_FUNCTION(abs)
! 226: {
! 227: ...
! 228: }
! 229: /* }}} */
! 230:
! 231: The {{{ symbols are the default folding symbols for the folding mode in
! 232: Emacs and vim (set fdm=marker). Folding is very useful when dealing with
! 233: large files because you can scroll through the file quickly and just unfold
! 234: the function you wish to work on. The }}} at the end of each function marks
! 235: the end of the fold, and should be on a separate line.
! 236:
! 237: The "proto" keyword there is just a helper for the doc/genfuncsummary script
! 238: which generates a full function summary. Having this keyword in front of the
! 239: function prototypes allows us to put folds elsewhere in the code without
! 240: messing up the function summary.
! 241:
! 242: Optional arguments are written like this::
! 243:
! 244: /* {{{ proto object imap_header(int stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]])
! 245: Returns a header object with the defined parameters */
! 246:
! 247: And yes, please keep the prototype on a single line, even if that line
! 248: is massive.
! 249:
! 250: New and Experimental Functions
! 251: -----------------------------------
! 252: To reduce the problems normally associated with the first public
! 253: implementation of a new set of functions, it has been suggested
! 254: that the first implementation include a file labeled 'EXPERIMENTAL'
! 255: in the function directory, and that the functions follow the
! 256: standard prefixing conventions during their initial implementation.
! 257:
! 258: The file labelled 'EXPERIMENTAL' should include the following
! 259: information::
! 260:
! 261: Any authoring information (known bugs, future directions of the module).
! 262: Ongoing status notes which may not be appropriate for SVN comments.
! 263:
! 264: Aliases & Legacy Documentation
! 265: -----------------------------------
! 266: You may also have some deprecated aliases with close to duplicate
! 267: names, for example, somedb_select_result and somedb_selectresult. For
! 268: documentation purposes, these will only be documented by the most
! 269: current name, with the aliases listed in the documentation for
! 270: the parent function. For ease of reference, user-functions with
! 271: completely different names, that alias to the same function (such as
! 272: highlight_file and show_source), will be separately documented. The
! 273: proto should still be included, describing which function is aliased.
! 274:
! 275: Backwards compatible functions and names should be maintained as long
! 276: as the code can be reasonably be kept as part of the codebase. See
! 277: /phpdoc/README for more information on documentation.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>