2009-04-14 5 views
0

特定のタスクをより簡単にするための小さな抽象クラスを構築しています。PHPを文字列として使う方法

たとえば、 $ var = class :: get( 'id'); は、$ _GETにポインタIDがあるかどうかをチェックし、パラメータに従って文字列または配列を返します。これは、投稿やリクエスト、さらにmabyでも有効です。

私はすべての超大域のために機能があるようにしています。私は例としてgetを使用しています:

get関数はパラメータとしてポインタを取得し、fetchdata関数を呼び出し、ポインタと "$ _GET"をパラメータとして使用します。

fetchdataは、それがスーパーグローバルとして得られた文字列を盲目的に使用し、他のパラメータでそれを指すことになっています。次に、それが存在するかどうかをチェックし、値を返すか、または関数を取得するために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自体を渡しませんか?私は、あなたがそれを変更しない限り( '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

編集
は、私はちょうど気づきましたよウル編集、あなたが試みることができる:

$X = {$X}; 
2

evalは使用しないでください。ちょうど参照を使用します。

//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を使用しました。

Param order:私はできる限りオプションの前に常に必要なパラメータを入れ、操作/主観的なパラメータの前にはデータオブジェクトを置きます。これは、keyがsuperglobalValueの最初のparamとgetArrayValueの2番目のparamである理由です。

関連する問題