Annotation of embedaddon/php/CODING_STANDARDS, revision 1.1.1.3

1.1       misho       1: ========================
                      2:   PHP Coding Standards
                      3: ========================
                      4: 
1.1.1.2   misho       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
1.1       misho       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
1.1.1.2   misho       9: well into version 5 releases, many sections have been recoded to use
1.1       misho      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
1.1.1.3 ! misho      62:     use "<git username here>_0". For example, #if FOO_0, where FOO is your
        !            63:     git user foo.  This allows easier tracking of why code was commented out,
1.1       misho      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: 
1.1.1.3 ! misho      85: User Functions/Methods Naming Conventions
1.1       misho      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,
1.1.1.3 ! misho     154:     without underscore delimiters (CamelCaps starting with a capital letter).
1.1       misho     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: 
1.1.1.3 ! misho     166: Internal Function Naming Convensions
        !           167: ----------------------
        !           168: 
        !           169: 1.  Functions that are part of the external API should be named
        !           170:     'php_modulename_function()' to avoid symbol collision. They should be in
        !           171:     lowercase, with words underscore delimited. Exposed API must be defined
        !           172:     in 'php_modulename.h'.
        !           173: 
        !           174:     PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS);
        !           175: 
        !           176:     Unexposed module function should be static and should not be defined in
        !           177:     'php_modulename.h'.
        !           178: 
        !           179:     static int php_session_destroy(TSRMLS_D)
        !           180: 
        !           181: 2.  Main module source file must be named 'modulename.c'.
        !           182: 
        !           183: 3.  Header file that is used by other sources must be named 'php_modulename.h'.
        !           184: 
        !           185: 
1.1       misho     186: Syntax and indentation
                    187: ----------------------
                    188: 
                    189: 1.  Never use C++ style comments (i.e. // comment).  Always use C-style
                    190:     comments instead.  PHP is written in C, and is aimed at compiling
                    191:     under any ANSI-C compliant compiler.  Even though many compilers
                    192:     accept C++-style comments in C code, you have to ensure that your
                    193:     code would compile with other compilers as well.
                    194:     The only exception to this rule is code that is Win32-specific,
                    195:     because the Win32 port is MS-Visual C++ specific, and this compiler
                    196:     is known to accept C++-style comments in C code.
                    197: 
                    198: 2.  Use K&R-style.  Of course, we can't and don't want to
                    199:     force anybody to use a style he or she is not used to, but,
                    200:     at the very least, when you write code that goes into the core
                    201:     of PHP or one of its standard modules, please maintain the K&R
                    202:     style.  This applies to just about everything, starting with
                    203:     indentation and comment styles and up to function declaration
1.1.1.3 ! misho     204:     syntax. Also see Indentstyle.
1.1       misho     205: 
1.1.1.3 ! misho     206:     Indentstyle: http://www.catb.org/~esr/jargon/html/I/indent-style.html
1.1       misho     207: 
                    208: 3.  Be generous with whitespace and braces.  Keep one empty line between the
                    209:     variable declaration section and the statements in a block, as well as
                    210:     between logical statement groups in a block.  Maintain at least one empty
                    211:     line between two functions, preferably two.  Always prefer::
                    212: 
                    213:     if (foo) {
                    214:         bar;
                    215:     }
                    216: 
                    217:     to:
                    218: 
                    219:     if(foo)bar;
                    220: 
                    221: 4.  When indenting, use the tab character.  A tab is expected to represent
                    222:     four spaces.  It is important to maintain consistency in indenture so
                    223:     that definitions, comments, and control structures line up correctly.
                    224: 
                    225: 5.  Preprocessor statements (#if and such) MUST start at column one. To
                    226:     indent preprocessor directives you should put the # at the beginning
                    227:     of a line, followed by any number of whitespace.
                    228: 
                    229: Testing
                    230: -------
                    231: 
                    232: 1.  Extensions should be well tested using *.phpt tests. Read about that
                    233:     in README.TESTING.
                    234: 
                    235: Documentation and Folding Hooks
                    236: -------------------------------
                    237: 
                    238: In order to make sure that the online documentation stays in line with
                    239: the code, each user-level function should have its user-level function
                    240: prototype before it along with a brief one-line description of what the
                    241: function does.  It would look like this::
                    242: 
                    243:   /* {{{ proto int abs(int number)
                    244:      Returns the absolute value of the number */
                    245:   PHP_FUNCTION(abs)
                    246:   {
                    247:      ...
                    248:   }
                    249:   /* }}} */
                    250: 
                    251: The {{{ symbols are the default folding symbols for the folding mode in
                    252: Emacs and vim (set fdm=marker).  Folding is very useful when dealing with
                    253: large files because you can scroll through the file quickly and just unfold
                    254: the function you wish to work on.  The }}} at the end of each function marks
                    255: the end of the fold, and should be on a separate line.
                    256: 
                    257: The "proto" keyword there is just a helper for the doc/genfuncsummary script
                    258: which generates a full function summary.  Having this keyword in front of the
                    259: function prototypes allows us to put folds elsewhere in the code without
                    260: messing up the function summary.
                    261: 
                    262: Optional arguments are written like this::
                    263: 
                    264:   /* {{{ proto object imap_header(int stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]])
                    265:      Returns a header object with the defined parameters */
                    266: 
                    267: And yes, please keep the prototype on a single line, even if that line
                    268: is massive.
                    269: 
                    270: New and Experimental Functions
                    271: -----------------------------------
                    272: To reduce the problems normally associated with the first public
                    273: implementation of a new set of functions, it has been suggested
                    274: that the first implementation include a file labeled 'EXPERIMENTAL'
                    275: in the function directory, and that the functions follow the
                    276: standard prefixing conventions during their initial implementation.
                    277: 
                    278: The file labelled 'EXPERIMENTAL' should include the following
                    279: information::
                    280: 
                    281:   Any authoring information (known bugs, future directions of the module).
                    282:   Ongoing status notes which may not be appropriate for SVN comments.
                    283: 
                    284: Aliases & Legacy Documentation
                    285: -----------------------------------
                    286: You may also have some deprecated aliases with close to duplicate
                    287: names, for example, somedb_select_result and somedb_selectresult. For
                    288: documentation purposes, these will only be documented by the most
                    289: current name, with the aliases listed in the documentation for
                    290: the parent function. For ease of reference, user-functions with
                    291: completely different names, that alias to the same function (such as
                    292: highlight_file and show_source), will be separately documented. The
                    293: proto should still be included, describing which function is aliased.
                    294: 
                    295: Backwards compatible functions and names should be maintained as long
                    296: as the code can be reasonably be kept as part of the codebase. See
                    297: /phpdoc/README for more information on documentation.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>