mirror of
https://github.com/sigmasternchen/php-doc-en
synced 2025-03-16 00:48:54 +00:00
replaced incompat.xml with a more detailed description of
possible migration problems and solutions git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@39933 c90b9560-bf6c-de11-be94-00142212c4b1
This commit is contained in:
parent
7dd641009b
commit
89b970ff82
2 changed files with 318 additions and 60 deletions
|
@ -1,60 +0,0 @@
|
|||
<appendix id="incompat">
|
||||
<title>Incompatibilities</title>
|
||||
|
||||
<sect1 id="incompat.php4">
|
||||
<title>Incompatibilities from PHP 3 to PHP 4</title>
|
||||
<itemizedlist>
|
||||
<listitem><simpara>
|
||||
Static variable and class member initializers only accept scalar values (in PHP 3.0 they accepted any valid expression). The impact should be small, since initializers with anything but a simple static value rarely make sense.
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
The scope of break and continue is local to that of an <function>include</function>'d file or an <function>eval</function>'d string. There should be virtually no impact for this incompatibility.
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
A return statement from a <function>require</function>'d file no longer works. It hardly worked in PHP 3.0, so the impact should be fairly small. If you want this functionality - use <function>include</function> instead.
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
<function>unset</function> is no longer a function, but a statement. It was never documented as a function, so the impact here will probably be non existent.
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
The following letter combination is not supported within encapsulated strings: "{$". If you have a string that includes this letter combination, for example, print "{$somevar"; (which printed the letter { and the contents of the variable $somevar in PHP 3.0), it will result in a parse error under Zend. In this case, you would have to change the code to print "\{$somevar"; This incompatability is due to the full variable reference within quoted strings feature added in Zend.
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
The function <function>short_tags</function> no longer works. There is no way to change PHP's short tags behavior in runtime, only by using configuration parameters (.htaccess variables would work well).
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
You can't use PHP 3 dynamic extensions (php3_*.dll on Windows) with PHP 4.
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
The string "0" is now considered empty. This is known to have an effect on phpMyAdmin.
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
In PHP 4, multiple calls to <function>setcookie</function> are performed in the order called, whereas in PHP 3 they were performed in reverse order.
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
<function>unset</function> now breaks the association between a locally scoped variable and one that is globally scoped if the reference is made using the "global" keyword.
|
||||
</simpara></listitem>
|
||||
<listitem><simpara>
|
||||
Associative array subscripts should be quoted. If you fail to quote them, they will be interpreted as constants. This can cause unpredictable results when using keywords such as "NULL" as an unquoted array subscript.
|
||||
</simpara></listitem>
|
||||
</itemizedlist>
|
||||
</sect1>
|
||||
|
||||
</appendix>
|
||||
|
||||
<!-- Keep this comment at the end of the file
|
||||
Local variables:
|
||||
mode: sgml
|
||||
sgml-omittag:t
|
||||
sgml-shorttag:t
|
||||
sgml-minimize-attributes:nil
|
||||
sgml-always-quote-attributes:t
|
||||
sgml-indent-step:1
|
||||
sgml-indent-data:t
|
||||
sgml-parent-document:nil
|
||||
sgml-default-dtd-file:"../manual.ced"
|
||||
sgml-exposed-tags:nil
|
||||
sgml-local-catalogs:nil
|
||||
sgml-local-ecat-files:nil
|
||||
End:
|
||||
-->
|
318
appendices/migration4.xml
Normal file
318
appendices/migration4.xml
Normal file
|
@ -0,0 +1,318 @@
|
|||
<appendix id="migration4">
|
||||
<title>Migrating from PHP 3.0 to PHP 4.0</title>
|
||||
|
||||
<section>
|
||||
<title>What has changed in PHP 4.0</title>
|
||||
<para>
|
||||
PHP 4.0 and the integrated Zend engine have greatly inproved PHPs
|
||||
performance and capabilities, but great care has been taken to
|
||||
break as little existing code as possible. So migrating your code
|
||||
from PHP 3.0 to 4.0 should be much easier than migrating from
|
||||
PHP/FI 2.0 to PHP 3.0. A lot of existing PHP 3.0 code should be
|
||||
ready to run without changes, but you should still know about the
|
||||
few differences and take care to test your code before switching
|
||||
versions in production environments. The following should give you
|
||||
some hints about what to look for.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title>Parser behavior</title>
|
||||
<para>
|
||||
Parsing and execution are now two completely seperated steps, no
|
||||
execution of a files code will happen until the complete file and
|
||||
everything it requires has completely and successfully been parsed.
|
||||
</para>
|
||||
<para>
|
||||
One of the new requirenments introduced with this split is that
|
||||
required and included files now have to be syntactically
|
||||
complete. You can no longer spread the different controling parts
|
||||
of a control structure across file boundaries. That is you cannot
|
||||
start a <literal>for</literal> or <literal>while</literal> loop,
|
||||
an <literal>if</literal> statement or a <literal>switch</literal>
|
||||
block in one file and have the end of loop,
|
||||
<literal>else</literal>, <literal>endif</literal>,
|
||||
<literal>case</literal> or <literal>break</literal> statements in a different file.
|
||||
</para>
|
||||
<para>
|
||||
It still perfectly legal to include additional code within loops
|
||||
or other control structures, only the controling keywords and
|
||||
corresponding curly braces <literal>{...}</literal> have to be
|
||||
within the same compile unit (file or <function>eval</function>ed string).
|
||||
</para>
|
||||
<para>
|
||||
This should not harm to much as spreading code like this should be
|
||||
considered as very bad style anyway.
|
||||
</para>
|
||||
<para>
|
||||
Another thing no longer possible, though rarely seen in PHP 3.0
|
||||
code is returning values from a required file. Returning a value
|
||||
from an included file is still possible.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title>Error reporting</title>
|
||||
|
||||
<section>
|
||||
<title>Configuration changes</title>
|
||||
<para>
|
||||
With PHP 3.0 the error reporting level was set as a simple
|
||||
numeric value formed by summing up the numbers related to
|
||||
different error levels. Usual values where 15 for reporting all
|
||||
errors and warnings or 7 for reporting everything but simple
|
||||
notice messages reporting bad style and things like that.
|
||||
</para>
|
||||
<para>
|
||||
PHP 4.0 now has a greater set of different error and warning
|
||||
levels and comes with a configuration parser that now allows for
|
||||
symbolic constants to be used for setting up the intended behavior.
|
||||
</para>
|
||||
<para>
|
||||
Error reporting level should now be configured by explicitly
|
||||
taking away the warning levels you do not want to generate error
|
||||
messages by x-oring them from the symbolic constant E_ALL. Sounds
|
||||
complicated? Well, lets say you want the error reporting system
|
||||
to report all but the simple style warnings that are categorized
|
||||
by the symbolic constant E_NOTICE. Then you'll put the following
|
||||
into your <filename>php.ini</filename>:
|
||||
<literal>error_reporting = E_ALL & ~ ( E_NOTICE )</literal>.
|
||||
If you wan't to suppress warnings too you add up the appropriate
|
||||
constant within the braces using the binary or operator '|':
|
||||
<literal>error_reporting= E_ALL & ~ ( E_NOTICE | E_WARNING )</literal>.
|
||||
</para>
|
||||
<warning>
|
||||
<para>
|
||||
Using the old values 7 and 15 for setting up error reporting is a
|
||||
very bad idea as this suppresses some of the newly added error
|
||||
classes including parese errors. This may leed to very strange
|
||||
behavior as scripts might no longer work without error messages
|
||||
showing up anywhere.
|
||||
</para>
|
||||
<para>
|
||||
This has lead to a lot of unreproduceable bug reports in the
|
||||
past where people reported script engine problems they were not
|
||||
capable to track down while the true case was usually some
|
||||
missing '}' in a required file that the parser was not able to
|
||||
report due to a misconfigured error reporting system.
|
||||
</para>
|
||||
<para>
|
||||
So checking your error reporting setup should be the first thing
|
||||
to do whenever your scripts silently die. The Zend enginge can
|
||||
be considererd mature enough nowadays to not cause this kind of
|
||||
strange behavior.
|
||||
</para>
|
||||
</warning>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Additional warning messages</title>
|
||||
<para>
|
||||
A lot of existing PHP 3.0 code uses language constructs that
|
||||
should be considered as very bad style as this code, while doing
|
||||
the intended thing now, could easily be broken by changes in
|
||||
other places. PHP 4.0 will output a lot of notice messages in
|
||||
such situations where PHP 3.0 didn't.
|
||||
The easy fix is to just turn off E_NOTICE messages, but it is
|
||||
usually a good idea to fix the code instead.
|
||||
</para>
|
||||
<para>
|
||||
The most common case that will now produce notice messages is the
|
||||
use of unquoted string constants as array indices. Both PHP 3.0
|
||||
and 4.0 will fall back to interprete theese as strings if no
|
||||
keyword or constant is known by that name, but whenever a
|
||||
constant by that name had been defined anywhere else in the code
|
||||
it might break your script. This can even become a security risk
|
||||
if some intruder manages to redefine string constants in a way
|
||||
that makes your script give him access rights he wasn't intended
|
||||
to have. So PHP 4.0 will now warn you whenever you use unquoted
|
||||
string constants as for example in
|
||||
<literal>$HTTP_SERVER_VARS[REQUEST_METHOD]</literal>. Changing it
|
||||
to <literal>$HTTP_SERVER_VARS['REQUEST_METHOD']</literal> will
|
||||
make the parser happy and greatly improve the style and security
|
||||
of your code.
|
||||
</para>
|
||||
<para>
|
||||
Another thing PHP 4.0 will now tell you about is the use of
|
||||
uninitialized variables or array elements.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Initializers</title>
|
||||
<para>
|
||||
Static variable and class member initializers only accept scalar
|
||||
values while in PHP 3.0 they accepted any valid expression.
|
||||
This is, once again, due to the split between parsing and
|
||||
execution as no code has yet been executed when the parser sees
|
||||
the initializer.
|
||||
</para>
|
||||
<para>
|
||||
For classes you should use constructors to initialize member
|
||||
variables instead. For static variables anything but a simple
|
||||
static value rarely makes sense anyway.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title><literal>empty("0")</literal></title>
|
||||
<para>
|
||||
The perhaps most cotroversal change in behavior has happend to the
|
||||
behavior of the <function>empty</function>. A String containing
|
||||
only the character '0' (zero) is now considered empty while it
|
||||
wasn't in PHP 3.0.
|
||||
</para>
|
||||
<para>
|
||||
This new behavior makes sense in web applications, with all input
|
||||
fields returning strings even if numeric input is requested, and
|
||||
with PHP's capabilities of automatic type conversion.
|
||||
But on the other had it might break your code in a rather subtele
|
||||
was, leading to misbehavior that is hard to track down if you
|
||||
do not know about what to look for.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Missing functions</title>
|
||||
<para>
|
||||
While PHP 4.0 comes with a lot of new features, functions and
|
||||
extensions, you may still find some functions from version 3.0
|
||||
missing. A small number of core functions has vanished because
|
||||
they do not work with the new scheme of splitting parsing and
|
||||
execution as introduced into 4.0 with the Zend engine.
|
||||
Other functions and even complete extensions have become obsolete
|
||||
as newer functions and extensions serve the same task better
|
||||
and/or in a more general way. Some functions just simply haven't
|
||||
been ported yet and finally some functions or extensions may be
|
||||
missing due to license conflicts.
|
||||
</para>
|
||||
|
||||
<section>
|
||||
<title>Functions missing due to conceptual changes</title>
|
||||
<para>
|
||||
As PHP 4.0 now seperates parsing from execution it is no longer
|
||||
possible to change the behavior of the parser (now embedded in
|
||||
the Zend engine) at runtime as parsing al already happend by
|
||||
then. So the function <function>short_tags</function> has ceased
|
||||
to exist. You can still change the parsers behavior by setting
|
||||
appropriate values in the <filename>php.ini</filename> file.
|
||||
</para>
|
||||
<para>
|
||||
Another feature from PHP 3.0 that didn't make it into 4.0 is the
|
||||
experimental debugging interface as described in ??? in this
|
||||
manual.
|
||||
A seperate true debuger is promissed to be released as a Zend
|
||||
product but hasn't become visible yet.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Deprecate functions and extensions</title>
|
||||
<para>
|
||||
The Adabas and Solid database extensions are no more. Long live
|
||||
the unified ODBC extension instead.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Changed status for <function>unset</function></title>
|
||||
<para>
|
||||
<function>unset</function>, although still available, is
|
||||
implemented a literal different in PHP 4.0 so that it no longer
|
||||
counts as a 'real' function.
|
||||
</para>
|
||||
<para>
|
||||
This has no direct consequences as
|
||||
the behavior of <function>unset</function> didn't change, but
|
||||
testing for "unset" usign <function>function_exists</function>
|
||||
will return <literal>false</literal> as it would with othern
|
||||
lowlevel functions like <function>echo</function>.
|
||||
</para>
|
||||
<para>
|
||||
Another more practical change is that it is no longer possible to
|
||||
call <function>unset</function> indirectly, that is
|
||||
<literal>$func="unset"; $func($somevar)</literal> won't work anymore.
|
||||
</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>PHP 3.0 extension</title>
|
||||
<para>
|
||||
Extensions written for PHP 3.0 will not work with PHP 4.0
|
||||
anymore, neither as binaries nor at the source level. It is not to
|
||||
difficult to port your extensions to PHP 4.0 if you have access to
|
||||
the origibal sources. A detailed description of the actual
|
||||
porting process is not part of this text (yet).
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Variable substitution in strings</title>
|
||||
<para>
|
||||
PHP 4.0 adds a new mechanism to variable substitution in
|
||||
strings. You can now finally access object member variables and
|
||||
elements from multidimensional arrays within strings.
|
||||
</para>
|
||||
<para>
|
||||
To do so you have to enclose your variables with curly braces
|
||||
with the dollar sign immediately following the opening brace:
|
||||
<literal>{$...}</literal>
|
||||
</para>
|
||||
<para>
|
||||
To embed the value of an object member variable into a string you
|
||||
simply write <literal>"text {$obj->member} text"</literal> while
|
||||
in PHP 3.0 you had to use something like <literal>"text
|
||||
".$obj->member." text"</literal>.
|
||||
</para>
|
||||
<para>
|
||||
This should lead to more readable code, while it may break existing
|
||||
scripts written for PHP 3.0. But ou can easily check for this kind of
|
||||
problem by checking for the character combination
|
||||
<literal>{$</literal> in your code and by replacing it with
|
||||
<literal>\{$</literal> with your favourite search-and-replace tool.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
|
||||
<section>
|
||||
<title>Cookies</title>
|
||||
<para>
|
||||
PHP 3.0 hat the bad habbit of setting cookies in the reverse order
|
||||
of the <function>setcookie</function> calls in your code. PHP 4.0
|
||||
breaks with this habbit and creates the cookie header lines in
|
||||
exactly the same order as you set the cookies in the code.
|
||||
</para>
|
||||
<para>
|
||||
This might break some existing code, but the old behaviour was so
|
||||
strange to understand that it deserved a change to prevent further
|
||||
problems in the future.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
</appendix>
|
||||
|
||||
|
||||
<!-- Keep this comment at the end of the file
|
||||
Local variables:
|
||||
mode: sgml
|
||||
sgml-omittag:t
|
||||
sgml-shorttag:t
|
||||
sgml-minimize-attributes:nil
|
||||
sgml-always-quote-attributes:t
|
||||
sgml-indent-step:1
|
||||
sgml-indent-data:t
|
||||
sgml-parent-document:nil
|
||||
sgml-default-dtd-file:"../../manual.ced"
|
||||
sgml-exposed-tags:nil
|
||||
sgml-local-catalogs:nil
|
||||
sgml-local-ecat-files:nil
|
||||
End:
|
||||
-->
|
Loading…
Reference in a new issue