LINUX.ORG.RU

[PHP] неинициализированные переменные

 


0

0

Суть проблеммы такая: Отправляю переменные скрипту либо POST, либо GET методом, в скрипте их получаю из массиа $_POST/$_GET. И при использовании каждой переменной приходится проверять установленна она или нет, вот таким образом:

$text = isset($_POST["text"])?$_POST["text"]:"";

и мне кажется это весьма не удобным... может кто использует какие-либо обработчики? или как-то иным образом это все дело автоматизирует, подскажите куда копать =))

PS

если делать так: $text = $_POST["text"] или так $text = @$_POST["text"]

это не вариант


Чем вариант с собакой не нравится?

...

Кстати, обрати внимание на тонкость в различии empty() и isset().

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

Тогда объясни чем собака отличается от первой строчки, кроме удобства записи? (Естественно, с учётом замены пустой строки на NULL)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Тем что собака скрывает любую произошедшую ошибку, а if (isset($var)) {} проверяет и предотвращает ее.

anonymous
()

> как-то иным образом это все дело автоматизирует

Чисто ради лулзов накатал вариант автоматизации.

$list = array(
	array('text', 'default text'),
	array('number', 0)
);

foreach ($list as $member) {
	list($name, $default) = $member;

	if (isset($_POST[$name])) {
		$value = $_POST[$name];
	} else {
		$value = $default;
	}

	$$name = $value;
}

anonymous
()
Ответ на: комментарий от anonymous

>Тем что собака скрывает любую произошедшую ошибку

Какая ошибка может возникнуть при чтении переменной кроме чтения неинициализированной переменной?

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Вопрос не в том какая ошибка может произойти. Вы видимо просто не понимаете указанное выше различие.

anonymous
()
Ответ на: комментарий от KRoN73

> Какая ошибка может возникнуть при чтении переменной кроме чтения неинициализированной переменной?

Привычки нехорошие вырабатываются, быдлокодерские. Ъ- скрипт должен быть отлажен так:

1) error_reporting = E_ALL
2) display_errors = On
3) никакого "засобачивания"

А уж во время эксплуатации вывод ошибок в браузер можно и отключить (чтоб только в логи)

r_asian ★☆☆
()
Ответ на: комментарий от anonymous

Нет. Демагогию на пустом месте я не понимаю.

Ещё раз спрашиваю, в чём принципиальная разница собаки и первой строчки кода с указанной выше поправкой?

Функционал тот же, логика та же, вариант с собакой - быстрее.

...

Впрочем, ответа по существу уже не жду, всё про вас понял, вопросы - риторические :)

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

> За @ надо яйца сразу отрывать, чтобы не плодились.

Плюс один.

man empty()

man isset()

anonymous
()
Ответ на: комментарий от anonymous

Да нет, я-то понимаю, зато налицо непонимание с вашей стороны.

Ибо пока на мои аргументы, с вашей стороны - одни эмоции :D

KRoN73 ★★★★★
()

от "двойного" обращения $x = isset($arr['key']) ? $arr['key'] : null; избавиться очень непросто. Есть тонкости актуальные в каждом отдельном случае. Например если массив не проинициализирован, т.е. "пустой" либо null обращение к несуществующему ключу не будет вызывать ошибку!

Для $_POST как правило обращение к несуществующему ключу вызовет сообщение об ошибке.

Возможен вариант использования try...catch и в ловушке проверять тип ошибки, но для использования данного варианта нужно переопределять штатный обработчик, на свой в котором по любому вэрнингу будет срабатывать исключение, в противном случае try..catch не будет ловить "вэрнинги"|"нотисы"

В данном случае можно воспользоваться функцией extract

//перед extract предварительно объявить интересуемые переменные //соответсвующие имени ключа в $_POST

//$post_myvar1 = null; //$post_myvar2 = 'default'; //$pos_myvar3 = '';

extract($_POST);

Задача обработки POST не тривиальна. Рекомендуется сделать специальный класс, занимающийся проверкой и агрегацией данных от POST и дополнительно класс postvar

примерно так interface iPostVar { public function __construct($name, $value = null, $alias = null); public function isComplete(); public function isEmpty(); public function isNull(); public function getValue(); public function getAlias(); public function getName(); public function getSize(); public function getLen(); }

interface iPostReceiver { public function __construct($data, $conf = array()); public function isComplete(); public function isAliasExists($name); public function getVar($name); }

anonymous
()
Ответ на: комментарий от anonymous

+1

должна быть отдельная функция-валидатор которая всё-всё-всё проверить во входных данных.

anonymous
()
Ответ на: комментарий от KRoN73

> Функционал тот же, логика та же, вариант с собакой - быстрее.

без собак софт нужно разрабатывать и тестить. потом, когда он уходит в продакшн, и только тогда можно ставить собак.
а вообще, имхо, good style programming - это $a = isset($b) ? $b : $c;

isden ★★★★★
()
Ответ на: комментарий от anonymous

>В данном случае можно воспользоваться функцией extract

>//перед extract предварительно объявить интересуемые переменные

>//соответсвующие имени ключа в $_POST

>//$post_myvar1 = null;

>//$post_myvar2 = 'default';

>//$pos_myvar3 = '';

extract($_POST);

Спасиб!, это наверно будет удобно =)

Только вот по поводу класса не совсем понял, может есть ссылка где более подробно объяснено ?

gudik
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.