Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
// clean all buffers
while (ob_get_level()) {
ob_end_clean();
}
<script>
foo={}
if(foo.bar == false) {
alert("You won't see me!");
}
</script>
<?php
Class Foo
{
}
$bar = new Foo();
if($bar->baz == false && $not_defined_var == false)
{
echo "BINGO!";
}
<script>
try {
if(not_defined_var == false) {
}
} catch (e) {
alert('HAHA!');
}
</script>
> несуществующий индекс выбросит исключение в питоне
Но не выбросит в javascript и это тоже нормально.
$fp = fsockopen($host, $port, $errno, $errstr);
if (!$fp) {
echo "ERROR: $errno - $errstr<br />\n";
} else {
fwrite($fp, "\n");
echo fread($fp, 128);
fclose($fp);
}
@mysql_connect($host, $user, $pass) or die();
if (file_exists($file)) unlink($file);
warning.@unlink($file);
$name = @$_GET['name'] ?: $defaultName;
$name = isset($_GET['name']) ? $_GET['name'] : $defaultName;
@ хуже чем isset? Т.е. Вы бы мне руки оторвали за такую запись?Хотелось бы услышать конструктивную критику приведенных примеров.Использование @ для подавления ошибок снижает производительность. Иногда этим можно пренебречь иногда нет.
<?php
$count = 100000;
$t = microtime(1);
for ($i = 0; $i < $count; $i++) {
$zzz = isset($xxx);
}
$t = microtime(1) - $t;
echo "isset: $t<br>";
$t = microtime(1);
for ($i = 0; $i < $count; $i++) {
$zzz = @$xxx;
}
$t = microtime(1) - $t;
echo "@: $t<br>";
isset: 0.0094430446624756
@: 0.080410003662109
isset: 0.0065739154815674
@: 0.059032201766968
set_error_handler(function() {
sleep(1000);
});
% cat test1.php
<?php
function x() { }
for ($i = 0; $i < 1000000; $i++) { x(); }
% time php test1.php
php test1.php 1,24s user 0,03s system 69% cpu 1,833 total
% cat test2.php
<?php
function x() { }
for ($i = 0; $i < 1000000; $i++) { @x(); }
% time php test2.php
php test2.php 1,51s user 0,03s system 75% cpu 2,059 total
будет райзиться ошибка в кастомном хендлере, если он есть (это дополнительный тормоз)
@foo($bar);
$e = error_reporting(0);
foo($bar);
error_reporting($e);
$e = error_reporting(0);
foo($bar);
error_handler();
error_reporting($e);
сложнее дебажить
grep @ по коду и в обработчике ошибок начинаем логировать/выводить все подряд.ошибки надо исправлять, а не прятать
@ != "прятать", @ == "подавлять вывод"@ != «прятать», @ == «подавлять вывод»По дефолту (если нет своего хендлера) именно прятать. Поскольку подавленный вывод даже в логе (error_log) не осядет.
делается простой grep @ по кодуДля этого у меня есть xdebug с опцией scream :)
Стоит уточнить, что обработчик будет срабатывать только при ошибке.Верно. Но даже без ошибок мы получаем накладные расходы, которых можно избежать.
подавленный вывод даже в логе (error_log) не осядет.
Для этого у меня есть xdebug с опцией scream
даже без ошибок мы получаем накладные расходы
Есть вероятность, что файл может быть удален другим скриптом, между проверкой и удалением — получим warning.
С тем что собака не зло — не соглашусь никогда после того как неделю искал ошибку что притаилась за @session_start написанным каким-то умником в огромном проекте.
Огорчило, что такие позорные статьи висят на хабре, на тему «самый извращенный способ заменить display_errors=0 в php.ini»
Если вы установили собственную функцию обработки ошибок с помощью set_error_handler(), то она все равно будет вызвана, однако, если внутри этой функции будет вызвана функция error_reporting(), то она вернет 0, если функция, вызвавшая данную ошибку, была подавлена с помощью @.
Ошибки PHP: классификация, примеры, обработка