Несмотря на то, что большинство кода на PHP 4 должно работать безо всяких изменений, вам следует обратить внимание на следующие изменения, повлекшие за собой обратную несовместимость:
E_ERROR вместо E_WARNING.
     Пример неправильного использования:
     $str = 'abc'; unset($str[0]);.
    
   E_WARNING для каждого такого параметра. Будьте
     внимательны, потому что ваш код может вдруг начать генерировать
     ошибки E_WARNING.
    
   PATH_TRANSLATED больше не определяется неявно под
     Apache2 SAPI, в отличие от ситуации в PHP 4, где ей присваивается то же
     значение, что и переменной сервера SCRIPT_FILENAME, когда она
     не определяется Apache. Это изменение было сделано для соответствия » спецификации CGI/1.1. Пожалуйста, обратитесь к » ошибке #23610 для получения дальнейший информации,
     а также посмотрите описание $_SERVER['PATH_TRANSLATED']
     в данном руководстве. Это изменение также имеет место в PHP
     версий >= 4.3.2.
    
   T_ML_COMMENT больше
     не объявляется расширением Tokenizer. Если
     директива error_reporting установлена в E_ALL, PHP
     сгенерирует предупреждение. Несмотря на то, что
     T_ML_COMMENT не использовалась вообще, она
     была объявлена в PHP 4. Как в PHP 4, так и в PHP 5
     // и /* */ определяются как T_COMMENT.
     Так или иначе, комментарии /** */ в стиле PHPDoс,
     которые начиная с PHP 5 анализируются PHP, распознаются как
     T_DOC_COMMENT.
    
   __CLASS__,
      __METHOD__ и __FUNCTION__.
      Значения возвращаются именно в том виде, в котором они были объявлены (с учетом регистра).
     
    FALSE,
      а не -1, если в качестве аргумента функции
      передается неправильный IP-адрес.
     
    
Пример #1 strrpos() и strripos() теперь используют в качестве искомого параметра (needle) всю строку
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
Пример #2 Объект без свойств больше не считается "пустым"
<?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
    // Будет выполнено
}
?>
Пример #3 В некоторых случаях классы должны быть объявлены перед использованием
<?php
//работает без ошибок:
$a = new a();
class a {
}
//вызывает ошибку:
$a = new b();
interface c{
}
class b implements c {
}
?>