Якщо ви хочете отримати доступ до значення файлу cookie відразу після виклику, setcookie()
ви не можете використовувати $_COOKIE
. Причиною цього є природа протоколу (див. Https://tools.ietf.org/html/rfc6265 ). Коли ви використовуєте, setcookie()
це визначає файл cookie, який буде надіслано клієнту разом з рештою заголовків HTTP (див. Http://php.net/manual/en/function.setcookie.php ). Але $_COOKIE
з іншого боку містить змінні, передані поточному сценарію через HTTP-файли cookie від клієнта ( http://php.net/manual/en/reserved.variables.cookies.php ).
Коли ви змінюєтесь $_COOKIE
після дзвінка setcookie()
- як рекомендують деякі відповіді тут - воно більше не містить лише файлів cookie від клієнта. Це може перешкоджати припущенням, зробленим у коді третьої сторони, що використовується у вашому додатку, і може спричинити небажані ефекти сайту. Отже, загалом це не є доброю практикою, і це лише варіант, коли дзвінки setcookie()
є частиною вашого власного коду.
Чистим і прозорим способом отримати набір значень у setcookie()
межах одного запиту є використання headers_list()
(див. Http://php.net/manual/en/function.headers-list.php ) :
function getcookie($name) {
$cookies = [];
$headers = headers_list();
foreach($headers as $header) {
if (strpos($header, 'Set-Cookie: ') === 0) {
$value = str_replace('&', urlencode('&'), substr($header, 12));
parse_str(current(explode(';', $value, 1)), $pair);
$cookies = array_merge_recursive($cookies, $pair);
}
}
return $cookies[$name];
}
setcookie('uname', $uname, time() + 60 * 30);
echo "Cookie value: " . getcookie('uname');
Але зверніть увагу, що це не спрацює в PHP CLI (наприклад, PHPUnit). В такому випадку ви можете використовувати сторонні розширення , як XDebug (див http://xdebug.org/docs/all_functions#xdebug_get_headers ).