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"
предупреждение и журнал/запрос других по вашему усмотрению.