Реакция PHP на ошибки, сообщения и прочее задается в файле конфигурации php.ini, и обычно различают установки среды компьютера разработчки от установок на сервера хостера:
; error_reporting
; Default Value: E_ALL & ~E_NOTICE
; Development Value: E_ALL | E_STRICT
; Production Value: E_ALL & ~E_DEPRECATED
Но… Собственно говоря, NOTICE для того и добавлены в PHP, чтобы исключать ощибки подобные вашему примеру. Проинициализиров одну переменную и использую далее по невнимательности другую, вам будет обеспечен квест по поиску, что и где пошло не так, как вы ожидали…
To Sergejs: вопрос поставлен не в том, что бы скрыть нотисы, а что бы они не считались "fatal error". Это очень разные вещи.
To kolossus: странно, но у меня Yii себя не ведет так строго. Собственно говоря я даже затрудняюсь заставить её выводить нотисы, наверное для этого нужно менять php.ini, не то что бы прекращать выполнение.
А ты случайно свои обработчики ошибок не устанавливал? Уж очень симптомы на использование set_error_handler похожи.
А если сгенерировать новое приложение с нуля, в нем тоже нотисы будут приводить к остановке выполнения?
Я решил присоедениться к вопросу. Нашел похожую тему тут в ней тоже никто ответа дать не смог и все скатилось в "лучше писать так, что бы нотисы не валились, - но как сделать что бы нотисы не останавливали выполнение скрипта?! - … "
Есть пара случаев, один из которых kolossus уже указал, где не определенная переменная никакой проблемы не создает, но генерируемый её нотис останавливает скрипт, и это бесит, особенно когда нотис не в твоем коде.
И что самое обидное- экранирование собачкой не устраняет этот нотис!
Вопрос был "как выводить нотисы, но не останавливать ими работу скрипта, или хотя что бы экранированные собачкой случаи не приводили к остановке программы".
А это значит "так сделать невозможно потому-то таков РНР и его set_error_handler" или "мы специально так сделали что бы вы приучались писать правильный код"?
согласитесь, что если разработчики PHP сделали Notice, сделали возможность его отключить, то я должен иметь эту возможность! Иначе, следуя Вашей логике, разработчики PHP перемудрили, Notice можно было не делать, пусть относятся к полноценным ERROR. Так давайте напишем им в багтрэк, пусть они исправят этот косяк, в Yii ведь его исправили! да? или может быть Yii все таки может быть таким же гибким как PHP?
Не соглашусь - php трудно называть "правильным" языком программирования - очень много неоднозначностей и спорных возможностей, которые потворствуют плохому стилю программирования.
На мой взгляд Yii во многом позволяет скрыть недостатки php, а возможность отключения notice для меня именно недостаток, а не гибкость.
По сути - смотрите схему обработки ошибок - если установить константу YII_ENABLE_ERROR_HANDLER в false, то notice, warining и т.д. будут обрабатываться самим php.
Другой вариант - переопределить CApplication::handleError и для notice вывести ошибку, но не завершать приложение.
Ну это Ваше личное мнение и думаю очень многие с Вами не согласны
Тогда зачем на нем писать Yii? выбрали бы другой язык, более правильный
Yii вроде как создан для удобства или может я ошибаюсь и его создали для урезания функционала PHP? Я только знакомлюсь с Yii, может в нем меня ждет еще много подобных сюрпризов? Очень надеюсь что нет, ведь очень многие хвалят его!
define(‘YII_ENABLE_ERROR_HANDLER’,false); - к сожалению, это не позволяет php обрабатывать notice, warining и т.д. самому, иначе бы я не продолжал здесь дискусию, а те кто писал Выше, думаю не заводили бы эту тему.
Это Вы так считаете, я так не считаю, наши мнения расходятся наверное потому что Вы не смогли объяснить, свою позицию на примере. Не имею ввиду мнения Ваши и мои, а имею ввиду мнение тех кто писал Выше (тех, кто думает так же как я). Без обид, просто объясню, обратите внимание, они аргументированно показали Вам код и возможно ждали от Вас подобного ответа, как от более профессионального знатока. Коем, как я понял Вы и являетесь, ведь Вы написали книгу по Yii, а это очень серьезно.
Я тоже последую ребятам и приведу пример:
<?php
$z = $_GET['z']? 1 : 0;
вот объясните, что злого в этом коде, что здесь неприемлемо?
Не всегда можно выбирать то что нравится )). Тем более, что я не считаю php плохим языком - только не очень безопасным. И Yii помогает избежать многих острых углов.
Константу определяйте в index.php, править код самого фреймворка - тоже плохая затея.
Вот так у меня php notice выводится:
<?php
// change the following paths if necessary
$yii=dirname(__FILE__).'/../.............../yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';
// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
defined('YII_ENABLE_ERROR_HANDLER') or define('YII_ENABLE_ERROR_HANDLER',false);
require_once($yii);
$app = Yii::createWebApplication($config);
// $s = "Ok.";
$n = "This is:".$s."\n\n";
echo $n;
$app->run();
Так зачем вы вообще тогда дискуссию затеяли… Как вернуться к стандартному поведению php (исходный вопрос в топике) - я показал.
Хотите игнорировать notice’s - отключите его в php.ini или в htaccess - это к Yii вообще никакого отношения не имеет.
Хотя это в любом случае плохая практика, советую все таки прислушаться к совету samdark. Ошибки нужно исправлять, а не прятать, а использование неинициализированной переменой - это ошибка.
Это я для наглядности поправил, чтобы Вам не казалось, что я правил исходники Yii.
Чтобы доказать это, просто сами загляните в /YiiRoot/framework/yii.php и увидите там:
require(dirname(__FILE__).'/YiiRoot/framework/YiiBase.php');
class Yii extends YiiBase
{
}
так что, я ничего в исходниках не менял, надеюсь вопрос изменения исходников Yii исчерпан (всех просим извинить за оффтоп).
А теперь по существу
Доступа к php.ini у меня нет (следовательно поменять его не смогу)
В htaccess error_reporting назначить E_ERROR|E_PARSE|E_COMPILE_ERROR я тоже не могу
Моя практика говорит мне, что это стандартная ситуация на большинстве недорогих хостингов.
Теперь по поводу Вашего совета:
К примеру: Notice: Undefined index: z - это не ошибка, а Notice!
Пожалуйста, не учите меня PHP, я ведь не спрашиваю как кодить, я спрашиваю как работать с Yii.
Надеюсь не обидел Вас своим постом, а то люди разные бывают, думают что я просто так спрашиваю или хочу показаться умнее. А я ведь всего лишь хочу, чтобы Yii прислушался моих E_ERROR|E_PARSE|E_COMPILE_ERROR
Поэтому еще раз вопрос, я хочу не выводить notice (игнорировать их), как сделать, чтобы Yii меня услышал?