PHP Velho Oeste 2024

Обратно несовместимые изменения

Хотя большая часть существующего кода PHP 5 должна работать без изменений, обратите внимание на следующие обратно несовместимые изменения:

  • Безопасный режим больше не поддерживается. Любое приложение, которое полагается на безопасный режим, возможно, потребует внесения корректировок по части безопасности.
  • Волшебные кавычки теперь не работают. Приложения, которые используют эту возможность, могут нуждаться в обновлении во избежание проблем с безопасностью. Функции get_magic_quotes_gpc() и get_magic_quotes_runtime() теперь всегда возвращают FALSE. Функция set_magic_quotes_runtime() вызывает ошибку уровня E_CORE_ERROR при попытке разрешить Магические кавычки.
  • Директивы 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; более недопустимы.
  • Кодировкой по умолчанию для функций htmlspecialchars(), htmlentities() и html_entity_decode() сейчас является UTF-8, вместо прежней ISO-8859-1. Обратите внимание, что изменения кодировки вывода с помощью конфигурационной опции default_charset не действует на вышеупомянутые функции до тех пор, пока вы не передадите "" (пустую строку) в качестве параметра кодировки в вызовы функций htmlspecialchars()/htmlentities()/html_entity_decode(). В целом, мы не рекомендуем так делать, потому что вы должны иметь возможность изменить кодировку вывода без воздействия на кодировку во время исполнения, используемую этими функциями. Самый безопасный подход - явно установить кодировку при каждом вызове функций htmlspecialchars(), htmlentities() и html_entity_decode().
  • В расширении даты и времени временная зона не может быть больше установлена с помощью переменной окружения 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 были удалены.
  • Теперь хеш-алгоритм Tiger использует порядок байт big-endian. Изучите пример того, как писать код совместимый как с PHP 5.3 так и с 5.4.
  • Функция array_combine() теперь возвращает array() вместо FALSE, когда в качестве параметров заданы два пустых массива.
  • Если вы используете функцию htmlentities() с азиатскими наборами символов, то она работает также, как функция htmlspecialchars(). Так всегда было в предыдущих версиях PHP, а теперь генерируется ошибка уровня E_STRICT.
  • Третий параметр функции ob_start() изменен с boolean erase на integer flags. Обратите внимание, что код, в котором erase явно задан как FALSE, в PHP 5.4 изменит свое поведение. Посмотрите этот пример, чтобы понять, как писать код, совместимый с PHP 5.3 и 5.4.

Следующие ключевые слова теперь зарезервированы и не могут использоваться в качестве названия функций, классов и т.д.:

Следующие функции были удалены из PHP:

add a note add a note

User Contributed Notes 3 notes

up
40
ky dot patterson at adlinkr dot com
9 years ago
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.
up
30
Chris
11 years ago
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' );
}
?>
up
20
anton at zebooka dot com
10 years ago
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
To Top