Обратно несовместимые изменения
Хотя большая часть существующего кода PHP 5 должна работать без изменений, пожалуйста, примите к сведению следующие обратно несовместимые изменения:
- Безопасный режим более не поддерживается. Любое приложение, которое полагается на безопасный режим, возможно, требует внесения корректировок по части безопасности.
-
"Волшебные" кавычки теперь не работают. Приложения, которые используют
эту возможность, могут нуждаться в обновлении во избежание проблем с безопасностью.
Функции get_magic_quotes_gpc() и get_magic_quotes_runtime()
теперь всегда возвращают
FALSE
. Функция set_magic_quotes_runtime() вызывает ошибку уровняE_CORE_ERROR
при попытке включения Magic quotes. - Директивы php.ini register_globals и register_long_arrays были удалены.
- Удалена директива mbstring.script_encoding. Используйте вместо нее zend.script_encoding.
- Возможность передачи по ссылке во время вызова функции была убрана.
- Операторы break и continue теперь не принимают аргументов в виде переменной. Например, выражение break 1 + foo() * $bar; невозможно. Вы по-прежнему можете использовать явный аргумент в виде статической константы. Например, break 2;. Побочным эффектом этого изменения является то, что конструкции break 0; и continue 0; более недопустимы.
-
В расширении date and time временная зона не может быть более
установлена с помощью переменной окружения TZ. Вместо этого вам необходимо указать временную зону, используя
опцию php.ini date.timezone или функцию date_default_timezone_set().
PHP теперь не будет пытаться определять временную зону. Вместо этого будет установлена зона "UTC" и
выдано предупреждение
E_WARNING
. -
Нецифровые смещения строк, например $a['foo'], где $a - это строка, теперь возвращают
false в функции isset() и true в функции empty() и вызывают предупреждение
E_WARNING
при подобном использовании. Смещения, заданные типами double, bool и null также приводят к генерации предупрежденияE_NOTICE
, а строки, содержащие числа ($a['2']), все еще работают как и раньше. Обратите внимание, что смещения, подобные '12.3' и '5 foobar' рассматриваются как нечисловые и вызывают предупреждениеE_WARNING
, но преобразовываются к 12 и 5 соответственно по причине необходимости сохранения обратной совместимости. Примечание: следующий код возвращает различные результаты. $str='abc';var_dump(isset($str['x'])); // false для PHP 5.4 и выше, но true для 5.3 и ниже -
Преобразование массива в строку теперь приводит к предупреждению
E_NOTICE
, но результат преобразования будет по-прежнему строка "Array". -
Преобразование
NULL
,FALSE
или пустой строки в объект путем добавления свойства теперь будет генерировать ошибку уровняE_WARNING
вместо ошибкиE_STRICT
. - Имена параметров, которые "затеняют" имена суперглобальных переменных, теперь расцениваются как фатальная ошибка. Это правило запрещает код, подобный этому: function foo($_GET, $_POST) {}.
- Хеш-алгоритмы Salsa10 и Salsa20 были удалены.
-
Функция array_combine() теперь возвращает array() вместо
FALSE
, когда в качестве параметров заданы два пустых массива. -
Если вы используете функцию htmlentities() с азиатскими наборами символов,
то она работает также, как функция htmlspecialchars(). Так всегда было
в предыдущих версиях PHP, а теперь генерируется ошибка
уровня
E_STRICT
. -
Третий параметр для ob_start() изменен с
boolean
erase
на integerflags
. Учтите, что код явно задававший параметрerase
равнымFALSE
больше не будет вести себя как ожидалось в PHP 5.4: воспользуйтесь этим примером, чтобы подготовить код для работы и в PHP 5.3 и в 5.4.
Следующие ключевые слова теперь являются зарезервированными и не могут использоваться в качестве названия функций, классов и прочих имен:
Следующие функции были удалены из PHP:
- define_syslog_variables()
- import_request_variables()
- session_is_registered(), session_register() и session_unregister().
- Алиасы mysqli_bind_param(), mysqli_bind_result(), mysqli_client_encoding(), mysqli_fetch(), mysqli_param_count(), mysqli_get_metadata(), mysqli_send_long_data(), mysqli::client_encoding() и mysqli_stmt::stmt().
- Что изменилось в PHP 5.4.x?
- Обратно несовместимые изменения
- Новые возможности
- Изменения в модулях SAPI
- Устаревшие функции и возможности в PHP 5.4.x
- Измененные функции
- Новые функции
- Новые классы и интерфейсы
- Новые методы
- Удаленные расширения
- Другие изменения в расширениях
- Новые глобальные константы
- Изменения в обработке INI-файлов
- Другие изменения
Коментарии
Missing some chars like german umlauts after use of htmlspecialchars? That's because the third param encoding has changed it's default value in PHP 5.4 from ISO-8859-1 to UTF-8.
Possible solution #1:
Change your code from this ...
<?php htmlspecialchars( 'äöü' ); ?>
... to this:
<?php htmlspecialchars ( 'äöü' , ENT_COMPAT | ENT_HTML401 , 'ISO-8859-1' ); ?>
Possible solution #2:
Create a wrapper function and replace htmlspecialchars( to i.e. isohtmlspecialchars( with your IDE/editor/shell...
Example of a wrapper function:
<?php
function isohtmlspecialchars( $str ){
return htmlspecialchars ( $str , ENT_COMPAT | ENT_HTML401 , 'ISO-8859-1' );
}
?>
It seems that starting of PHP 5.4 you can not override class method with different signature.
Example:
<?php
class A
{
public function doSomething($a, $b)
{
}
}
class B extends A
{
public function doSomething($c)
{
}
}
?>
PHP Strict standards: Declaration of B::doSomething() should be compatible with A::doSomething(B $a) in Command line code on line 1
If you have content that is not 100% UTF-8 then TAKE NOTE:
Starting in PHP 5.4 htmlspecialchars() and htmlentities() assume charset=UTF-8 by default AND WILL RETURN BLANK IF YOUR INPUT IS NOT VALID UTF-8.
So if you have a lot of function calls that look like this:
<?php
echo htmlspecialchars($input);
// or
echo htmlentities($input);
?>
i.e. no charset and no flags -- and $input is ISO-8859 (or anything else apart from 7-bit ASCII or UTF-8) -- then PHP 5.4 and 5.5 will return an empty string, and you will be surprised and probably unhappy.
This is apparently a feature, not a bug.