Superglobal olarak dize kullanmak için PHP nasıl

5 Cevap php

Ben bazı görevleri kolaylaştırmak gerekiyor küçük bir soyut bir sınıf inşa ediyorum.

For example: $var = class::get('id'); would run check if there's pointer id in the $_GET, returning a string or array according to parameters. This should also work for post and request and maby more.

Ben tüm superglobals için işlevi var şekilde yapıyorum. Ben örnek olarak get kullanarak ediyorum:

fonksiyonu parametre olarak bir gösterici alır olsun, fetchdata işlevini çağırır ve parametre olarak pointer ve "$ _GET" kullanır.

fetchdata sadece körü körüne bu diğer param ile ona gibi superglobal ve nokta var dize kullanmak gerekiyordu. Sonra orada olup olmadığını denetlemek ve arayana false değerini / döndürür değer veya işlevi almak için yanlış, ya dönmek.

Tek sorun bunun ne olduğunu bilmiyorum superglobal gibi dize işi elde etmektir. Ben param kontrol ve "almak" olduğunu durumunda, başka bir değişkenin değerini $ _GET ayarlanmış bir anahtarı ile daha önce yaptım. Ben bunu böyle yapmak istemiyorum Ancak, ben fetchdata dokunmak zorunda kalmadan daha fazla işlev eklemek için kolay olmasını istiyoruz.

Ben $ yöntem = eval ($ yöntemi) çalıştım, ama işe yaramadı. ($ Method = "$ _GET"), herhangi bir öneriniz?

EDIT: Üzgünüm yeterince net koymak vermedi. Ben dize değeri "$ _GET" ile bir değişken X var, nasıl bu kadar X dize açıklanan kaynaktan değerleri alır yapabilir?

Yani sadece bu kadar

$ X = $ _GET X değeri varsa "$ _GET"

$ X = $ _POST X değeri "$ 'POST" varsa

Ben sadece değer X ne var bilmiyorum, ama onun değeri daha aynı adla superglobalden veri almak gerekiyor.

5 Cevap

Göre this page in the manual,

Note: Variable variables

Süper küreseller, işlevler veya sınıf yöntemleri içinde değişken değişkenler olarak kullanılamaz.

Bu seni kastediyor can't Bir işlevin veya yöntemin (diğer değişkenler ile yapmak mümkün olurdu) içinde bunu:

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

Bunun yerine fetchdata(), sen $_GET geçemediği kendisine bir dize geçirmeden? Ben ('yazıp kopya') bunu değiştirmek sürece PHP bir değişken kopyalama olmayacağını düşünüyorum, bu yüzden bu gereksiz bellek kullanmak gerekir.

Aksi takdirde orada sadece dokuz superglobalstır, bu yüzden sizin önerdiğiniz gibi bir switch-case mantıksız değildir.

Eğer gerçekten böyle bir şey, olsaydı size eval() ile bunu yapabilirsiniz:

eval('return $_GET;');

O olsa, gereksiz ve kötü bir fikir olacağını düşünüyorum; yavaş ve herhangi bir yere yakın güvenilmeyen dizeleri izin konusunda son derece dikkatli olmak gerekir.

Eval kullanmayın. Sadece başvuru kullanın.

//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 Ve $ _REQUEST, varsayılan olarak herhangi bir null değerleri yalnızca dize veya dizi yok. Yani yerine array_key_exists orada isset kullanılır.

Param sipariş: I can ben her zaman opsiyonel önce gerekli params'ı koymak ve veri işleme / öznel params önce nesneleri. Thats neden anahtar superglobalValue ve getArrayValue için ikinci param için ilk param olduğunu.

Ben size ulaşmak için çalışıyoruz oldukça ne emin değilim, ama __ callStatic sihirli yöntemi bir göz olabilir

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

Eğer yapabileceği:

 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 manuel sihirli yöntemleri: http://ca.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.methods

Edit
I just noticed your edit, you could try:

 $X  = {$X};

Bunun yerine ["var"] $ _GET ve $ _REQUEST ["var"] veya $ _POST ["var"] kullanabilirsiniz.

Daha karmaşık bir yolu daha sonra kendi POST değilse değişken, GET dizide varsa test etmek olacaktır. Onun olsun eğer.

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

Eğer bir değişken küresel erişilebilir olmasını istiyorsanız, o $GLOBALS dizi tot ekleyebilirsiniz.

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

Şimdi $GLOBALS['test'] yerde getirebilir.