Я действительно заинтересован в том, чтобы убедиться, что на нашей кодовой базе нет ошибок, которые будут предупреждены встроенной ошибкой проверки PHP, но я хотел бы точно указать, что обеспечивает E_STRICT. В дополнение, что такое «строгие стандарты» PHP? Я посмотрел, но не смог найти исчерпывающий список.
Некоторые строгие стандарты, которые я знаю из опыта:
Все, что я знаю об E_STRICT, это то, что он предупреждает о коде, который может нарушить совместимость, но я не уверен, что это конкретно означает.
Есть ли хороший ресурс для информации об этом?
E_STRICT
и «строгие стандарты» – одно и то же. (И они удалены в PHP 7. )
В документации в настоящее время нет списка E_STRICT
предупреждений E_STRICT
, но мы можем легко построить его, E_STRICT
поиск источника PHP .
Список ниже (который я считаю точным с PHP 5.6) был сформирован в системе Unix с помощью следующей методологии:
Клонирование репозитория PHP Git:
git clone https://github.com/php/php-src
Проверка версии 5.6.0:
cd php-src git checkout PHP-5.6.0
Поиск всех файлов C (с расширениями .h
и .c
), содержащими E_STRICT
:
grep --include=*.[ch] -rl . -e E_STRICT
Вручную просматривая каждый из (21) совпадающих файлов, чтобы найти код, испускающий предупреждения E_STRICT
, пытаясь вывести обстоятельства, при которых будет выдаваться предупреждение (я не программист на C, но не слишком сложно хорошо подумать этот материал, особенно с человекочитаемыми сообщениями об ошибках прямо в коде, который поможет вам), а затем тестировать их на интерактивной PHP-оболочке, чтобы убедиться, что я прав.
Учитывая, что описанная выше методология немного грубо и зависит от предположения, что E_STRICT
можно найти в исходном коде рядом со всеми местами, где E_STRICT
предупреждение E_STRICT
, возможно, я пропустил некоторые вещи – но это, надеюсь, по крайней мере близко к являясь полным списком.
Вызов mktime()
без аргументов
php> mktime (); Строгие стандарты PHP: mktime (): вы должны использовать функцию time () вместо этого в коде оболочки php в строке 1
Использование ресурса в качестве индекса массива
php> $ file_pointer = fopen ('/ dev / null', 'r'); php> $ array = [3,4,5,6]; php> $ array [$ file_pointer]; Строгие стандарты PHP: Идентификатор ресурса № 2, используемый как смещение, отбрасывание до целого (2) в коде php shell в строке 1
Передача многобайтовой кодировки, отличной от UTF-8, в htmlentities
php> htmlentities ('qwertyuiop', 0, 'BIG5'); Строгие стандарты PHP: htmlentities (): замена только основных объектов поддерживается для многобайтовых кодировок, отличных от UTF-8; функциональность эквивалентно htmlspecialchars в коде оболочки php в строке 1
Объявление абстрактного статического метода
php> абстрактный класс Foo {статическая абстрактная функция bar (); } Строгие стандарты PHP: статическая функция Foo :: bar () не должна быть абстрактной в Код оболочки php в строке 1
Объявление класса с использованием метода __construct
и функции конструктора старого стиля, названной в честь класса
php> class MyClass { php { function MyClass () {} php { function __construct () {} php { } Строгие стандарты PHP: переопределение уже определенного конструктора для класса MyClass в коде оболочки php в строке 3
Вызов mysqli_next_result
или mysqli::next_result
на объект соединения Mysqli, который не имеет следующего результата для подготовки
php> $ conn = mysqli_connect ('127.0.0.1', 'root'); php> mysqli_multi_query ($ conn, "SELECT 'first'; SELECT 'second';"); php> echo mysqli_use_result ($ conn) -> fetch_row () [0]; первый php> mysqli_next_result ($ conn); php> echo mysqli_use_result ($ conn) -> fetch_row () [0]; второй php> mysqli_next_result ($ conn); Строгие стандарты PHP: mysqli_next_result (): Следующий набор результатов не существует. Пожалуйста, вызовите mysqli_more_results () / mysqli :: more_results (), чтобы проверить, вызвать эту функцию / метод в коде оболочки php в строке 1
Переопределение метода в подклассе для ввода другого аргумента в один и тот же метод в его родительском
php> class A {public function foo ($ x) {}} php> class B extends A {public function foo () {}} Строгие стандарты PHP: декларация B :: foo () должна быть совместима с A :: foo ($ x) в коде оболочки php в строке 1 php> class C extends A {public function foo ($ x, $ y) {}} Строгие стандарты PHP: декларация C :: foo () должна быть совместима с A :: foo ($ x) в коде оболочки php в строке 1
Объявление, совместимое, одно и то же свойство в признаке и класс, который его использует. На самом деле это хорошо документировано :
Если свойство определяет свойство, то класс не может определить свойство с тем же именем, в противном случае выдается ошибка. Это
E_STRICT
если определение класса совместимо (та же видимость и начальное значение) или фатальная ошибка в противном случае.Пример № 12 Разрешение конфликтов
<?php trait PropertiesTrait { public $same = true; public $different = false; } class PropertiesExample { use PropertiesTrait; public $same = true; // Strict Standards public $different = true; // Fatal error } ?>
Пример предупреждения о строгом режиме:
php> trait PropertiesTrait { php { public $ same = true; php { } php> class PropertiesExample { php { use PropertiesTrait; php { public $ same = true; php { } Строгие стандарты PHP: PropertiesExample и PropertiesTrait определяют то же свойство ($ same) в составе PropertiesExample. Это может быть несовместимыми, чтобы улучшить ремонтопригодность, рассмотрите возможность использования аксессуаров методы в чертах вместо этого. Класс был составлен в коде php shell в строке 4
Вызов статического статического метода
php> class Foo {function bar () {}} php> Foo :: bar (); Строгие стандарты PHP: нестатический метод Foo :: bar () не следует вызывать статически в коде оболочки php в строке 1
Ссылаясь на статическое свойство, не статически
php> class Cow {static public $ noise = 'moo'; } php> $ cow = new Cow; php> $ cow-> noise = "MOOOOO"; Строгие стандарты PHP: доступ к статическому свойству Cow :: $ noise как нестационарный в коде php shell в строке 1
Прямо передать результат вызова функции по ссылке .
php> function foo () {return 1; } php> (& $ some_arg) {} php> bar (foo ()); Строгие стандарты PHP: только переменные должны передаваться по ссылке в php код оболочки в строке 1 php> $ var = & foo (); Строгие стандарты PHP: только переменные должны быть назначены по ссылке в Код оболочки php в строке 1
Обратите внимание, что передача других не-переменных по ссылке, например, литералов или констант, является фатальной ошибкой вместо E_STRICT