1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
---|
2 | <!-- saved from url=(0044) -->
|
---|
3 | <HTML><HEAD><TITLE>phpBB Coding Standard Guidelines</TITLE>
|
---|
4 | <META content="text/html; charset=windows-1252" http-equiv=Content-Type>
|
---|
5 | <META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
|
---|
6 | <BODY aLink=#cccccc bgColor=#ffffff link=#0000ff text=#000000
|
---|
7 | vLink=#0000ff><FONT face=verdana,arial,tahoma size=-1><A name=top></A>
|
---|
8 | <H2>phpBB Coding Standard Guidelines</H2>Comments or suggestions? email <A
|
---|
9 | href="mailto:nate@phpbb.com">nate@phpbb.com</A><BR><BR><A
|
---|
10 | href="#editor">Editor
|
---|
11 | Settings</A><BR><A
|
---|
12 | href="#naming">Naming
|
---|
13 | Conventions</A><BR><A
|
---|
14 | href="#layout">Code Layout</A><BR><A
|
---|
15 | href="#general">General
|
---|
16 | Guidelines</A><BR><BR><BR><A name=editor></A><A
|
---|
17 | href="#top">top</A>
|
---|
18 | <H3>Editor Settings</H3>
|
---|
19 | <P><B>Tabs vs Spaces:</B> In order to make this as simple as possible, we will
|
---|
20 | be using tabs, not spaces. Feel free to set how many spaces your editor uses
|
---|
21 | when it <B>displays</B> tabs, but make sure that when you <B>save</B> the file,
|
---|
22 | it's saving tabs and not spaces. This way, we can each have the code be
|
---|
23 | displayed the way we like it, without breaking the layout of the actual files.
|
---|
24 | </P>
|
---|
25 | <P><B>Linefeeds:</B> Ensure that your editor is saving files in the UNIX format.
|
---|
26 | This means lines are terminated with a newline, not with a CR/LF combo as they
|
---|
27 | are on Win32, or whatever the Mac uses. Any decent Win32 editor should be able
|
---|
28 | to do this, but it might not always be the default. Know your editor. If you
|
---|
29 | want advice on Windows text editors, just ask one of the developers. Some of
|
---|
30 | them do their editing on Win32. </P><BR><BR><A name=naming></A><A
|
---|
31 | href="#top">top</A>
|
---|
32 | <H3>Naming Conventions</H3>
|
---|
33 | <P>We will not be using any form of hungarian notation in our naming
|
---|
34 | conventions. Many of us believe that hungarian naming is one of the primary code
|
---|
35 | obfuscation techniques currently in use. </P>
|
---|
36 | <P><B>Variable Names:</B> Variable names should be in all lowercase, with words
|
---|
37 | separated by an underscore. <BR><BR> Example: <CODE><FONT
|
---|
38 | size=+1>$current_user</FONT></CODE> is right, but <CODE><FONT
|
---|
39 | size=+1>$currentuser</FONT></CODE> and <CODE><FONT
|
---|
40 | size=+1>$currentUser</FONT></CODE> are not. <BR><BR>Names should be descriptive,
|
---|
41 | but concise. We don't want huge sentences as our variable names, but typing an
|
---|
42 | extra couple of characters is always better than wondering what exactly a
|
---|
43 | certain variable is for. </P>
|
---|
44 | <P><B>Loop Indices:</B> The <I>only</I> situation where a one-character variable
|
---|
45 | name is allowed is when it's the index for some looping construct. In this case,
|
---|
46 | the index of the outer loop should always be $i. If there's a loop inside that
|
---|
47 | loop, its index should be $j, followed by $k, and so on. If the loop is being
|
---|
48 | indexed by some already-existing variable with a meaningful name, this guideline
|
---|
49 | does not apply. <BR><BR> Example: <PRE><FONT size=+1>
|
---|
50 | for ($i = 0; $i < $outer_size; $i++)
|
---|
51 | {
|
---|
52 | for ($j = 0; $j < $inner_size; $j++)
|
---|
53 | {
|
---|
54 | foo($i, $j);
|
---|
55 | }
|
---|
56 | } </FONT></PRE>
|
---|
57 | <P></P>
|
---|
58 | <P><B>Function Names:</B> Functions should also be named descriptively. We're
|
---|
59 | not programming in C here, we don't want to write functions called things like
|
---|
60 | "stristr()". Again, all lower-case names with words separated by a single
|
---|
61 | underscore character. Function names should preferably have a verb in them
|
---|
62 | somewhere. Good function names are <CODE><FONT
|
---|
63 | size=+1>print_login_status()</FONT></CODE>, <CODE><FONT
|
---|
64 | size=+1>get_user_data()</FONT></CODE>, etc.. </P>
|
---|
65 | <P><B>Function Arguments:</B> Arguments are subject to the same guidelines as
|
---|
66 | variable names. We don't want a bunch of functions like: <CODE><FONT
|
---|
67 | size=+1>do_stuff($a, $b, $c)</FONT></CODE>. In most cases, we'd like to be able
|
---|
68 | to tell how to use a function by just looking at its declaration. </P>
|
---|
69 | <P><B>Summary:</B> The basic philosophy here is to not hurt code clarity for the
|
---|
70 | sake of laziness. This has to be balanced by a little bit of common sense,
|
---|
71 | though; <CODE><FONT size=+1>print_login_status_for_a_given_user()</FONT></CODE>
|
---|
72 | goes too far, for example -- that function would be better named <CODE><FONT
|
---|
73 | size=+1>print_user_login_status()</FONT></CODE> , or just <CODE><FONT
|
---|
74 | size=+1>print_login_status()</FONT></CODE>. </P><BR><BR><A name=layout></A><A
|
---|
75 | href="#top">top</A>
|
---|
76 | <H3>Code Layout</H3>
|
---|
77 | <P><B>Standard header for new files:</B> Here a template of the header that must
|
---|
78 | be included at the start of all phpBB files: <PRE><FONT size=+1>
|
---|
79 | /***************************************************************************
|
---|
80 | filename.php
|
---|
81 | -------------------
|
---|
82 | begin : Sat June 17 2000
|
---|
83 | copyright : (C) 2000 The phpBB Group
|
---|
84 | email : support@phpBB.com
|
---|
85 |
|
---|
86 | $Id: codingstandards.htm,v 1.3 2001/06/09 21:00:12 natec Exp $
|
---|
87 |
|
---|
88 | ***************************************************************************/
|
---|
89 |
|
---|
90 | /***************************************************************************
|
---|
91 | *
|
---|
92 | * This program is free software; you can redistribute it and/or modify
|
---|
93 | * it under the terms of the GNU General Public License as published by
|
---|
94 | * the Free Software Foundation; either version 2 of the License, or
|
---|
95 | * (at your option) any later version.
|
---|
96 | *
|
---|
97 | ***************************************************************************/
|
---|
98 | </FONT></PRE>
|
---|
99 | <P></P>
|
---|
100 | <P><B>Always include the braces:</B> This is another case of being too lazy to
|
---|
101 | type 2 extra characters causing problems with code clarity. Even if the body of
|
---|
102 | some construct is only one line long, do <I>not</I> drop the braces. Just don't.
|
---|
103 | <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
104 | /* These are all wrong. */
|
---|
105 | if (condition) do_stuff();
|
---|
106 | if (condition)
|
---|
107 | do_stuff();
|
---|
108 | while (condition)
|
---|
109 | do_stuff();
|
---|
110 | for ($i = 0; $i < size; $i++)
|
---|
111 | do_stuff($i);
|
---|
112 |
|
---|
113 | /* These are right. */
|
---|
114 | if (condition)
|
---|
115 | {
|
---|
116 | do_stuff();
|
---|
117 | }
|
---|
118 | while (condition)
|
---|
119 | {
|
---|
120 | do_stuff();
|
---|
121 | }
|
---|
122 | for ($i = 0; $i < size; $i++)
|
---|
123 | {
|
---|
124 | do_stuff();
|
---|
125 | }
|
---|
126 | </FONT></PRE>
|
---|
127 | <P></P>
|
---|
128 | <P><B>Where to put the braces:</B> This one is a bit of a holy war, but we're
|
---|
129 | going to use a style that can be summed up in one sentence: Braces always go on
|
---|
130 | their own line. The closing brace should also always be at the same column as
|
---|
131 | the corresponding opening brace. <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
132 | if (condition)
|
---|
133 | {
|
---|
134 | while (condition2)
|
---|
135 | {
|
---|
136 | ...
|
---|
137 | }
|
---|
138 | }
|
---|
139 | else
|
---|
140 | {
|
---|
141 | ...
|
---|
142 | }
|
---|
143 |
|
---|
144 | for ($i = 0; $i < $size; $i++)
|
---|
145 | {
|
---|
146 | ...
|
---|
147 | }
|
---|
148 |
|
---|
149 | while (condition)
|
---|
150 | {
|
---|
151 | ...
|
---|
152 | }
|
---|
153 |
|
---|
154 | function do_stuff()
|
---|
155 | {
|
---|
156 | ...
|
---|
157 | }
|
---|
158 | </FONT></PRE>
|
---|
159 | <P></P>
|
---|
160 | <P><B>Use spaces between tokens:</B> This is another simple, easy step that
|
---|
161 | helps keep code readable without much effort. Whenever you write an assignment,
|
---|
162 | expression, etc.. Always leave <I>one</I> space between the tokens. Basically,
|
---|
163 | write code as if it was English. Put spaces between variable names and
|
---|
164 | operators. Don't put spaces just after an opening bracket or before a closing
|
---|
165 | bracket. Don't put spaces just before a comma or a semicolon. This is best shown
|
---|
166 | with a few examples. <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
167 | /* Each pair shows the wrong way followed by the right way. */
|
---|
168 |
|
---|
169 | $i=0;
|
---|
170 | $i = 0;
|
---|
171 |
|
---|
172 | if($i<7) ...
|
---|
173 | if ($i < 7) ...
|
---|
174 |
|
---|
175 | if ( ($i < 7)&&($j > 8) ) ...
|
---|
176 | if (($i < 7) && ($j > 8)) ...
|
---|
177 |
|
---|
178 | do_stuff( $i, "foo", $b );
|
---|
179 | do_stuff($i, "foo", $b);
|
---|
180 |
|
---|
181 | for($i=0; $i<$size; $i++) ...
|
---|
182 | for($i = 0; $i < $size; $i++) ...
|
---|
183 |
|
---|
184 | $i=($j < $size)?0:1;
|
---|
185 | $i = ($j < $size) ? 0 : 1;
|
---|
186 | </FONT></PRE>
|
---|
187 | <P></P>
|
---|
188 | <P><B>Operator precedence:</B> Do you know the exact precedence of all the
|
---|
189 | operators in PHP? Neither do I. Don't guess. Always make it obvious by using
|
---|
190 | brackets to force the precedence of an equation so you know what it does.
|
---|
191 | <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
192 | /* what's the result? who knows. */
|
---|
193 | $bool = ($i < 7 && $j > 8 || $k == 4);
|
---|
194 |
|
---|
195 | /* now you can be certain what I'm doing here. */
|
---|
196 | $bool = (($i < 7) && (($j < 8) || ($k == 4)))
|
---|
197 | </FONT></PRE>
|
---|
198 | <P></P>
|
---|
199 | <P><B>SQL code layout:</B> Since we'll all be using different editor settings,
|
---|
200 | don't try to do anything complex like aligning columns in SQL code. Do, however,
|
---|
201 | break statements onto their own lines. Here's a sample of how SQL code should
|
---|
202 | look. Note where the lines break, the capitalization, and the use of brackets.
|
---|
203 | <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
204 | SELECT field1 AS something, field2, field3
|
---|
205 | FROM table a, table b
|
---|
206 | WHERE (this = that) AND (this2 = that2)
|
---|
207 | </FONT></PRE>
|
---|
208 | <P></P>
|
---|
209 | <P><B>SQL insert statements:</B> SQL INSERT statements can be written in two
|
---|
210 | different ways. Either you specify explicitly the columns being inserted, or
|
---|
211 | you rely on knowing the order of the columns in the database and do not
|
---|
212 | specify them. We want to use the former approach, where it is explicitly
|
---|
213 | stated whcih columns are being inserted. This means our application-level code
|
---|
214 | will not depend on the order of the fields in the database, and will not be broken
|
---|
215 | if we add additional fields (unless they're specified as NOT NULL, of course).
|
---|
216 | <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
217 | # This is not what we want.
|
---|
218 | INSERT INTO mytable
|
---|
219 | VALUES ('something', 1, 'else')
|
---|
220 |
|
---|
221 | # This is correct.
|
---|
222 | INSERT INTO mytable (column1, column2, column3)
|
---|
223 | VALUES ('something', 1, 'else')
|
---|
224 | </FONT></PRE>
|
---|
225 | <P></P><BR><BR><A name=general></A><A
|
---|
226 | href="#top">top</A>
|
---|
227 | <H3>General Guidelines</H3>
|
---|
228 | <P><B>Quoting strings:</B> There are two different ways to quote strings in PHP
|
---|
229 | - either with single quotes or with double quotes. The main difference is that
|
---|
230 | the parser does variable interpolation in double-quoted strings, but not in
|
---|
231 | single quoted strings. Because of this, you should <I>always</I> use single
|
---|
232 | quotes <I>unless</I> you specifically need variable interpolation to be done on
|
---|
233 | that string. This way, we can save the parser the trouble of parsing a bunch of
|
---|
234 | strings where no interpolation needs to be done. Also, if you are using a string
|
---|
235 | variable as part of a function call, you do not need to enclose that variable in
|
---|
236 | quotes. Again, this will just make unnecessary work for the parser. Note,
|
---|
237 | however, that nearly all of the escape sequences that exist for double-quoted
|
---|
238 | strings will not work with single-quoted strings. Be careful, and feel free to
|
---|
239 | break this guideline if it's making your code harder to read.
|
---|
240 | <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
241 | /* wrong */
|
---|
242 | $str = "This is a really long string with no variables for the parser to find.";
|
---|
243 | do_stuff("$str");
|
---|
244 |
|
---|
245 | /* right */
|
---|
246 | $str = 'This is a really long string with no variables for the parser to find.';
|
---|
247 | do_stuff($str);
|
---|
248 | </FONT></PRE>
|
---|
249 | <P></P>
|
---|
250 | <P><B>Associative array keys:</B> In PHP, it's legal to use a literal string as
|
---|
251 | a key to an associative array without quoting that string. We don't want to do
|
---|
252 | this -- the string should always be quoted to avoid confusion. Note that this is
|
---|
253 | only when we're using a literal, not when we're using a variable.
|
---|
254 | <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
255 | /* wrong */
|
---|
256 | $foo = $assoc_array[blah];
|
---|
257 |
|
---|
258 | /* right */
|
---|
259 | $foo = $assoc_array['blah'];
|
---|
260 | </FONT></PRE>
|
---|
261 | <P></P>
|
---|
262 | <P><B>Comments:</B> Each function should be preceded by a comment that tells a
|
---|
263 | programmer everything they need to know to use that function. The meaning of
|
---|
264 | every parameter, the expected input, and the output are required as a minimal
|
---|
265 | comment. The function's behaviour in error conditions (and what those error
|
---|
266 | conditions are) should also be present. Nobody should have to look at the actual
|
---|
267 | source of a function in order to be able to call it with confidence in their own
|
---|
268 | code. <BR><BR>In addition, commenting any tricky, obscure, or otherwise
|
---|
269 | not-immediately-obvious code is clearly something we should be doing. Especially
|
---|
270 | important to document are any assumptions your code makes, or preconditions for
|
---|
271 | its proper operation. Any one of the developers should be able to look at any
|
---|
272 | part of the application and figure out what's going on in a reasonable amount of
|
---|
273 | time. </P>
|
---|
274 | <P><B>Magic numbers:</B> Don't use them. Use named constants for any literal
|
---|
275 | value other than obvious special cases. Basically, it's OK to check if an array
|
---|
276 | has 0 elements by using the literal 0. It's not OK to assign some special
|
---|
277 | meaning to a number and then use it everywhere as a literal. This hurts
|
---|
278 | readability AND maintainability. Included in this guideline is that we should be
|
---|
279 | using the constants TRUE and FALSE in place of the literals 1 and 0 -- even
|
---|
280 | though they have the same values, it's more obvious what the actual logic is
|
---|
281 | when you use the named constants. </P>
|
---|
282 | <P><B>Shortcut operators:</B> The only shortcut operators that cause readability
|
---|
283 | problems are the shortcut increment ($i++) and decrement ($j--) operators. These
|
---|
284 | operators should not be used as part of an expression. They can, however, be
|
---|
285 | used on their own line. Using them in expressions is just not worth the
|
---|
286 | headaches when debugging. <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
287 | /* wrong */
|
---|
288 | $array[++$i] = $j;
|
---|
289 | $array[$i++] = $k;
|
---|
290 |
|
---|
291 |
|
---|
292 | /* right */
|
---|
293 | $i++;
|
---|
294 | $array[$i] = $j;
|
---|
295 |
|
---|
296 | $array[$i] = $k;
|
---|
297 | $i++;
|
---|
298 | </FONT></PRE>
|
---|
299 | <P></P>
|
---|
300 | <P><B>Inline conditionals:</B> Inline conditionals should only be used to do
|
---|
301 | very simple things. Preferably, they will only be used to do assignments, and
|
---|
302 | not for function calls or anything complex at all. They can be harmful to
|
---|
303 | readability if used incorrectly, so don't fall in love with saving typing by
|
---|
304 | using them. <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
305 | /* Bad place to use them */
|
---|
306 | (($i < $size) && ($j > $size)) ? do_stuff($foo) : do_stuff($bar);
|
---|
307 |
|
---|
308 |
|
---|
309 | /* OK place to use them */
|
---|
310 | $min = ($i < $j) ? $i : $j;
|
---|
311 | </FONT></PRE>
|
---|
312 | <P></P>
|
---|
313 | <P><B>Don't use uninitialized variables.</B> for phpBB 2, we intend to use a
|
---|
314 | higher level of run-time error reporting. This will mean that the use of an
|
---|
315 | uninitialized variable will be reported as an error. This will come up most
|
---|
316 | often when checking which HTML form variables were passed. These errors can be
|
---|
317 | avoided by using the built-in isset() function to check whether a variable has
|
---|
318 | been set. <BR><BR> Examples:<PRE><FONT size=+1>
|
---|
319 | /* Old way */
|
---|
320 | if ($forum) ...
|
---|
321 |
|
---|
322 |
|
---|
323 | /* New way */
|
---|
324 | if (isset($forum)) ...
|
---|
325 | </FONT></PRE>
|
---|
326 | <P></P><BR><BR><A href="#top">Return
|
---|
327 | to top</A> </FONT></BODY></HTML>
|
---|