zak Sun Jul 1 23:03:44 2001 EDT Modified files: /phpdoc/en/language control-structures.xml Log: Clarified declare/ticks documentation Made ticks a sect2 within declare's sect1 Added an illustrative example for ticks
Index: phpdoc/en/language/control-structures.xml diff -u phpdoc/en/language/control-structures.xml:1.30 phpdoc/en/language/control-structures.xml:1.31 --- phpdoc/en/language/control-structures.xml:1.30 Tue Jun 26 08:32:47 2001 +++ phpdoc/en/language/control-structures.xml Sun Jul 1 23:03:43 2001 @@ -68,7 +68,7 @@ program. </simpara> </sect1> - + <sect1 id="control-structures.else"> <title><literal>else</literal></title> <para> @@ -101,7 +101,7 @@ </para> </sect1> - + <sect1 id="control-structures.elseif"> <title><literal>elseif</literal></title> <para> @@ -149,7 +149,7 @@ <literal>TRUE</literal>. </simpara> </sect1> - + <sect1 id="control-structures.alternative-syntax"> <title>Alternative syntax for control structures</title> <para> @@ -166,8 +166,8 @@ </para> <para> PHP offers an alternative syntax for some of its control - structures; namely, <literal>if</literal>, - <literal>while</literal>, <literal>for</literal>, + structures; namely, <literal>if</literal>, + <literal>while</literal>, <literal>for</literal>, <literal>foreach</literal>, and <literal>switch</literal>. In each case, the basic form of the alternate syntax is to change the opening brace to a colon (:) and the closing brace to @@ -262,9 +262,9 @@ $i before the increment (post-increment) */ } - + /* example 2 */ - + $i = 1; while ($i <= 10): print $i; @@ -274,7 +274,7 @@ </informalexample> </para> </sect1> - + <sect1 id="control-structures.do.while"> <title><literal>do..while</literal></title> <simpara> @@ -292,7 +292,7 @@ </simpara> <para> There is just one syntax for <literal>do..while</literal> loops: - + <informalexample> <programlisting role="php"> $i = 0; @@ -340,7 +340,7 @@ `feature'. </simpara> </sect1> - + <sect1 id="control-structures.for"> <title><literal>for</literal></title> <para> @@ -386,22 +386,22 @@ <informalexample> <programlisting role="php"> /* example 1 */ - + for ($i = 1; $i <= 10; $i++) { print $i; } - + /* example 2 */ - + for ($i = 1;;$i++) { if ($i > 10) { break; } print $i; } - + /* example 3 */ - + $i = 1; for (;;) { if ($i > 10) { @@ -410,9 +410,9 @@ print $i; $i++; } - + /* example 4 */ - + for ($i = 1; $i <= 10; print $i, $i++) ; </programlisting> </informalexample> @@ -449,7 +449,7 @@ <title><literal>foreach</literal></title> <para> PHP 4 (not PHP 3) includes a <literal>foreach</literal> construct, - much like perl and some other languages. This simply gives an easy + much like perl and some other languages. This simply gives an easy way to iterate over arrays. There are two syntaxes; the second is a minor but useful extension of the first: <informalexample> @@ -475,7 +475,7 @@ <note> <para> When <literal>foreach</literal> first starts executing, the - internal array pointer is automatically reset to the first element + internal array pointer is automatically reset to the first element of the array. This means that you do not need to call <function>reset</function> before a <literal>foreach</literal> loop. @@ -585,7 +585,7 @@ </informalexample> </para> </sect1> - + <sect1 id="control-structures.break"> <title><literal>break</literal></title> <simpara> @@ -596,7 +596,7 @@ <simpara> <literal>break</literal> accepts an optional numeric argument which tells it how many nested enclosing structures are to be - broken out of. + broken out of. </simpara> <para> <informalexample> @@ -628,7 +628,7 @@ </informalexample> </para> </sect1> - + <sect1 id="control-structures.continue"> <title><literal>continue</literal></title> <simpara> @@ -668,7 +668,7 @@ </informalexample> </para> </sect1> - + <sect1 id="control-structures.switch"> <title><literal>switch</literal></title> <simpara> @@ -678,7 +678,7 @@ different values, and execute a different piece of code depending on which value it equals to. This is exactly what the <literal>switch</literal> statement is for. - </simpara> + </simpara> <para> The following two examples are two different ways to write the same thing, one using a series of <literal>if</literal> @@ -695,7 +695,7 @@ if ($i == 2) { print "i equals 2"; } - + switch ($i) { case 0: print "i equals 0"; @@ -823,47 +823,112 @@ </informalexample> </para> </sect1> - + <sect1 id="control-structures.declare"> <title><literal>declare</literal></title> - <simpara> - The <literal>declare</literal> statement is used to temporarily - change the state of the parser in a block of code. Here's how it looks: - </simpara> <para> + The <literal>declare</literal> construct is used to is + used to set execution directives for a block of code. + The syntax of <literal>declare</literal> is similiar to + the syntax of other flow control constructs: <informalexample> + <programlisting> +declare (directive) statement + </programlisting> + </informalexample> + </para> + <para> + The <literal>directive</literal> section allows the + behavior of the <literal>declare</literal> block to + be set. + Currently only one directive is recognized: the + <literal>ticks</literal> directive. (See below for more + information on the + <link linkend="control-structures.declare.ticks">ticks</link> + directive) + </para> + <para> + The <literal>statement</literal> part of the + <literal>declare</literal> block will be executed - how + it is executed and what side-effects occur during execution + may depend on the directive set in the + <literal>directive</literal> block. + </para> + <sect2 id="control-structures.declare.ticks"> + <title>Ticks</title> + <para>A tick is an event that occurs for every + <replaceable>N</replaceable> low-level statements executed + by the parser within the <literal>declare</literal> block. + The value for <replaceable>N</replaceable> is specified + using <literal>ticks=<replaceable>N</replaceable></literal> + within the <literal>declare</literal> blocks's + <literal>directive</literal> section. + </para> + <para> + The event(s) that occurs on each tick is specified using the + <function>register_tick_function</function>. See the example + below for more details. Note that more than one event can occur + for each tick. + </para> + <para> + <example> + <title>Profile a section of PHP code</title> <programlisting role="php"> -function tick() +<pre> +<?php +// A function that records the time when it is called +function profile ($dump = FALSE) { - static $i; - printf("[tick i=%d]\n", ++$i); + static $profile; + + // Return the times stored in profile, then erase it + if ($dump) { + $temp = $profile; + unset ($profile); + return ($temp); + } + + $profile[] = microtime (); } -register_tick_function("tick"); +// Set up a tick handler +register_tick_function("profile"); -declare (ticks = 2) { - 1; 2; 3; +// Initialize the function before the declare block +profile (); + +// Run a block of code, throw a tick every 2nd statement +declare (ticks=2) { + for ($x = 1; $x < 50; ++$x) { + echo similar_text (md5($x), md5($x*$x)), "<br>"; + } } -</programlisting> - </informalexample> - This example shows the only implemented parser parameter today: - ticks. A tick is an event that occurs for every - <replaceable>N</replaceable> low-level statements executed by the - parser, where <replaceable>N</replaceable> is specified in the - <literal>declare</literal> statement. The example above will print: - <computeroutput>[tick i=1] -[tick i=2] -</computeroutput> + +// Display the data stored in the profiler +print_r (profile (TRUE)); +?> +</pre> + </programlisting> + </example> + The example profiles the PHP code within the 'declare' + block, recording the time at which every second low-level + statement in the block was executed. This information can + then be used to find the slow areas within particular + segments of code. This process can be performed using other + methods: using ticks is more convenient and easier to + implement. </para> <simpara> - Ticks is well suited for implementing simple multitasking, - backgrounded IO and many other things in PHP. + Ticks are well suited for debugging, implementing simple + multitasking, backgrounded I/O and many other tasks. </simpara> <simpara> See also <function>register_tick_function</function> and <function>unregister_tick_function</function>. </simpara> + </sect2> </sect1> + <sect1 id="function.require"> <title><function>require</function></title> <simpara> @@ -947,7 +1012,7 @@ <informalexample> <programlisting role="php"> /* This example assumes that someserver is configured to parse .php - * files and not .txt files. Also, 'works' here means that the variables + * files and not .txt files. Also, 'works' here means that the variables * $varone and $vartwo are available within the require()ed file. */ /* Won't work; file.txt wasn't handled by someserver. */ @@ -955,10 +1020,10 @@ /* Won't work; looks for a file named 'file.php?varone=1&vartwo=2' * on the local filesystem. */ -require ("file.php?varone=1&vartwo=2"); +require ("file.php?varone=1&vartwo=2"); /* Works. */ -require ("http://someserver/file.php?varone=1&vartwo=2"); +require ("http://someserver/file.php?varone=1&vartwo=2"); $varone = 1; $vartwo = 2; @@ -979,10 +1044,10 @@ <simpara> See also <function>include</function>, <function>require_once</function>, <function>include_once</function>, <function>readfile</function>, - and <function>virtual</function>. + and <function>virtual</function>. </simpara> </sect1> - + <sect1 id="function.include"> <title><function>include</function></title> <simpara> @@ -1038,14 +1103,14 @@ <informalexample> <programlisting role="php"> /* This is WRONG and will not work as desired. */ - + if ($condition) include($file); else include($other); - + /* This is CORRECT. */ - + if ($condition) { include($file); } else { @@ -1123,7 +1188,7 @@ </screen> However, PHP 3 will give the following output: <screen> -Before the return +Before the return 27Back in main.html Parse error: parse error in /home/torben/public_html/phptest/main.html on line 5 @@ -1167,7 +1232,7 @@ <informalexample> <programlisting role="php"> /* This example assumes that someserver is configured to parse .php - * files and not .txt files. Also, 'works' here means that the variables + * files and not .txt files. Also, 'works' here means that the variables * $varone and $vartwo are available within the include()ed file. */ /* Won't work; file.txt wasn't handled by someserver. */ @@ -1175,10 +1240,10 @@ /* Won't work; looks for a file named 'file.php?varone=1&vartwo=2' * on the local filesystem. */ -include ("file.php?varone=1&vartwo=2"); +include ("file.php?varone=1&vartwo=2"); /* Works. */ -include ("http://someserver/file.php?varone=1&vartwo=2"); +include ("http://someserver/file.php?varone=1&vartwo=2"); $varone = 1; $vartwo = 2; @@ -1190,58 +1255,58 @@ <simpara> See also <function>require</function>, <function>require_once</function>, <function>include_once</function>, <function>readfile</function>, - and <function>virtual</function>. + and <function>virtual</function>. </simpara> </sect1> - + <sect1 id="function.require-once"> <title><function>require_once</function></title> <para> The <function>require_once</function> statement replaces itself with the specified file, much like the C preprocessor's <literal>#include</literal> works, and in that respect is - similar to the <function>require</function> statement. The main - difference is that in an inclusion chain, the use of - <function>require_once</function> will assure that the code is - added to your script only once, and avoid clashes with variable - values or function names that can happen. + similar to the <function>require</function> statement. The main + difference is that in an inclusion chain, the use of + <function>require_once</function> will assure that the code is + added to your script only once, and avoid clashes with variable + values or function names that can happen. </para> <para> For example, if you create the following 2 include files - <literal>utils.inc</literal> and <literal>foolib.inc</literal> - <example> - <title>utils.inc</title> - <programlisting role="php"> + <literal>utils.inc</literal> and <literal>foolib.inc</literal> + <example> + <title>utils.inc</title> + <programlisting role="php"> <?php define(PHPVERSION, floor(phpversion())); echo "GLOBALS ARE NICE\n"; function goodTea() { - return "Oolong tea tastes good!"; + return "Oolong tea tastes good!"; } ?> - </programlisting> - </example> - <example> - <title>foolib.inc</title> - <programlisting role="php"> + </programlisting> + </example> + <example> + <title>foolib.inc</title> + <programlisting role="php"> <?php require ("utils.inc"); function showVar($var) { - if (PHPVERSION == 4) { - print_r($var); - } else { - var_dump($var); - } + if (PHPVERSION == 4) { + print_r($var); + } else { + var_dump($var); + } } // bunch of other functions ... ?> - </programlisting> - </example> - And then you write a script <literal>cause_error_require.php</literal> - <example> - <title>cause_error_require.php</title> - <programlisting role="php"> + </programlisting> + </example> + And then you write a script <literal>cause_error_require.php</literal> + <example> + <title>cause_error_require.php</title> + <programlisting role="php"> <?php require("foolib.inc"); /* the following will generate an error */ @@ -1253,45 +1318,45 @@ echo "Printing foo: \n"; showVar($foo); ?> - </programlisting> - </example> - When you try running the latter one, the resulting ouptut will be (using - PHP 4.01pl2): - <informalexample> - <programlisting> + </programlisting> + </example> + When you try running the latter one, the resulting ouptut will be (using + PHP 4.01pl2): + <informalexample> + <programlisting> GLOBALS ARE NICE GLOBALS ARE NICE Fatal error: Cannot redeclare goodTea() in utils.inc on line 5 - </programlisting> - </informalexample> - By modifying <literal>foolib.inc</literal> and - <literal>cause_errror_require.php</literal> - to use <function>require_once</function> - instead of <function>require</function> and renaming the - last one to <literal>avoid_error_require_once.php</literal>, we have: - <example> - <title>foolib.inc (fixed)</title> - <programlisting role="php"> + </programlisting> + </informalexample> + By modifying <literal>foolib.inc</literal> and + <literal>cause_errror_require.php</literal> + to use <function>require_once</function> + instead of <function>require</function> and renaming the + last one to <literal>avoid_error_require_once.php</literal>, we have: + <example> + <title>foolib.inc (fixed)</title> + <programlisting role="php"> ... require_once("utils.inc"); function showVar($var) { ... - </programlisting> - </example> - <example> - <title>avoid_error_require_once.php</title> - <programlisting role="php"> + </programlisting> + </example> + <example> + <title>avoid_error_require_once.php</title> + <programlisting role="php"> ... require_once("foolib.inc"); require_once("utils.inc"); $foo = array("1",array("complex","quaternion")); ... - </programlisting> - </example> - And when running the latter, the output will be (using PHP 4.0.1pl2): - <informalexample> - <programlisting> + </programlisting> + </example> + And when running the latter, the output will be (using PHP 4.0.1pl2): + <informalexample> + <programlisting> GLOBALS ARE NICE this is requiring globals.inc again which is also required in foolib.inc @@ -1307,53 +1372,53 @@ ) ) - </programlisting> - </informalexample> + </programlisting> + </informalexample> </para> <para> Also note that, analogous to the behavior of the - <literal>#include</literal> of the C preprocessor, this statement - acts at "compile time", e.g. when the script is parsed and before it - is executed, and should not be used for parts of the script that need - to be inserted dynamically during its execution. You should use - <function>include_once</function> or <function>include</function> - for that purpose. + <literal>#include</literal> of the C preprocessor, this statement + acts at "compile time", e.g. when the script is parsed and before it + is executed, and should not be used for parts of the script that need + to be inserted dynamically during its execution. You should use + <function>include_once</function> or <function>include</function> + for that purpose. </para> <para> - For more examples on using <function>require_once</function> and - <function>include_once</function>, look at the PEAR code included in - the latest PHP source code distributions. + For more examples on using <function>require_once</function> and + <function>include_once</function>, look at the PEAR code included in + the latest PHP source code distributions. </para> <para> See also: <function>require</function>, <function>include</function>, <function>include_once</function>, <function>get_required_files</function>, <function>get_included_files</function>, <function>readfile</function>, - and <function>virtual</function>. + and <function>virtual</function>. </para> </sect1> - + <sect1 id="function.include-once"> <title><function>include_once</function></title> <para> The <function>include_once</function> statement includes and evaluates the specified file during the execution of the script. - This is a behavior similar to the <function>include</function> statement, - with the important difference that if the code from a file has already - been included, it will not be included again. + This is a behavior similar to the <function>include</function> statement, + with the important difference that if the code from a file has already + been included, it will not be included again. </para> <para> As mentioned in the <function>require_once</function> description, the - <function>include_once</function> should be used in the cases in which - the same file might be included and evaluated more than once during a - particular execution of a script, and you want to be sure that it is - included exactly once to avoid problems with function redefinitions, - variable value reassignments, etc. + <function>include_once</function> should be used in the cases in which + the same file might be included and evaluated more than once during a + particular execution of a script, and you want to be sure that it is + included exactly once to avoid problems with function redefinitions, + variable value reassignments, etc. </para> <para> - For more examples on using <function>require_once</function> and - <function>include_once</function>, look at the PEAR code included in - the latest PHP source code distributions. + For more examples on using <function>require_once</function> and + <function>include_once</function>, look at the PEAR code included in + the latest PHP source code distributions. </para> <para> <function>include_once</function> was added in PHP 4.0.1pl2 @@ -1363,12 +1428,12 @@ <function>include</function>, <function>require_once</function>, <function>get_required_files</function>, <function>get_included_files</function>, <function>readfile</function>, - and <function>virtual</function>. + and <function>virtual</function>. </para> </sect1> - + </chapter> - + <!-- Keep this comment at the end of the file Local variables: mode: sgml @@ -1387,4 +1452,4 @@ --> <!-- Keep this comment for vi/vim/gvim vi: et:ts=1:sw=1 ---> +-->