©
本文档使用 PHP中文网手册 发布
尽管大部分 PHP 4 的代码应该不用修改就能运行,还是应该留意以下不向下兼容的改变:
E_ERROR
而不是
E_WARNING
。一个非法使用的例子:$str = 'abc'; unset($str[0]);.
E_WARNING
信息。要小心因为你的代码有可能疯狂发出
E_WARNING
。
T_ML_COMMENT
常量。如果把
error_reporting 设为 E_ALL
,PHP
将产生一条消息。尽管 T_ML_COMMENT
从来都没用到过,还是在 PHP 4 中定义了。在 PHP 4 和 PHP 5
中 // 和 都被解析为 T_COMMENT
常量。但是 PHPDoc 风格的注释 ,自 PHP 5 开始被
PHP 解析,被识别为 T_DOC_COMMENT
。
__CLASS__
, __METHOD__
和 __FUNCTION__
。其值都会严格按照定义时的名字返回(区分大小写)。
FALSE
,不再是
-1。
Example #1 strrpos() 和 strripos() 如今用整个字符串作为 needle
<?php
var_dump ( strrpos ( 'ABCDEF' , 'DEF' )); //int(3)
var_dump ( strrpos ( 'ABCDEF' , 'DAF' )); //bool(false)
?>
Example #2 没有属性的对象不再被当成“empty”
<?php
class test { }
$t = new test ();
var_dump (empty( $t )); // echo bool(false)
if ( $t ) {
// Will be executed
}
?>
Example #3 有些情况下类必须在使用之前定义
<?php
//works with no errors:
$a = new a ();
class a {
}
//throws an error:
$a = new b ();
interface c {
}
class b implements c {
}
?>
[#1] michael dot darmousseh at gmail dot com [2010-02-03 17:53:00]
Hack way to fix the array_merge problem so that it works with your existing php4 code
<?php
function array_merge5()
{
$args = func_get_args();
foreach($args as $key=>$arg)
$args[$key] = (array) $arg;
return call_user_func_array("array_merge", $args);
}
?>
just put it somewhere completely accessible to your codebase and change all of your calls to array_merge to array_merge5.
[#2] paul at oconnor-web dot net [2008-04-10 04:17:47]
The __call function will also lowercase the method arguement:
<?php
function __call($method, $args) {
if ($method == 'Foo') {
return true;
} else {
return false
}
}
?>
(= false)
[#3] Steven [2008-03-19 16:07:29]
Three more that we discovered:
== 1. No longer can re-assign $this ==
The follwoing example works under PHP4 (it outputs "OK"), but produces a fatal error under PHP5:
<?php
class a
{
var $text;
function a() { $this->text = 'OK'; }
}
class b
{
var $text = 'NOT OK';
function b() { $this = new a(); }
}
$myClass = new b();
echo $myClass->text;
?>
== 2. No comments allowed after shorthand echo block ==
The follwoing example works under PHP4, but produces a sytax error under PHP5.
<?=//comment?>
== 3. Constructors return a reference as default ==
The follwoing example works under PHP4, but produces an E_NOTICE notice under PHP5.
<?php
class MyClass { function MyClass() { echo('OK'); } }
$myObj = null;
$myObj &= new MyClass();
?>
Removing the ampersand solves the problem
[#4] Aggelos Orfanakos [2007-11-08 05:10:02]
As with array_merge(), array_merge_recursive() returns NULL in PHP 5 if a non-array parameter is passed to it.
[#5] Sinured [2007-08-10 04:43:00]
Not mentioned above: The PHP/FI 2 function style (old_function aka cfunction) is no longer supported as of PHP 5.
[#6] nami [2007-07-26 07:22:44]
addition of the note on 07-Sep-2004 06:40
if you write down your code like this PHP5 will just work fine:
<?php
$array_1 = array('key1'=>'oranges','key2'=>'apples');
$array_2 = array('key3'=>'pears','key4'=>'tomatoes');
$array_3 = array();
$arr_gemerged = array_merge($array_1,$array_2,$array_3);
echo "result:<br>";
print_r($arr_gemerged);
echo "<br>";
?>
---
so you have to declare array_3 as array() instead of NULL
[#7] kemal djakman [2007-06-22 06:11:15]
The handling of accessing empty property of a class error has also changed:
<?php
class Foo {
var $Bar = 'xxx';
function F() {
echo $this->$Bar;
}
}
$Obj = new Foo();
$Obj->F();
?>
Notice the $ sign after object dereference opr? $Bar is empty inside method F. PHP4 would only generate a warning, PHP5 throws a fatal error
[#8] Amir Laher [2007-04-29 14:34:36]
Some other things to be aware of:
some extra strictness:
* object members can no longer be accessed using array-member syntax
* function-calls with too many arguments will now cause errors.
Also, from PHP5.2, custom session handlers are affected:
* Best not to use global objects in custom session-handling functions. These would get destructed *before* the session is written (unless session_write_close() is called explicitly).
[#9] [2006-02-28 14:03:24]
is_a have been deprecated. You can simply replace all occurences with the new instanceOf operator, although this will break backwards-compatibility with php4.
[#10] dward . maidencreek.com [2004-11-02 00:54:04]
Another change that we've had problems with while trying to use PHP4 code in PHP5 is how $this is carried across static method calls if they are not declared static in PHP5. The main issue was that debug_backtrace() now shows the first class with -> instead of the second with :: in the backtrace element when the method in the second class was called statically (using ::) from a method in the first class.
[#11] [2004-09-07 09:40:37]
Be careful with array_merge in PHP5.1 not only a E_WARNING is thrown, but also the result is an empty array. So if you merge two select queries and the last one is empty you will end up with no array at all.
<?php
$array_1 = array('key1'=>'oranges','key2'=>'apples');
$array_2 = array('key3'=>'pears','key4'=>'tomatoes');
$array_3 = null;
$arr_gemerged = array_merge($array_1,$array_2,$array_3);
print_r($arr_gemerged);
echo "<br>";
?>
Result on php4:
Array ( [key1] => oranges [key2] => apples [key3] => pears [key4] => tomatoes )
Result on php5:
Warning: array_merge() [function.array-merge]: Argument #3 is not an array in /removed/by/danbrown/for/manual.php on line 7
[#12] john.g [2004-08-26 10:45:41]
PATH_TRANSLATED is handy when using Apache's ModRewrite engine, as it gives you the name and path of the resulting file rather than the one that was requested by the user. Since PHP 5.0 and Apache 2 no longer support this variable, I created a workaround by adding an environment variable to my ModRewrite command:
Original:
RewriteRule ^/test/(.*)\.php(.*) /test/prefix_$1.php$2
Adjusted:
RewriteRule ^/test/(.*)\.php(.*) /test/prefix_$1.php$2 [E=TARGET:prefix_$1.php]
I could then find out the resulting file name through the super global $_ENV, for instance:
<?php
echo "The actual filename is ".$_ENV['REDIRECT_TARGET'];
?>
Note: The "REDIRECT_" prefix appears to be allocated automatically by ModRewrite.
[#13] cyberhorse [2004-08-05 10:07:39]
clone() is a php function now.
if you create a subclass, it no longer uses samename methods in superclass as a constructor.