Annotation of embedaddon/php/CODING_STANDARDS, revision 1.1.1.2
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
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>