PHP и с чем его едят....

[fly]

Sweet orange
Подскажите пожалуйста. Есть вопрос. Допустим есть авторизация, где при успешном исходе, я присваиваю юзеру сессию ['user']. Так вот сам вопрос. Есть ли смысл для проверки писать следующее:
PHP:
if (isset($_SESSION['user']) and $_SESSION['user']=="yes")
или достаточно будет написать простой проверки
PHP:
if ($_SESSION['user']=="yes")
Интересуют все аспекты этого момента. Как со стороны оптимизации, логики ну и всего остального.
 

ostapoff

Member
Имеет смысл писать всегда первый вариант. Если переменная сессии не будет установлена, то будет выдан notice. Можно конечно написать

PHP:
if (@$_SESSION['user']=="yes")
чтобы подавить notice, но в этом случае PHP создаст дополнительный код для его перехвата. На производительности это практически скажется, если конечно, эта проверка не в цикле с десятком миллионов иттераций :)
 

[fly]

Sweet orange
Ясно. Просто у меня без собачки не выдавало никаких нотисов. Но спасибо за ответ :)
 

ostapoff

Member
Все зависит от конфигурации в php.ini или принудительной конфигурации используемого Вами фреймворка.
По-умолчанию в php.ini error_reporting устанавливается в E_ALL & ~E_NOTICE
по этому Вы их и не видите.

Рекомендуемый уровень ошибок для разработки в 5.3: E_ALL | E_STRICT
Для продакншн сервера: E_ALL & ~E_DEPRECATED
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
E_NOTICE предупреждает девелопера о потенциальных ошибках, грязном коде, опечатках, плохом стиле и неинициализированных переменных в частности. must have для разработчика.

На счет trim – Вы пытаетесь языку навязать сильную типизацию. Это просто не PHP-way.
Первый вариант более параноидальный, второй, как я считаю, более правильный.
Ну да ладно, не php-way, значит не php-way.
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
req
PHP:
<?php
error_reporting(E_ALL);
function _trim($str)
{
	if(!isset($str))
	{
		trigger_error("first param must not be null or empty string", E_USER_NOTICE);
		//return null по желанию
	}
	else
		return trim($str,$arr);
}
function _trim2($str)
{
	if(!isset($str))
		return null;
	else
		return trim($str);
	
}
echo '<pre>';
echo 'trim';
$str=trim(null);
var_dump($str);
echo '_trim';
$str2=_trim(null);
var_dump($str2);
echo '_trim2';
$str3=_trim2(null);
var_dump($str3);
echo '</pre>';

?>
ans
Код:
trimstring(0) ""
_trim

Notice:  first param must not be null or empty string in C:\AppServ\www\index4.php on line 7

NULL
_trim2NULL
Но выполняется же :)

P. S.
php 5.2.6
 

ostapoff

Member
А в этом случае для пустой строки notice не будет никогда выведен :)

Все-таки, Вы слишком все усложняете. В PHP есть десяток других типов и для каждого из них в таком случае тоже нужно запрещать trim? trim(array()) или trim(0) или trim(false), ну и необязательно со значениями, приводящимися к пустой строке.
 

PainKiller

Пастафарианец
Команда форуму
Супер Модератор
Предыдущий пример был запилен исключительно для того, чтобы показать, что работает !isset($str).
Если бы я и тут написал
$str == '' || !isset($str)
То опять прочитал бы то, что !isset не выполнится, а я, вроде бы, доказал состоятельность своего примера, или нет? :)
 
Зверху