Если вы хотите получить доступ к значению 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 ).