Although  most existing PHP 4 code should work without changes in  PHP5, you should pay  attention to the following backward incompatible changes:  
- There are some new reserved keywords.  
 - strrpos() and strripos() now use the entire string as  a needle. 
 - Illegal use of string offsets  causes E_ERROR  instead of E_WARNING. An example illegal use is:  $str = 'abc';  unset($str[0]);. 
 - array_merge() was changed to accept  only arrays. If a non-array variable is passed, a E_WARNING  will be thrown for every such parameter. Be careful because your code may start  emitting E_WARNING  out of the blue. 
 - PATH_TRANSLATED server variable is  no longer set implicitly under Apache2 SAPI in contrast to the situation in PHP  4, where it is set to the same value as the SCRIPT_FILENAME server variable when  it is not populated by Apache. This change was made to comply with the » CGI specification. Please refer to » bug #23610 for further information,  and see also the $_SERVER['PATH_TRANSLATED'] description  in the manual. This issue also affects PHP versions >= 4.3.2.  
 - The T_ML_COMMENT  constant is no longer defined by the Tokenizer extension. If error_reporting  is set to E_ALL, PHP will generate a notice.  Although the T_ML_COMMENT  was never used at all, it was defined in PHP 4. In both PHP 4 and PHP 5 // and  /* */ are resolved as the T_COMMENT  constant. However the PHPDoc style comments /** */, which starting PHP 5 are  parsed by PHP, are recognized as T_DOC_COMMENT. 
 - $_SERVER should be populated with  argc and argv if variables_order includes "S". If you  have specifically configured your system to not create $_SERVER, then of course  it shouldn't be there. The change was to always make argc and argv available in  the CLI version regardless of the variables_order setting. As in, the CLI  version will now always populate the global $argc and $argv variables.  
 - An object with no properties is no  longer considered "empty". 
 - In some cases classes must be  declared before use. It only happens if some of the new features of PHP 5 (such  as interfaces) are used. Otherwise the  behaviour is the old. 
 
§          get_class(), get_parent_class() and get_class_methods() now return the name  of the classes/methods as they were declared (case-sensitive) which may lead to  problems in older scripts that rely on the previous behaviour (the class/method  name was always returned lowercased). A possible solution is to search for those  functions in all your scripts and use strtolower().  
This case  sensitivity change also applies to the magical predefined constants  __CLASS__,  __METHOD__, and  __FUNCTION__. The values are  returned exactly as they're declared (case-sensitive).  
- ip2long() now returns  FALSE  when an invalid IP address is passed as argument to the function, and no longer  -1.  
 - If there are functions defined in  the included file, they can be used in the main file independent if they are  before return() or after. If the file is  included twice, PHP 5 issues fatal error because functions were already  declared, while PHP 4 doesn't complain about it. It is recommended to use include_once() instead of checking if  the file was already included and conditionally return inside the included file.  
 - include_once() and require_once() first normalize the path  of included file on Windows so that including A.php and a.php include the file  just once. 
 
Reference: http://www.php.net/manual/en/migration5.incompatible.php