Многократное повторение реализации очистки переменной сессии


Исходный код

<?
<em>/////////////////////////////// GAME START TASOVKA //////////////////////////////////////////////////</em>if($page == "game_start")
	{
		
		if( isset($_SESSION["game"]) && !empty($_SESSION["game"]) )
			{
				session_unregister("game");
			}
			
		if( isset($_SESSION["total_price"]) && !empty($_SESSION["total_price"]) )
			{
				session_unregister("total_price");
			}
			
		if( isset($_SESSION["game_num"]) && !empty($_SESSION["game_num"]))
			{
				session_unregister("game_num");
			}
			
		if( isset($_SESSION["ticket_num"]) && !empty($_SESSION["ticket_num"]) )
			{
				session_unregister("ticket_num");
			}
			
		if( isset($_SESSION["for_fl"]) && !empty($_SESSION["for_fl"]) )
			{
				session_unregister("for_fl");
			}
		<em>//---------------------------------------------------//</em>if( isset($_SESSION["order_res_query3"]) && !empty($_SESSION["order_res_query3"]) )
			{
				session_unregister("order_res_query3");
			}
			
		if( isset($_SESSION["order_res_query2"]) && !empty($_SESSION["order_res_query2"]) )
			{
				session_unregister("order_res_query2");
			}
			
		if( isset($_SESSION["order_res2"]) && !empty($_SESSION["order_res2"]) )
			{
				session_unregister("order_res2");
			}
			
		if( isset($_SESSION["order_res"]) && !empty($_SESSION["order_res"]) )
			{
				session_unregister("order_res");
			}
			
		if( isset($_SESSION["user_not_reg"]) && !empty($_SESSION["user_not_reg"]) )
			{
				session_unregister("user_not_reg");
			}
			
		if( isset($_SESSION["order_id"]) && !empty($_SESSION["order_id"]) )
			{
				session_unregister("order_id");
			}
			
		if( isset($_SESSION["user_edit_type"]) && !empty($_SESSION["user_edit_type"]) )
			{
				session_unregister("user_edit_type");
			}	
		<em>//---------------------------------------------------//</em>if( isset($_SESSION["order_date"]) && !empty($_SESSION["order_date"]) )
			{
				session_unregister("order_date");
			}
			
		if( isset($_SESSION["drawing_num"]) && !empty($_SESSION["drawing_num"]) )
			{
				session_unregister("drawing_num");
			}
			
	}
<em>/////////////////////////////// GAME START TASOVKA //////////////////////////////////////////////////</em>?><?<em>/////////////////////////////// CHOSE TASOVKA //////////////////////////////////////////////////</em>if($page == "chose")
	{		
		if( isset($_SESSION["order_res_query3"]) && !empty($_SESSION["order_res_query3"]) )
			{
				session_unregister("order_res_query3");
			}
			
		if( isset($_SESSION["order_res_query2"]) && !empty($_SESSION["order_res_query2"]) )
			{
				session_unregister("order_res_query2");
			}
			
		if( isset($_SESSION["order_res2"]) && !empty($_SESSION["order_res2"]) )
			{
				session_unregister("order_res2");
			}
			
		if( isset($_SESSION["order_res"]) && !empty($_SESSION["order_res"]) )
			{
				session_unregister("order_res");

Что не так в исходном коде

Нетрудно видеть, что каждый if выполняет одно и то же действие: проверяет и очищает указанную переменную сессии. Казалось бы, простой алгоритм: проверь значение и удали при наличии — а всё равно это алгоритм, он использует для реализации определённую последовательность операций. Соответственно, реализацию алгоритма необходимо прятать в функцию:

function cleanup_session_var($var_name)
{
	if ( isset($_SESSION[$var_name]) && !empty($_SESSION[$var_name]) ) {
		session_unregister($var_name);
	}
}

constGAME_VARIABLES = [
    'game', 'total_price', 'game_num', 'ticket_num', 'for_fl', 'order_res_query3', 'order_res_query2', 'order_res2', 
    'order_res', 'user_not_reg', 'order_id', 'user_edit_type', 'order_date', 'drawing_num', 
];
constCHOSE_VARIABLES = [
    'order_res_query3', 'order_res_query2', 'order_res2', 'order_res',
];

switch ($page) {
    case"game_start":
        foreach (GAME_VARIABLES as$var_name) {
            cleanup_session_var($var_name);
        }
        break;
    case"chose":
        foreach (CHOSE_VARIABLES as$var_name) {
            cleanup_session_var($var_name);
        }
        break;
}

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

switch ($page) {
    case"game_start": $cleanup_vars = GAME_VARIABLES; break;
    case"chose": $cleanup_vars = CHOSE_VARIABLES; break;
}
foreach ($cleanup_varsas$var_name) {
    cleanup_session_var($var_name);
}

Строго говоря, смысл функции session_unregister заключается в отмене регистрации сессионной переменной как глобальной переменной, а вовсе не в очистке её значения. Возможно, вместо session_unregister следует использовать обычный unset. Также нет особой необходимости проверять наличие значения перед его очисткой, поэтому if здесь может быть избыточным.

Если смотреть на архитектуру проекта шире, то можно легко видеть, что хранение переменных игры в отдельных переменных сессиях иногда доставляет больше хлопот, чем удобств. Стоит рассмотреть вариант совместного хранения переменных игры в одной переменной сессии в виде массива (а лучше — сгруппированными по смыслу):

$_SESSION['game']['game_num']
$_SESSION['game']['ticket_num']
$_SESSION['order']['total_price']
$_SESSION['order']['order_res_query2']
$_SESSION['order']['order_res_query3']
$_SESSION['order']['order_res']
$_SESSION['order']['order_res2']