jimw Fri Jan 19 19:49:35 2001 EDT Modified files: /phpdoc/en/appendices migration.xml Log: incorporate php3 to php4 migration notes from website into manual
Index: phpdoc/en/appendices/migration.xml diff -u phpdoc/en/appendices/migration.xml:1.2 phpdoc/en/appendices/migration.xml:1.3 --- phpdoc/en/appendices/migration.xml:1.2 Thu Dec 9 16:34:36 1999 +++ phpdoc/en/appendices/migration.xml Fri Jan 19 19:49:35 2001 @@ -1,91 +1,213 @@ <appendix id="migration"> - <title>Migrating from PHP/FI 2.0 to PHP 3.0</title> + <title>Migrating from older version of PHP</title> - <sect1 id="migration-about"> - <title>About the incompatbilities in 3.0</title> + <sect1 id="migration.php4"> + <title>Migrating from PHP 3 to PHP 4</title> <simpara> - PHP 3.0 is rewritten from the ground up. It has a proper parser - that is much more robust and consistent than 2.0's. 3.0 is also - significantly faster, and uses less memory. However, some of - these improvements have not been possible without compatibility - changes, both in syntax and functionality.</simpara> + Migration from PHP 3 to PHP 4 is relatively easy, and should + not require you to change your code in any way. There are + minor incompatibilities between the two versions; You may want + to check the incompatibilities list to make sure that you're + indeed not affected by them (the chances you're affected by + these incompatibilities are extremely slim). + </simpara> + + <sect2 id="migration.php4.with-php3"> + <title>Running PHP 3 and PHP 4 concurrently</title> + <simpara> + Recent operating systems provide the ability to perform + versioning and scoping. This features make it possible to let + PHP 3 and PHP 4 run as concurrent modules in one Apache server. + </simpara> + <simpara> + This feature is known to work on the following platforms: + </simpara> + <itemizedlist> + <listitem><simpara>Linux with recent binutils (binutils 2.9.1.0.25 tested) +</simpara></listitem> + <listitem><simpara>Solaris 2.5 or better</simpara></listitem> + <listitem><simpara>FreeBSD (3.2, 4.0 tested)</simpara></listitem> + </itemizedlist> + <para> + To enable it, configure PHP3 and PHP4 to use APXS + (--with-apxs) and the necessary link extensions + (--enable-versioning). Otherwise, all standard installations + instructions apply. For example: + <informalexample><programlisting> +$ ./configure \ + --with-apxs=/apache/bin/apxs \ + --enable-versioning \ + --with-mysql \ + --enable-track-vars +</programlisting></informalexample> + </para> + </sect2> - <simpara> - In addition, PHP's developers have tried to clean up both PHP's - syntax and semantics in version 3.0, and this has also caused some - incompatibilities. In the long run, we believe that these changes - are for the better.</simpara> + <sect2 id="migration.php4.configuration"> + <title>Migration Configuration Files</title> + <sect3 id="migration.php4.configuration.global"> + <title>Global Configuration File</title> + <simpara> + The global configuration file, php3.ini, has changed its name to php.ini. + </simpara> + </sect3> + <sect3 id="migration.php4.configuration.apache"> + <title>Apache Configuration Files</title> + <para> + The MIME types recognized by the PHP module have changed. + <informalexample><programlisting> +application/x-httpd-php3 --> application/x-httpd-php +application/x-httpd-php3-source --> application/x-httpd-php-source +</programlisting></informalexample> + </para> + <para> + You can make your configuration files work with both versions + of PHP (depending on which one is currently compiled into the + server), using the following syntax: + <informalexample><programlisting> +AddType application/x-httpd-php3 .php3 +AddType application/x-httpd-php3-source .php3s - <simpara> - This chapter will try to guide you through the incompatibilities - you might run into when going from PHP/FI 2.0 to PHP 3.0 and help - you resolve them. New features are not mentioned here unless - necessary.</simpara> +AddType application/x-httpd-php .php +AddType application/x-httpd-php-source .phps +</programlisting></informalexample> + </para> + <simpara> + In addition, the PHP directive names for Apache have changed. + </simpara> + <para> + Starting with PHP 4.0, there are only four Apache directives + that relate to PHP: + <informalexample><programlisting> +php_value [PHP directive name] [value] +php_flag [PHP directive name] [On|Off] +php_admin_value [PHP directive name] [value] +php_admin_flag [PHP directive name] [On|Off] +</programlisting></informalexample> + </para> + <simpara> + There are two differences between the Admin values and the non admin values: + </simpara> + <itemizedlist> + <listitem><simpara>Admin values (or flags) can only appear in the server-wide +apache configuration files (e.g., httpd.conf).</simpara></listitem> + <listitem><simpara>Standard values (or flags) cannot control certain PHP +directives, for example - safe mode (if you could override safe mode settings in +.htaccess files, it would defeat safe-mode's purpose). In contrast, Admin values can +modify the value of any PHP directive.</simpara></listitem> + </itemizedlist> + <simpara> + To make the transition process easier, PHP 4.0 is bundled with scripts that +automatically convert your Apache configuration and .htaccess files to work with both +PHP 3.0 and PHP 4.0. These scripts do NOT convert the mime type lines! You have to +convert these yourself. + </simpara> + <para> + To convert your Apache configuration files, run the apconf-conv.sh script +(available in the scripts/apache/ directory). For example: + <informalexample><programlisting> +~/php4/scripts/apache:# ./apconf-conv.sh /usr/local/apache/conf/httpd.conf +</programlisting></informalexample> + </para> + <simpara> + Your original configuration file will be saved in httpd.conf.orig. + </simpara> + <para> + To convert your .htaccess files, run the aphtaccess-conv.sh script (available in +the scripts/apache/ directory as well): + <informalexample><programlisting> +~/php4/scripts/apache:# find / -name .htaccess -exec ./aphtaccess-conv.sh {} \; +</programlisting></informalexample> + </para> + <simpara> + Likewise, your old .htaccess files will be saved with an .orig prefix. + </simpara> + <simpara> + The conversion scripts require awk to be installed. + </simpara> + </sect3> - <simpara> - A conversion program that can automatically convert your old - PHP/FI 2.0 scripts exists. It can be found in the <filename class="directory">convertor</filename> subdirectory of the PHP 3.0 - distribution. This program only catches the syntax changes though, - so you should read this chapter carefully anyway.</simpara></sect1> - - <sect1 id="migration-startendtags"> - <title>Start/end tags</title> - - <para> - The first thing you probably will notice is that PHP's start and end - tags have changed. The old <literal><? ></literal> form has been - replaced by three new possible forms: - <example> - <title>Migration: old start/end tags</title> - <programlisting> + </sect2> + </sect1> + + <sect1 id="migration.php3"> + <title>Migrating from PHP/FI 2.0 to PHP 3.0</title> + + <sect2 id="migration-about"> + <title>About the incompatibilities in 3.0</title> + <simpara> + PHP 3.0 is rewritten from the ground up. It has a proper parser + that is much more robust and consistent than 2.0's. 3.0 is also + significantly faster, and uses less memory. However, some of + these improvements have not been possible without compatibility + changes, both in syntax and functionality.</simpara> + + <simpara> + In addition, PHP's developers have tried to clean up both PHP's + syntax and semantics in version 3.0, and this has also caused some + incompatibilities. In the long run, we believe that these changes + are for the better.</simpara> + + <simpara> + This chapter will try to guide you through the incompatibilities + you might run into when going from PHP/FI 2.0 to PHP 3.0 and help + you resolve them. New features are not mentioned here unless + necessary.</simpara> + + <simpara> + A conversion program that can automatically convert your old + PHP/FI 2.0 scripts exists. It can be found in the <filename +class="directory">convertor</filename> subdirectory of the PHP 3.0 + distribution. This program only catches the syntax changes though, + so you should read this chapter carefully anyway.</simpara></sect2> + + <sect2 id="migration-startendtags"> + <title>Start/end tags</title> + + <para> + The first thing you probably will notice is that PHP's start and end + tags have changed. The old <literal><? ></literal> form has been + replaced by three new possible forms: + <example> + <title>Migration: old start/end tags</title> + <programlisting> <? echo "This is PHP/FI 2.0 code.\n"; > </programlisting></example> - As of version 2.0, PHP/FI also supports this variation: + As of version 2.0, PHP/FI also supports this variation: - <example><title>Migration: first new start/end tags</title> - <programlisting> + <example><title>Migration: first new start/end tags</title> + <programlisting> <? echo "This is PHP 3.0 code!\n"; ?> </programlisting></example> - Notice that the end tag now consists of a question mark and a - greater-than character instead of just greater-than. However, if - you plan on using XML on your server, you will get problems with - the first new variant, because PHP may try to execute the XML - markup in XML documents as PHP code. Because of this, the - following variation was introduced: + Notice that the end tag now consists of a question mark and a + greater-than character instead of just greater-than. However, if + you plan on using XML on your server, you will get problems with + the first new variant, because PHP may try to execute the XML + markup in XML documents as PHP code. Because of this, the + following variation was introduced: - <example><title>Migration: second new start/end tags</title> - <programlisting> + <example><title>Migration: second new start/end tags</title> + <programlisting> <?php echo "This is PHP 3.0 code!\n"; ?> </programlisting></example> - Some people have had problems with editors that don't understand - the processing instruction tags at all. Microsoft FrontPage is one - such editor, and as a workaround for these, the following variation - was introduced as well: + Some people have had problems with editors that don't understand + the processing instruction tags at all. Microsoft FrontPage is one + such editor, and as a workaround for these, the following variation + was introduced as well: - <example><title>Migration: third new start/end tags</title> - <programlisting> + <example><title>Migration: third new start/end tags</title> + <programlisting> <script language="php"> echo "This is PHP 3.0 code!\n"; </script> -</programlisting></example></para></sect1> +</programlisting></example></para></sect2> - <sect1 id="migration-if-endif"> - <title>if..endif syntax</title> + <sect2 id="migration-if-endif"> + <title>if..endif syntax</title> - <para> - The `alternative' way to write if/elseif/else statements, using if(); - elseif(); else; endif; cannot be efficiently implemented without - adding a large amount of complexity to the 3.0 parser. Because of - this, the syntax has been changed: - <example> - <title>Migration: old if..endif syntax</title> - <programlisting> + <para> + The `alternative' way to write if/elseif/else statements, using if(); + elseif(); else; endif; cannot be efficiently implemented without + adding a large amount of complexity to the 3.0 parser. Because of + this, the syntax has been changed: + <example> + <title>Migration: old if..endif syntax</title> + <programlisting> if ($foo); echo "yep\n"; elseif ($bar); @@ -94,9 +216,9 @@ echo "nope\n"; endif; </programlisting></example> - <example> - <title>Migration: new if..endif syntax</title> - <programlisting> + <example> + <title>Migration: new if..endif syntax</title> + <programlisting> if ($foo): echo "yep\n"; elseif ($bar): @@ -106,46 +228,46 @@ endif; </programlisting></example> - Notice that the semicolons have been replaced by colons in all - statements but the one terminating the expression (endif).</para></sect1> + Notice that the semicolons have been replaced by colons in all + statements but the one terminating the expression (endif).</para></sect2> - <sect1 id="migration-while"> - <title>while syntax</title> - <para> - Just like with if..endif, the syntax of while..endwhile has changed - as well: - <example><title>Migration: old while..endwhile syntax</title> - <programlisting> + <sect2 id="migration-while"> + <title>while syntax</title> + <para> + Just like with if..endif, the syntax of while..endwhile has changed + as well: + <example><title>Migration: old while..endwhile syntax</title> + <programlisting> while ($more_to_come); ... endwhile; </programlisting></example> - <example><title>Migration: new while..endwhile syntax</title> - <programlisting> + <example><title>Migration: new while..endwhile syntax</title> + <programlisting> while ($more_to_come): ... endwhile; </programlisting></example> - </para> - <warning> - <simpara> - If you use the old while..endwhile syntax in PHP 3.0, you will get - a never-ending loop. - </simpara> - </warning></sect1> + </para> + <warning> + <simpara> + If you use the old while..endwhile syntax in PHP 3.0, you will get + a never-ending loop. + </simpara> + </warning></sect2> - <sect1 id="migration-expr"> - <title>Expression types</title> - <simpara> - PHP/FI 2.0 used the left side of expressions to determine what type - the result should be. PHP 3.0 takes both sides into account when - determining result types, and this may cause 2.0 scripts to behave - unexpectedly in 3.0.</simpara> - <simpara></simpara> - - <para> - Consider this example: - <informalexample><programlisting> + <sect2 id="migration-expr"> + <title>Expression types</title> + <simpara> + PHP/FI 2.0 used the left side of expressions to determine what type + the result should be. PHP 3.0 takes both sides into account when + determining result types, and this may cause 2.0 scripts to behave + unexpectedly in 3.0.</simpara> + <simpara></simpara> + + <para> + Consider this example: + <informalexample><programlisting> $a[0]=5; $a[1]=7; @@ -156,151 +278,152 @@ } </programlisting></informalexample> - In PHP/FI 2.0, this would display both of $a's indices. In PHP - 3.0, it wouldn't display anything. The reason is that in PHP 2.0, - because the left argument's type was string, a string comparison - was made, and indeed <literal>""</literal> does not equal - <literal>"0"</literal>, and the loop went through. In PHP 3.0, - when a string is compared with an integer, an integer comparison is - made (the string is converted to an integer). This results in - comparing <literal>atoi("")</literal> which is - <literal>0</literal>, and <literal>variablelist</literal> which is - also <literal>0</literal>, and since <literal>0==0</literal>, the - loop doesn't go through even once. - - </para> - <para> - The fix for this is simple. Replace the while statement with: - <informalexample><programlisting> + In PHP/FI 2.0, this would display both of $a's indices. In PHP + 3.0, it wouldn't display anything. The reason is that in PHP 2.0, + because the left argument's type was string, a string comparison + was made, and indeed <literal>""</literal> does not equal + <literal>"0"</literal>, and the loop went through. In PHP 3.0, + when a string is compared with an integer, an integer comparison is + made (the string is converted to an integer). This results in + comparing <literal>atoi("")</literal> which is + <literal>0</literal>, and <literal>variablelist</literal> which is + also <literal>0</literal>, and since <literal>0==0</literal>, the + loop doesn't go through even once. + + </para> + <para> + The fix for this is simple. Replace the while statement with: + <informalexample><programlisting> while ((string)$key != "") { -</programlisting></informalexample></para></sect1> +</programlisting></informalexample></para></sect2> - <sect1 id="migration-errors"> - <title>Error messages have changed</title> - <simpara> - PHP 3.0's error messages are usually more accurate than 2.0's were, - but you no longer get to see the code fragment causing the error. - You will be supplied with a file name and a line number for the - error, though. - </simpara></sect1> + <sect2 id="migration-errors"> + <title>Error messages have changed</title> + <simpara> + PHP 3.0's error messages are usually more accurate than 2.0's were, + but you no longer get to see the code fragment causing the error. + You will be supplied with a file name and a line number for the + error, though. + </simpara></sect2> - <sect1 id="migration-booleval"> - <title>Short-circuited boolean evaluation</title> - <simpara> - In PHP 3.0 boolean evaluation is short-circuited. This means that - in an expression like <literal>(1 || test_me())</literal>, the - function <function>test_me</function> would not be executed since - nothing can change the result of the expression after the - <literal>1</literal>.</simpara> - - <simpara> - This is a minor compatibility issue, but may cause unexpected - side-effects.</simpara></sect1> + <sect2 id="migration-booleval"> + <title>Short-circuited boolean evaluation</title> + <simpara> + In PHP 3.0 boolean evaluation is short-circuited. This means that + in an expression like <literal>(1 || test_me())</literal>, the + function <function>test_me</function> would not be executed since + nothing can change the result of the expression after the + <literal>1</literal>.</simpara> + + <simpara> + This is a minor compatibility issue, but may cause unexpected + side-effects.</simpara></sect2> - <sect1 id="migration-truefalse"> - <title>Function true/false return values</title> - <simpara> - Most internal functions have been rewritten so they return TRUE - when successful and FALSE when failing, as opposed to 0 and -1 in - PHP/FI 2.0, respectively. The new behaviour allows for more - logical code, like <literal>$fp = fopen("/your/file") or - fail("darn!");</literal>. Because PHP/FI 2.0 had no clear rules - for what functions should return when they failed, most such - scripts will probably have to be checked manually after using the - 2.0 to 3.0 convertor.</simpara> - <para> - <example> - <title>Migration from 2.0: return values, old code</title> - <programlisting> + <sect2 id="migration-truefalse"> + <title>Function true/false return values</title> + <simpara> + Most internal functions have been rewritten so they return TRUE + when successful and FALSE when failing, as opposed to 0 and -1 in + PHP/FI 2.0, respectively. The new behaviour allows for more + logical code, like <literal>$fp = fopen("/your/file") or + fail("darn!");</literal>. Because PHP/FI 2.0 had no clear rules + for what functions should return when they failed, most such + scripts will probably have to be checked manually after using the + 2.0 to 3.0 convertor.</simpara> + <para> + <example> + <title>Migration from 2.0: return values, old code</title> + <programlisting> $fp = fopen($file, "r"); if ($fp == -1); echo("Could not open $file for reading<br>\n"); endif; </programlisting> - </example> - <example> - <title>Migration from 2.0: return values, new code</title> - <programlisting> + </example> + <example> + <title>Migration from 2.0: return values, new code</title> + <programlisting> $fp = @fopen($file, "r") or print("Could not open $file for reading<br>\n"); </programlisting> - </example></para></sect1> - - - <sect1 id="migration-other"> - <title>Other incompatibilities</title> + </example></para></sect2> - <itemizedlist> - <listitem><simpara> - The PHP 3.0 Apache module no longer supports Apache versions - prior to 1.2. Apache 1.2 or later is required.</simpara></listitem> - - <listitem><simpara> <function>echo</function> no longer - supports a format string. Use the - <function>printf</function> function instead.</simpara></listitem> - - <listitem><simpara> - In PHP/FI 2.0, an implementation side-effect caused - <literal>$foo[0]</literal> to have the same effect as - <literal>$foo</literal>. This is not true for PHP 3.0.</simpara></listitem> - - <listitem><simpara> - Reading arrays with <literal>$array[]</literal> is no longer - supported</simpara> - - <simpara> - That is, you cannot traverse an array by having a loop that does - <literal>$data = $array[]</literal>. Use - <function>current</function> and <function>next</function> - instead.</simpara> - <simpara> - Also, <literal>$array1[] = $array2</literal> does not append the - values of <literal>$array2</literal> to <literal>$array1</literal>, - but appends <literal>$array2</literal> as the last entry of - <literal>$array1</literal>. See also multidimensional array - support.</simpara></listitem> - - <listitem> - <simpara> <literal>"+"</literal> is no longer overloaded as a - concatenation operator for strings, instead it converts it's - arguments to numbers and performs numeric addition. Use - <literal>"."</literal> instead.</simpara></listitem> - </itemizedlist> + + <sect2 id="migration-other"> + <title>Other incompatibilities</title> - <example> - <title>Migration from 2.0: concatenation for strings</title> - <programlisting> + <itemizedlist> + <listitem><simpara> + The PHP 3.0 Apache module no longer supports Apache versions + prior to 1.2. Apache 1.2 or later is required.</simpara></listitem> + + <listitem><simpara> <function>echo</function> no longer + supports a format string. Use the + <function>printf</function> function instead.</simpara></listitem> + + <listitem><simpara> + In PHP/FI 2.0, an implementation side-effect caused + <literal>$foo[0]</literal> to have the same effect as + <literal>$foo</literal>. This is not true for PHP 3.0.</simpara></listitem> + + <listitem><simpara> + Reading arrays with <literal>$array[]</literal> is no longer + supported</simpara> + + <simpara> + That is, you cannot traverse an array by having a loop that does + <literal>$data = $array[]</literal>. Use + <function>current</function> and <function>next</function> + instead.</simpara> + <simpara> + Also, <literal>$array1[] = $array2</literal> does not append the + values of <literal>$array2</literal> to <literal>$array1</literal>, + but appends <literal>$array2</literal> as the last entry of + <literal>$array1</literal>. See also multidimensional array + support.</simpara></listitem> + + <listitem> + <simpara> <literal>"+"</literal> is no longer overloaded as a + concatenation operator for strings, instead it converts it's + arguments to numbers and performs numeric addition. Use + <literal>"."</literal> instead.</simpara></listitem> + </itemizedlist> + + <example> + <title>Migration from 2.0: concatenation for strings</title> + <programlisting> echo "1" + "1"; </programlisting> - <para> - In PHP 2.0 this would echo 11, in PHP 3.0 it would echo 2. Instead - use: + <para> + In PHP 2.0 this would echo 11, in PHP 3.0 it would echo 2. Instead + use: - <programlisting> + <programlisting> echo "1"."1"; </programlisting> - <programlisting> + <programlisting> $a = 1; $b = 1; echo $a + $b; </programlisting></para> - <para> - This would echo 2 in both PHP 2.0 and 3.0. + <para> + This would echo 2 in both PHP 2.0 and 3.0. - <programlisting> + <programlisting> $a = 1; $b = 1; echo $a.$b; </programlisting> - This will echo 11 in PHP 3.0.</para> - </example></sect1> + This will echo 11 in PHP 3.0.</para> + </example></sect2> + </sect1> - </appendix> +</appendix> <!-- Keep this comment at the end of the file Local variables: