Если вы хотите получить доступ к значению cookie сразу после вызова setcookie()
, вы не можете использовать $_COOKIE
. Причина этого заключается в природе протокола (см. https://tools.ietf.org/html/rfc6265). Когда вы используете setcookie()
, он определяет Cookie для отправки вместе с остальными заголовками HTTP клиенту (см. http://php.net/manual/en/function.setcookie.php). Но $_COOKIE
с другой стороны содержит переменные передается в текущий скрипт через HTTP-куки от клиента (http://php.net/manual/en/reserved.variables.cookies.php).
Когда вы изменяете $_COOKIE
после вызова setcookie()
- как рекомендуют некоторые ответы здесь - он больше не содержит только куки-файлы от клиента. Это может помешать предположениям, сделанным в стороннем коде, используемом в вашем приложении, и может привести к нежелательным эффектам сайта. Так что в целом это не очень хорошая практика, и это вариант, когда вызовы setcookie()
являются частью вашего собственного кода.
Чистый и прозрачный способ получить значение, установленное с помощью setcookie()
в рамках одного и того же запроса, - это использовать headers_list()
(см. http://php.net/manual/en/function.headers-list.php):
function getcookie($name) {
$cookies = [];
$headers = headers_list();
// see http://tools.ietf.org/html/rfc6265#section-4.1.1
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).