Что делает E_STRICT?

Я действительно заинтересован в том, чтобы убедиться, что на нашей кодовой базе нет ошибок, которые будут предупреждены встроенной ошибкой проверки PHP, но я хотел бы точно указать, что обеспечивает E_STRICT. В дополнение, что такое «строгие стандарты» PHP? Я посмотрел, но не смог найти исчерпывающий список.

Некоторые строгие стандарты, которые я знаю из опыта:

  • Предупреждать о вызове нестатических методов статически
  • Предупреждать о несовместимых подклассах
  • Предупреждать о назначении значения по ссылке

Все, что я знаю об E_STRICT, это то, что он предупреждает о коде, который может нарушить совместимость, но я не уверен, что это конкретно означает.

Есть ли хороший ресурс для информации об этом?

E_STRICT и «строгие стандарты» – одно и то же. (И они удалены в PHP 7. )

В документации в настоящее время нет списка E_STRICT предупреждений E_STRICT , но мы можем легко построить его, E_STRICT поиск источника PHP .

Список ниже (который я считаю точным с PHP 5.6) был сформирован в системе Unix с помощью следующей методологии:

  1. Клонирование репозитория PHP Git:

     git clone https://github.com/php/php-src 
  2. Проверка версии 5.6.0:

     cd php-src git checkout PHP-5.6.0 
  3. Поиск всех файлов C (с расширениями .h и .c ), содержащими E_STRICT :

     grep --include=*.[ch] -rl . -e E_STRICT 
  4. Вручную просматривая каждый из (21) совпадающих файлов, чтобы найти код, испускающий предупреждения E_STRICT , пытаясь вывести обстоятельства, при которых будет выдаваться предупреждение (я не программист на C, но не слишком сложно хорошо подумать этот материал, особенно с человекочитаемыми сообщениями об ошибках прямо в коде, который поможет вам), а затем тестировать их на интерактивной PHP-оболочке, чтобы убедиться, что я прав.

Учитывая, что описанная выше методология немного грубо и зависит от предположения, что E_STRICT можно найти в исходном коде рядом со всеми местами, где E_STRICT предупреждение E_STRICT , возможно, я пропустил некоторые вещи – но это, надеюсь, по крайней мере близко к являясь полным списком.

Вещи в PHP, которые вызывают предупреждения E_STRICT

  1. Вызов mktime() без аргументов

      php> mktime ();
     Строгие стандарты PHP: mktime (): вы должны использовать функцию time ()
     вместо этого в коде оболочки php в строке 1 
  2. Использование ресурса в качестве индекса массива

      php> $ file_pointer = fopen ('/ dev / null', 'r');
     php> $ array = [3,4,5,6];
     php> $ array [$ file_pointer];
     Строгие стандарты PHP: Идентификатор ресурса № 2, используемый как смещение, отбрасывание до целого (2)
     в коде php shell в строке 1 
  3. Передача многобайтовой кодировки, отличной от UTF-8, в htmlentities

      php> htmlentities ('qwertyuiop', 0, 'BIG5');
     Строгие стандарты PHP: htmlentities (): замена только основных объектов
     поддерживается для многобайтовых кодировок, отличных от UTF-8;  функциональность
     эквивалентно htmlspecialchars в коде оболочки php в строке 1 
  4. Объявление абстрактного статического метода

      php> абстрактный класс Foo {статическая абстрактная функция bar ();  }
     Строгие стандарты PHP: статическая функция Foo :: bar () не должна быть абстрактной в
     Код оболочки php в строке 1 
  5. Объявление класса с использованием метода __construct и функции конструктора старого стиля, названной в честь класса

      php> class MyClass {
     php { function MyClass () {}
     php { function __construct () {}
     php { }
     Строгие стандарты PHP: переопределение уже определенного конструктора для класса
     MyClass в коде оболочки php в строке 3 
  6. Вызов 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 
  7. Переопределение метода в подклассе для ввода другого аргумента в один и тот же метод в его родительском

      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 
  8. Объявление, совместимое, одно и то же свойство в признаке и класс, который его использует. На самом деле это хорошо документировано :

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

      php> class Foo {function bar () {}}
     php> Foo :: bar ();
     Строгие стандарты PHP: нестатический метод Foo :: bar () не следует вызывать
     статически в коде оболочки php в строке 1 
  10. Ссылаясь на статическое свойство, не статически

      php> class Cow {static public $ noise = 'moo';  }
     php> $ cow = new Cow;
     php> $ cow-> noise = "MOOOOO";
     Строгие стандарты PHP: доступ к статическому свойству Cow :: $ noise как нестационарный
     в коде php shell в строке 1 
  11. Прямо передать результат вызова функции по ссылке .

      php> function foo () {return 1;  }
     php> (& $ some_arg) {}
     php> bar (foo ());
     Строгие стандарты PHP: только переменные должны передаваться по ссылке в php
     код оболочки в строке 1
     php> $ var = & foo ();
     Строгие стандарты PHP: только переменные должны быть назначены по ссылке в
     Код оболочки php в строке 1 

    Обратите внимание, что передача других не-переменных по ссылке, например, литералов или констант, является фатальной ошибкой вместо E_STRICT