Là một nhà phát triển web, tôi luôn sử dụng phương pháp này để một cái gì đó giống như một mẫu đăng nhập hoặc khác “lưu” hoạt động (bỏ qua sự nguy hiểm của việc truy cập trực tiếp các biến đầu vào):Có cách nào để truy cập tự động siêu siêu dữ liệu không?
if (isset($_POST['action']) && $_POST['action'] == 'login')
{
// we're probably logging in, so let's process that here
}
Để làm điều này ít tẻ nhạt và giữ phù hợp với nguyên tắc DRY (loại), tôi nấu này lên:
function isset_and_is ($superglobal, $key, $value)
{
$ref = '_' . strtoupper($superglobal);
return isset($$ref[$key]) && $$ref[$key] == $value;
}
if (isset_and_is('post', 'action', 'login'))
{
// we're probably logging in, so let's process that here
}
này thất bại thảm hại, mặc dù sử dụng oh-so-thông minh của tôi về tên biến động để truy cập superglobal.
Vì vậy, tôi đang mắc kẹt sử dụng xấu xí này:
function isset_and_is ($superglobal, $key, $value)
{
switch (strtoupper($superglobal))
{
case 'GET': $ref =& $_GET; break;
case 'POST': $ref =& $_POST; break;
case 'REQUEST': $ref =& $_REQUEST; break;
default: die('megafail'); return;
}
return isset($ref[$key]) && $ref[$key] == $value;
}
if (isset_and_is('post', 'action', 'login'))
{
// we're probably logging in, so let's process that here
}
Câu hỏi của tôi: Có cách nào để truy cập tự động các biến superglobal như tôi đang cố gắng làm trong mẫu mã thứ hai của tôi? Nếu không, có cách nào tốt hơn/hiệu quả hơn để hoàn thành những gì tôi đang làm trong mẫu mã thứ ba không?
Giải pháp của tôi: Nhờ Tom Haigh's answer, đây là mã cuối cùng tôi sẽ đi với:
function isset_and_is ($superglobal, $key, $value)
{
$ref =& $GLOBALS['_' . strtoupper($superglobal)];
return isset($ref[$key]) && $ref[$key] == $value;
}
Và điều gì sai với mẫu đầu tiên? – NullUserException
NullUserException: DRY :) –
IMO mẫu đầu tiên rõ ràng hơn, DRYer và dễ dàng cho bất kỳ ai biết PHP hiểu. Trong khi những cái khác ... – NullUserException