Я хочу перенести код с PHP 5.2 на 5.4. До сих пор это работало прекрасно, за исключением того, что весь используемый мной код широко использует просто использование объекта с членом без какой-либо инициализации, например:
$MyObject->MyMember = "Hello";
что приводит к предупреждению: «Создание объекта по умолчанию из пустого значения»
Я знаю, что решение было бы использовать:
$MyObject = new stdClass(); $MyObject->MyMember = "Hello";
но было бы ПОЛНОСТЬЮ РАБОТЫ изменить это во всем моем коде, потому что я использую это много раз в разных проектах. Я знаю, это не хороший стиль, но, к сожалению, я не могу потратить следующие недели, добавив это ко всему моему коду.
Я знаю, что я могу установить php error_reporting, чтобы не сообщать предупреждения, но я хочу иметь возможность получать другие предупреждения и уведомления. Это предупреждение, похоже, не срабатывает при включении или отключении E_STRICT. Так есть способ просто отключить это предупреждение ?!
Технически вы можете это сделать, установив собственный обработчик ошибок для предупреждений. Изнутри обработчика проверьте строковое сообщение об ошибке; если это тот, который вы хотите подавить, тогда return true
, иначе return false
чтобы обработчик ошибок по умолчанию выполнил свою задачу.
Тем не менее, я бы порекомендовал делать правильные вещи и вручную исправлять код, где бы это неправильное использование не появлялось, потому что, если не что иное, оно вводит вас в правильную привычку. Если это не оплачиваемая работа (в этом случае обычно возникают проблемы, которые переопределяют чистоту реализации), рассмотрите это как урок и делайте правильные вещи.
Я знаю, что я могу установить 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, пока у вас не будет достаточно времени, чтобы исправить все. Еще лучше, скомпилируйте все и исправьте его перед обновлением, но это не вариант.
вы действительно можете использовать IDE для php и попытаться сделать это:
Найти $MyObject->MyMember = "Hello";
Ищите результаты, и если это приносит правильные вещи, попробуйте заменить это:
$MyObject = new stdClass(); $MyObject->MyMember = "Hello";
Так что, возможно, IDE сделает вам долгую работу …
У меня была та же проблема, с которой я справляюсь, например, в производственной среде
\error_reporting(\E_ERROR);
Я должен сказать, что мое приложение не нуждается / генерирует ошибки, оно находится в очень контролируемой среде, поэтому это не сильно повредит, но если ваше приложение является подверженным ошибкам, вы должны иметь собственный обработчик ошибок и надлежащий regex и preg_match игнорируют предупреждение “Creating default object from empty value”
и записывают / сообщают другие по вашему усмотрению.