PHP 5.4: отключить предупреждение "Создание объекта по умолчанию из пустого значения"

Я хочу перенести код с PHP 5.2 на 5.4. До сих пор это работало прекрасно, за исключением того, что весь код, который я использую, широко использует только использование объекта с членом без какой-либо инициализации, например:

$MyObject->MyMember = "Hello";

что приводит к предупреждению: "Создание объекта по умолчанию из пустого значения"

Я знаю, что решение должно было бы использовать:

$MyObject = new stdClass();
$MyObject->MyMember = "Hello";

но было бы ПОЛНОСТЬЮ РАБОТЫ изменить это во всем моем коде, потому что я использую это много раз в разных проектах. Я знаю, это не хороший стиль, но, к сожалению, я не могу потратить следующие недели, добавив это ко всему моему коду.

Я знаю, что я могу настроить php error_reporting, чтобы не сообщать предупреждения, но я хочу иметь возможность получать другие предупреждения и уведомления. Это предупреждение, похоже, не срабатывает при включении или отключении E_STRICT. Так есть способ просто отключить это предупреждение?!

Ответ 1

Технически вы можете сделать это с помощью установки собственного обработчика ошибок для предупреждений. Изнутри обработчика проверьте строковое сообщение об ошибке; если это тот, который вы хотите подавить, затем return true, иначе return false, чтобы обработчик ошибок по умолчанию выполнял свою задачу.

Однако я бы порекомендовал делать правильные вещи и вручную исправлять код, где бы это неправильное использование не появлялось, потому что, если не что иное, оно вводит вас в правильную привычку. Если это не оплачиваемая работа (в этом случае обычно возникают проблемы, которые переопределяют чистоту реализации), считайте это уроком и делайте правильные вещи.

Ответ 2

Я знаю, что я могу установить php error_reporting, чтобы не сообщать о предупреждениях, но я хочу иметь возможность получать другие предупреждения и уведомления.

Не отключайте отчет об ошибках, оставьте его на соответствующем уровне, но отключите директиву display_errors:

ini_set('display_errors', 0);

Нет никаких оснований печатать уведомления на экране в процессе производства.

Затем, как сказал Джон, используйте собственный обработчик ошибок, если вы еще этого не сделали, например:

function my_error_handler($error_level, $error_message)
{
    // write error message to log file
}
set_error_handler('my_error_handler');

Вы можете передать уровень отчетности об ошибках ко второму параметру set_error_handler. Таким образом, вы можете потратить свое время и сделать правильные вещи, которые исправляют код, чтобы прекратить генерировать уведомления.

Если вы перемещаете множество сайтов до 5,4, возможно, у вашего администратора сервера отключите display_errors в php.ini, пока у вас не будет достаточно времени, чтобы исправить все. Еще лучше, скомпилируйте все и исправьте его перед обновлением, но это может быть не вариант.

Ответ 3

вы действительно можете использовать IDE для php и попытаться сделать это:

Искать $MyObject->MyMember = "Hello";

Ищите результаты, и если они приносят правильные вещи, попробуйте заменить их:

$MyObject = new stdClass();
$MyObject->MyMember = "Hello";

Итак, возможно, IDE сделает вам долгую работу...

Ответ 4

У меня была та же проблема, с которой я справляюсь, как ниже в производственной среде

    \error_reporting(\E_ERROR);

Я должен сказать, что моему приложению не нужны/генерировать ошибки, он находится в очень контролируемой среде, поэтому это не повредит, но если ваше приложение подвержено ошибкам, вы должны иметь обработчик ошибок и с правильным регулярным выражением и preg_match игнорировать "Creating default object from empty value" предупреждение и журнал/запрос других по вашему усмотрению.