0

特定のタスクを簡単にすることになっている小さな抽象クラスを構築しています。

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

私はすべてのスーパーグローバルのための機能がある方法でそれをやっています。私は例としてgetを使用しています:

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

fetchdataは、取得した文字列をスーパーグローバルとして盲目的に使用し、他のパラメータでそれを指すことになっています。次に、それがそこに存在するかどうかを確認し、関数を取得するために値またはfalseのいずれかを返します。これにより、呼び出し元に値/falseが返されます。

唯一の問題は、文字列が何であるかわからないときに、文字列をスーパーグローバルとして機能させることです。以前、パラメータをチェックするスイッチを使用してこれを行いました。「get」の場合は、$_GETを別の変数の値に設定しました。ただし、そのようにはしたくありません。fetchdataに触れることなく、簡単に関数を追加できるようにしたいと思います。

$ method = eval($ method)を試しましたが、機能しませんでした。($ method = "$ _GET")、何か提案はありますか?

編集:私がそれを十分に明確にしなかった場合は申し訳ありません。文字列値が「$_GET」の変数Xがありますが、Xが文字列に記述されているソースから値を取得するようにするにはどうすればよいですか?

だから単にそれは

Xの値が"$_GET"の場合、$ X = $ _GET

Xの値が「$_POST」の場合、$ X = $ _POST

Xの値はわかりませんが、スーパーグローバルからその値と同じ名前のデータを取得する必要があります。

4

5 に答える 5

2

マニュアルのこのページによると:

注:変数変数

スーパーグローバルは、関数またはクラスメソッド内の変数変数として使用できません。

これは、関数またはメソッド内でこれを行うことができないことを意味します(他の変数で行うことができます):

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

文字列をに渡す代わりに、自分自身fetchdata()を渡すことができませんでした$_GETか?PHPは、変数を変更しない限り(「コピーオンライト」)、変数をコピーしないと思います。したがって、これによってメモリが不必要に使用されることはありません。

それ以外の場合、スーパーグローバルは9つしかないため、提案したようなスイッチケースは不合理ではありません。

eval()本当に必要な場合は、次のようにこれを行うことができます。

eval('return $_GET;');

しかし、それは不要であり、悪い考えだと思います。それは遅いので、信頼できない文字列をその近くに置くことに非常に注意する必要があります。

于 2009-04-14T14:39:06.257 に答える
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を使用しました。

パラメータの順序:可能な場合は常に必須のパラメータをオプションの前に置き、データオブジェクトを操作/主観的なパラメータの前に置きます。そのため、キーはsuperglobalValueの最初のパラメーターであり、getArrayValueの2番目のパラメーターです。

于 2009-04-14T17:00:54.543 に答える
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};
于 2009-04-14T14:21:02.383 に答える
0

$_GET["var"]または$_POST["var"]の代わりに$_REQUEST["var"]を使用できます。

より複雑な方法は、変数がGET配列に存在するかどうかをテストし、存在しない場合はPOSTをテストすることです。GETを実行する場合。

$ var = null;
if(isset($ _ GET ["varname"]))
{{
  $ var = $ _GET ["varname"];
}
そうしないと
{{
  $ var = $ _POST ["varname"];
}
于 2009-04-14T14:07:41.340 に答える
-2

変数にグローバルにアクセスできるようにする場合は、変数を$GLOBALS配列に追加できます。

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

これで、どこでもフェッチできます$GLOBALS['test']

于 2009-04-14T14:11:54.683 に答える