Я действительно заинтересован в том, чтобы убедиться, что на нашей кодовой базе нет ошибок, которые будут предупреждены встроенной ошибкой проверки 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