2009-04-14 9 views
0

Ich baue eine kleine abstrakte Klasse, die bestimmte Aufgaben erleichtern soll. Beispiel: $ var = class :: get ('id'); würde überprüfen, ob es eine Zeiger-ID in $ _GET gibt, die eine Zeichenfolge oder ein Array nach Parametern zurückgibt. Dies sollte auch für Post und Anfrage und maby mehr funktionieren.PHP wie man string als superglobal verwendet

Ich mache es in der Art, wie es Funktion für alle Superglobals gibt. Ich benutze als Beispiel:

get Funktion ruft einen Zeiger als Parameter, es ruft fetchdata Funktion und verwendet den Zeiger und "$ _GET" als Parameter.

fetchdata soll einfach blind den String verwenden, den es als superglobal bekommen hat und mit dem anderen Parameter darauf zeigen. Überprüfen Sie dann, ob es dort existiert und geben Sie entweder den Wert oder false zurück, um die Funktion zu erhalten, die den Wert/false an den Aufrufer zurückgibt.

Das einzige Problem ist, die Zeichenfolge Arbeit als Superglobal zu bekommen, wenn Sie nicht wissen, was es ist. Ich tat dies vorher mit einem Schalter, der den Parameter prüfte und falls es "get" wurde, setzte er $ _GET auf den Wert einer anderen Variable. Aber ich möchte es nicht so machen, ich möchte, dass es einfach ist, mehr Funktionen hinzuzufügen, ohne die fetchdata zu berühren.

Ich versuchte $ method = eval ($ Methode), aber es hat nicht funktioniert. ($ method = "$ _GET"), irgendwelche Vorschläge?

EDIT: Tut mir leid, wenn ich es nicht klar genug gesagt habe. Ich habe eine Variable X mit dem String-Wert "$ _GET", wie kann ich es so machen, dass X Werte von der Quelle erhält, die in der Zeichenkette beschrieben wird?

So einfach ist es

$ X = $ _GET, wenn X-Wert "$ _GET" hat

$ X = $ _POST, wenn X-Wert "$ _POST" hat

ich einfach nicht wissen, welchen Wert X hat, aber es muss Daten von superglobal mit dem gleichen Namen als sein Wert erhalten.

Antwort

2

Nach this page in the manual:

Hinweis: Variable Variablen

Superglobals kann als variable Variablen innerhalb von Funktionen oder Klassenmethoden nicht verwendet werden.

Das heißt, Sie kann dies innerhalb einer Funktion oder Methode nicht tun (die Sie mit anderen Variablen zu tun wäre in der Lage):

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

Statt einen String fetchdata() zugeben, könnte Sie nicht $_GET selbst übergeben? Ich denke, dass PHP eine Variable nicht kopieren wird, es sei denn, Sie modifizieren es ("copy on write"), also sollte dies nicht unnötig Speicher verbrauchen.

Ansonsten gibt es nur neun Superglobals, so ein Schalter-Fall, wie Sie vorgeschlagen haben, ist nicht unvernünftig.

Sie können dies tun, mit eval() wenn Sie wirklich haben, so etwas wie:

eval('return $_GET;'); 

denke ich, dass wäre unnötig und eine schlechte Idee, obwohl; es ist langsam und du musst extrem vorsichtig sein, wenn du nicht vertrauenswürdige Saiten irgendwo in der Nähe liegst.

0

Sie können $ _REQUEST ["var"] anstelle von $ _GET ["var"] oder $ _POST ["var"] verwenden.

Ein komplizierterer Weg wäre zu testen, ob die Variable im Array GET existiert, wenn sie nicht ihren POST hat. Wenn es sein GET.

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

Wenn Sie eine Variable wollen global zugänglich sein, können Sie fügen Sie es er $GLOBALS Array tot.

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

Jetzt können Sie $GLOBALS['test'] überall holen.

1

Ich bin nicht ganz sicher, was Sie erreichen wollen, aber man konnte einen Blick auf die __callStatic magische Methode haben

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"); 
    } 
} 
} 

Sie könnten dann tun:

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 Handbuch auf magische Methoden: http://ca.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods

bearbeiten
ich yo gerade bemerkt ur bearbeiten, könnten Sie versuchen:

$X = {$X}; 
2

Verwenden Sie nicht Eval. Verwenden Sie einfach Referenz.

//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 und $ _REQUEST haben standardmäßig keine Nullwerte, nur String oder Array. Also habe ich dort anstelle von array_key_exists isset verwendet.

Param Auftrag: Ich habe erforderlich params immer vor optional, wenn ich kann, und die Datenobjekte vor der Manipulation/subjektives params. Deshalb ist der Schlüssel der erste Parameter für superglobalValue und der zweite Parameter für getArrayValue.

Verwandte Themen