2009-04-14 4 views
0

특정 작업을 더 쉽게하기위한 작은 추상 클래스를 만들고 있습니다.PHP 문자열을 슈퍼 전역으로 사용하는 방법

예 : $ var = class :: get ('id'); $ _GET에 포인터 ID가 있는지 검사하여 매개 변수에 따라 문자열 또는 배열을 반환합니다. 이것은 게시물과 요청 및 마비에 대해서도 더 효과적입니다.

모든 슈퍼 글로블에 대한 기능이있는 방식으로하고 있습니다. 예를 들어 get을 사용하고 있습니다 :

get 함수는 포인터를 매개 변수로 가져오고 fetchdata 함수를 호출하고 포인터와 "$ _GET"을 매개 변수로 사용합니다.

fetchdata는 맹목적으로 맹목적으로 superglobal로 얻은 문자열을 사용하고 다른 매개 변수로 가리 키도록되어 있습니다. 그런 다음 거기에 존재하는지 확인하고 값을 반환하거나 함수를 가져 오기 위해 false를 반환하면 호출자에게 값/false가 반환됩니다.

문제는 무엇인지 모를 때 수퍼 글로발로 문자열 작업을 가져 오는 것입니다. param을 확인한 스위치를 사용하기 전에이 작업을 수행했으며 "get"인 경우 $ _GET을 다른 변수의 값으로 설정했습니다. 그러나 나는 그런 식으로하고 싶지 않다. 나는 fetchdata를 만질 필요없이 더 많은 기능을 추가하는 것이 쉽기를 바란다.

$ method = eval ($ method)을 시도했지만 작동하지 않았습니다. ($ method = "$ _GET"), 어떤 제안?

편집 : 미안하지만 충분히 명확하게하지 않았다. 문자열 값 "$ _GET"이있는 변수 X가 있는데, 어떻게하면 X가 문자열에서 설명하는 소스의 값을 가져올 수 있습니까? X 값이있는 경우

그래서 간단하게는 "$ _GET"

$ X = $ _POST X 값이있는 경우 "$ _POST"

난 그냥하지

$ X = $ _GET입니다 X 값이 무엇인지 알지만, 값과 이름이 같은 수퍼 글로벌에서 데이터를 가져와야합니다.

답변

2

this page in the manual에 따르면

참고 : 변수 변수

슈퍼 전역이 변수는 가변 변수로 사용 할 수 없습니다. 수, fetchdata() 문자열을 전달하는 대신

$var = '_GET'; 
${$var}[$key] 

:

이 당신이 이 (다른 변수와 함께 할 수있을 것입니다) 함수 또는 메소드 내에서이 작업을 수행 할 수 있음을 의미 $_GET 그 자체를 전달하지 않으십니까? 필자는 PHP가 변수를 복사하지 않으면 ('copy on write') 변수가 불필요하게 사용되어서는 안된다고 생각합니다.

그렇지 않으면 9 개의 슈퍼 글로블 만 있으므로, 제안한 것처럼 스위치 케이스가 불합리하지 않습니다. 당신이 정말로 있었다면

당신은 eval()이 할 수있는에, 뭔가 같은 : 나는 비록 불필요하고 나쁜 아이디어라고 생각

eval('return $_GET;'); 

; 속도가 느리고 신뢰할 수없는 문자열을 근처에 두는 것에 매우주의해야합니다.

0

$ _GET [ "var"] 또는 $ _POST [ "var"] 대신 $ _REQUEST [ "var"]를 사용할 수 있습니다.

더 복잡한 방법은 GET 배열에 변수가 있는지 테스트하는 것입니다 (POST가 아니라면). 그것이 GET 일 경우.

 
$var = null; 
if (isset($_GET["varname"])) 
{ 
    $var = $_GET["varname"]; 
} 
else 
{ 
    $var = $_POST["varname"]; 
} 
-2

당신이 변수가 전 세계적으로 액세스 할 수 있도록하려는 경우, 당신이 그에게 $GLOBALS 배열을 TOT 추가 할 수 있습니다.

$GLOBALS['test']='test'; 

이제 $GLOBALS['test']을 가져올 수 있습니다.

1

당신이 달성하려고하는지 아주 잘 모르겠지만, 당신이 __callStatic 마법 방법을 살펴 가질 수

class example{ 
protected static $supers = array('GET', 'POST', 'SERVER', 'COOKIE'); 
public static function __callStatic($functionName, $arguments){ 
    $index = arguments[0]; 
    $desiredSuper = strtoupper($functionName); 
    if(in_array($desiredSuper, self::$supers)){ 
    doStuff ($_{$desiredSuper}[$index]); 
    } 
    else{ 
    throw new Exception("$desiredSupper is not an allowed superGlobal"); 
    } 
} 
} 

당신은 할 수 :

example::get('id'); //wo do stuff to $_GET['id'] 
example::server('REQUEST_METHOD'); //Will do stuff to $_SERVER['REQUEST_METHOD'] 
example::foo('bar'); //throws Exception: 'FOO is not an allowed superGlobal' 

PHP 매뉴얼을 마법 방법에 : http://ca.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods

편집
난 그냥 눈치 요 UR 편집, 당신은 시도 할 수 :

$X = {$X}; 
2

평가 절대로 사용하지 마십시오. 그냥 참조를 사용하십시오.

//test value for cli 
$_GET['test'] = 'test'; 

/** 
* @link http://php.net/manual/en/filter.constants.php reuse the filter constants 
*/ 
function superglobalValue($key, $input = null) { 
    if ($input === INPUT_POST) 
     $X = &$_POST; 
    else 
     $X = &$_GET; 
    return (isset($X[$key]) ? $X[$key] : false);  
} 

function getArrayValue(&$array, $key) { 
    return (array_key_exists($key, $array) ? $array[$key] : false); 
} 

//test dump 
var_dump(
    superglobalValue('test', INPUT_GET), 
    superglobalValue('test', INPUT_POST), 
    getArrayValue($_GET, 'test'), 
    getArrayValue($_POST, 'test') 
); 

$ _GET, $ _POST 및 $ _REQUEST에는 기본적으로 null 값이 없으며 문자열 또는 배열 만 있습니다. 그래서 나는 array_key_exists 대신에 isset을 사용했다.

매개 변수 순서 : 할 수있을 때 항상 옵션 매개 변수를 넣고 조작/주관적 매개 변수 앞에 데이터 개체를 넣습니다. Key가 superglobalValue의 첫 번째 매개 변수이고 getArrayValue의 두 번째 매개 변수 인 이유입니다.

관련 문제