2016-06-18 15 views
0

Ich habe eine Klasse, die sich um alle benutzerbezogenen Daten kümmert. In einem meiner Methoden i $_SESSION/$_GET, $_POST jede $_...

über eine dynamische var wie folgt zusammen (in _unset Verfahren) zugreifen möchten:

class Userdata 
{ 
    ... 
    const knownSources = ['post', 'get', 'cookie', 'session', 'files']; 
    private $post = []; 
    private $get = []; 
    private $cookie = []; 
    private $session = []; 
    private $files = []; 

    ... 
    private function __construct() 
    { 
     $this->post = $this->secureVars($_POST); 
     $this->get = $this->secureVars($_GET); 
     $this->cookie = $this->secureVars($_COOKIE); 
     ... 
    } 
    public static function getInstance(){...} 
    public static function secureVars($inputVar, $asObject = true, $acceptHTML = false){...} 

    public static function _unset($dataSource, $key) 
    { 
     $self = self::getInstance(); 

     if (in_array(strtolower($dataSource), self::knownSources)) 
     { 
      // Here I want to unset the variable in $_SESSION[$key] for instance, but 'SESSION' can be whichever of knownSources array. 
      print_r([ 
       ${'_SESSION'}, 
       ${'_' . 'SESSION'}, 
       ${'_' . strtoupper($dataSource)} 
      ]); 
      ... 
     } 
    } 
} 

Jede Idee, warum ${'_SESSION'} funktioniert, aber nicht ${'_' . 'SESSION'}? Und wie soll ich mein Ziel erreichen: ${'_' . strtoupper($dataSource)}?

Danke für Ihre Hilfe!

[EDIT] NACH VORSCHLÄGE, kam ich dies:

switch($dataSource) 
{ 
    case 'session': 
     $target = $_SESSION; 
     break; 
    case 'post': 
     $target = $_POST; 
     break; 
    case 'get': 
     $target = $_GET; 
     break; 
    case 'cookie': 
     $target = $_COOKIE; 
     break; 
    case 'files': 
     $target = $_FILES; 
     break; 
} 
unset($self->$dataSource->$key); 
unset($target[$key]); 

[EDIT] NACH es zu merken NOCH NICHT ARBEITEN, ich - leider - entscheiden Sie sich für:

switch($dataSource) 
    { 
     case 'session': 
      unset($_SESSION[$key]); 
      break; 
     case 'post': 
      unset($_POST[$key]); 
      break; 
     case 'get': 
      unset($_GET[$key]); 
      break; 
     case 'cookie': 
      unset($_COOKIE[$key]); 
      break; 
     case 'files': 
      unset($_FILES[$key]); 
      break; 
    } 
    unset($self->$dataSource->$key); 

Jeder intelligentere Vorschlag sehr geschätzt :)

+1

3. Anmerkung: http://php.net/manual/en/language.variables.superglobals.php – Rizier123

+0

Hmm, also gibt es eine Möglichkeit, die ich umgehen kann? – antoni

+1

Machen Sie eine if- oder switch-Anweisung, um zu entscheiden, welches superglobal Sie benötigen. – Rizier123

Antwort

0

Versuchen Sie dies:

//Url 
//?dangerous=yes&safe=keep 

class MyClass { 

    public static function _unset($datasource, $key) { 
     global $$datasource; 
     unset(${$datasource}[$key]); 
    } 

} 

MyClass::_unset('_GET', 'dangerous'); 

//Test 
print_r($_GET); 

Sie vermissen das Schlüsselwort global.

+0

Korrigieren Sie das globale Schlüsselwort! Vielen Dank! Also habe ich meinen Variablennamen '$ dataSource = '_'. Strtoupper ($ dataSource);' transformiert und dann 'global $$ dataSource;' und 'unset ($ {$ dataSource} [$ key]);' – antoni