Есть ли удобная замена конструкции... if(@$v) $v=...

berkut

Новичок
вау. но emty() ведь тоже не выдаёт нотисов на неопределённые переменные - значит empty() тоже костыль? опять одна абстракция: собака - зло палюбому и точка, а пачаму - незнаю
 

Ноябрь

Новичок
Фaнат
Проблема в том, что в php невозможно определить все переменные вначале, как в том примере, что я привел на 3-ей странице. А стоит ли жертвовать читабельностью кода, ради "естественного" подавления предупреждений о несуществующей переменной? И что, это сильно поможет при отладке программы?
 

AmdY

Пью пиво
Команда форума
Убойный хумор от ленивых любителей извращений.
Использование @ показывает на ленность программиста, который не хочет обрабатывать различные ситуации. Соответственно к такому коду стаит относиться насторожено, так как неизвстно, где ещё чуваку было лень программировать, где было лень вникать в тонкости поведения функции.
 

Ноябрь

Новичок
Я немного поразмыслил и написал функцию, которая поможет мне, когда я буду перебирать массив. Перебирая по ключам $k, я увижу лишь значение по умолчанию ($b), а не предупреждение. Но, только если! массив я определил заранее, что не противоречит всему тому, что говорилось ранее.
PHP:
function ifStrArrSet($arr, $k, $b){
	settype($strv,'string');
	if (isset($arr[$k]))
		$strv = strval($arr[$k]);
	else
		$strv = strval($b);
	return $strv;
}
Аналогично для переменной, только теперь проверка на пустоту (как раз касается получения данных из форм) опять же типизируемая, значит, будет хорошо видно (в коде) какие данные я обрабатываю, и удобно обработать исключения типа 0 и ""
PHP:
function ifIntEmp($v, $b){
	settype($intv,'int');
	if (@$v)
		$intv = intval($v);
	else
		$intv= intval($b);
	return $intv;
}
с переменными вопрос стоит не так остро, т.к их можно определить вначале.
пс
ну.. про удобство я надеюсь..
 

tf

крылья рулят
function ifIntEmp($v, $b){
settype($intv,'int');
if (@$v)
$intv = intval($v);
else
$intv= intval($b);
return $intv;
}
AmdY, ты прав, переменная у него уже объявлена, а он всеравно считает что возможно она у него не объявлена - вот пример когда человек просто не понимает что он делает
@ - признак того что программист просто не знает что он делает
 

AmdY

Пью пиво
Команда форума
Ноябрь, я конечно извиняюсь, но
__|____|____|____|____|__
_|____|____|____|____|____|
___|____|____|____|____|__
_|____|____|____|____|____|
___|____|____|____|____|__
_|____|____|____|____|____|
___|____|биться|____|____|
_|____| головой |____|____|
___|____|сюда|____|____|__
_|____|____|____|____|____|
___|____|____|____|____|__
_|____|____|____|____|____|
___|____|____|____|____|__
 

tf

крылья рулят
cDLEON, увидеш код состоящий из одних @:
к 100 строкам 99 @ - сам будеш пугатся
 

Ноябрь

Новичок
мдя..
чем тут картинки рисовать, могли бы запустить (с несуществующей переменной), и получить предупреждение..
@$v == !empty($v) == проверка на пустоту,
и функция называется ifIntEmp..

ребятки;)

пс
я понимаю, что if(!empty($v)) == if(@$v) == if($v) (без нотиса, т.к $v преобразуется в тип бул и равен тру, если в нем хоть что-то лежит).
Но какая
разница!!

-~{}~ 28.11.07 07:45:

сам будеш пугатся
прям триллер какой-то..
 

phpdev2007

Новичок
надо писать без ошибок, затыкания собакой не единственный метод можно заткнуть и ошибки через php.ini, но это не как не будет улучшать вашу программу.
 

berkut

Новичок
AmdY, phpdev2007 вот адекватные-ли Вы люди? проверка, была-ли отправлена форма - if (@$_POST['my_form']) - это затыкание ошибок, которых быть не должно? чем empty() не затычка? как на рынке блин.. был конкретный вопрос - чем хуже if (@$_POST) vs. if (!empty($_POST)) - кто нибудь аргументированно высказаться может, а не рассказывать про свои кашмары из
увидеш код состоящий из одних @:
к 100 строкам 99 @ - сам будеш пугатся
 

С.

Продвинутый новичок
Я рад, что PHP пока что не идет по пути "нормальных" языков и буду огорчен, если так случится. Языки тоже должны развиваться. По большому счету это язык, как инструмент, должен обслуживать полет моей творческой фантазии, понимать меня с полуслова. А не я должен удовлетворять его формальные прихоти. Почему я должен загружать программу кодом, напрямую не имеющим отношения к алгоритму? Даже священная корова MVC только для этого и придумана была, чтобы рафинировать бизнесс-алгоритм, сделать его как можно более читабельным и "сопровождабельным". Давайте будем последовательны и писать программы без ненужных системных "завитушек".

Просто нужно взять за парадигму, что отсутсвие переменной равносильно ее наличию с пустым значением. Благо PHP предоставляет такую возможность. Тем более, что в бизнес логике веб приложения никогда не нужно различать факт отсутствия переменной от ее наличия с пустым значением. (Спокойно! Я говорю про бизнес-логику. Системные блоки приложения пишутся в другом стиле.) А если кто и различает такие сущности в бизнес логике, то это результат неправильного планирования.

Да, я тоже иногда допускаю опечатки в именах переменных. Но за многолетний стаж это не приносило мне никаких неудобств. Ошибка выявляется при первом же отладочном прогоне, а поскольку программа "прозрачна" и незагружена лишними деталями, то локализуется элементарно. Я предпочитаю иметь "прозрачный" код, который будет эксплутироваться, сопровождаться и модифицироваться в течение как минимум нескольких лет, вместо того чтобы отяготить его на 20-30% лишним текстом только лишь для сиюминутного удобства кодера.
 

Духовность™

Продвинутый новичок
Просто нужно взять за парадигму, что отсутсвие переменной равносильно ее наличию с пустым значением
представляю, что тогда потребуется, что бы поддерживать проекты таких разработчиков...
 

Stepank

Новичок
Можно сделать так:

function n(&$var, $val) {
if (isset($var)) {
return $var;
} else {
return $val;
}
}

function v(&$var) {
return n($var, null);
}

Функция n, это что-то типа nvl из sql.
Ругаться не будет, т.к. переменная передается по ссылке.

Соответственно вместо:

if (isset($a) && $a) {
...
}

Можно писать:

if (v($a)) {
...
}

Если нужно взять значение по умолчанию, то можно так:

$a = n($a, 'hello');

или так:

$a = v($a);

Но есть случаи, когда это не работает. Вот пример:

error_reporting(E_ALL);

$a = new ArrayObject();
$a['q'] = 1;
var_dump(isset($a['q'])); // Все ништяк
var_dump(v($a['q'])); // Все ништяк
var_dump(isset($a['a'])); // Все ништяк
var_dump(v($a['a'])); // Косяг

И для работы с ArrayObject приходится использовать isset().
Причины кроются в реализации ArrayObject.
 

HraKK

Мудак
Команда форума
Stepank
И что ты смотришь на сучок в глазе брата твоего, а бревна в твоем глазе не чувствуешь?
Иль, как скажешь брату твоему: "дай я выну сучок из глаза твоего"; а вот, в твоем глазе бревно?
Лицемер! Вынь прежде бревно из глаза твоего и тогда увидешь как вынуть сучок из глаза брата твоего.
Новый завет от Матфея. Глава 7, строфа 3,4,5
 

С.

Продвинутый новичок
if ($a == 'bla')
при несуществующей $a - это нифига не прозрачно
Что тут странного? Четкий и понятный код. При несуществуюшей $a, подразумевается что $a==''. PHP такие ситуации обрабатывает в штатном режиме. В нормальной бизнес логике пришло значение пустое или совсем не пришло суть есть одно и то же. Поэтому дифференциация этих ситаций должна быть целенаправленно удалена из кода.
 

Stepank

Новичок
HraKK
Отлично, можно теперь подробнее специально для тех, у кого бревно в глазу? :)
 

serglt

Анус, ой, Ахтунг
Stepank
все твои функци не более чем поделки.
1. Пишите код без глобальных переменных вообще, а если они и есть их надо объявлять до использования

$pageType = isset ($_GET ['page']) ? $_GET ['page'] : 'list';
неужели так лень? Много букв? другой подход
function val ($arr, $key, $default = '') {
return isset ($arr [$key]) ? $arr [$key] : $default;
}
теперь имеем
$pageType = val ($_GET, 'page', 'list')
если кому то опять много букв никто не мешает добавить функцию
function _GET ($key, $default = '') {
return val ($_GET, $key, $default);
}
$page = _GET ('page', 'list')
И тоже самое к посту
Использование животных показывает лично мне что код писал быдло - кодер вот и все :) А быть им или не быть сугубо личное решение.
 

HraKK

Мудак
Команда форума
Stepank
то что у тебя пробемы в программированияии эргономике намного больше чем у топик стартера, но ты лезешь учить его.
 
Сверху