PHP değişken değişken kullanmak ne zaman?

7 Cevap php

Ben bir süre için şimdi PHP gelişmekte oldum, ve ben hala değişken değişkenleri kullanmak zorunda olduğunuz bir görevi olmadı. Bunları kullanarak iyi bir fikir nerede kimse bana bir örnek verebilir misiniz? Ya da sadece eğlenmek için dil dahil edildi?

7 Cevap

Bu teknik tarihli olabilir, ve ben kuşkusuz uzun bir süre kullanmış olmama rağmen bunları kullanmak zorunda olduğunuz bir durum, URI işleme.

Kullanıcının biz formatta script URI çekmek istiyorum diyelim domain.tld/controller/action/parameter/s. Biz şu kullanarak betik adını kaldırabilirsiniz:

$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']);

Biz yolu ayırıcısını '/' kullanarak dize patlamaya zorunda gidiyoruz bu gelen kontrolör, eylem ve parametre değerleri ayıklamak için. Biz bir lider ya da sınırlayıcı sondaki varsa Ancak, biz patlama üzerine boş bir dizi değerlere sahip olacak, bu yüzden dize başında ve sonunda gelenler Döşeme olmalıdır:

$uri_string = trim($uri_string, '/');

Biz şimdi bir diziye yolunu patlayabilir:

$uri_data = explode('/', $uri_string);

$uri_data[0] şimdi bizim denetleyicisi adını, $uri_data[1] eylem adını içeren ve eylem yöntemi iletilmesi gereken parametreler olduğunu ötesinde dizi değerlerini içerir.

$controller_name = $uri_data[0];
$action_name = $uri_data[1];

Yani, şimdi bu isimleri var ki, biz bir kaç şey için kullanabilirsiniz. Eğer site köküne çok özel bir dizin nispetle denetleyicileri tutarsanız, require_once controller sınıfı için bu bilgileri kullanabilirsiniz. Bu noktada, bunu örneğini ve değişken değişkenleri kullanarak çağırabilirsiniz:

$controller = new $controller_name();
$controller->{$action_name}();    // Or pass parameters if they exist

Orada bu yaklaşımda için dışarı bakmak için güvenlik FRİKİKLERİNDEN bir yeri vardır, ama bu değişken değişkenler faydalanmak için gördüğüm bir yoludur.

DISCLAIMER: Ben senin aslında bu kodu kullanabilirsiniz demiyorum.

Ben genellikle kod kötü kokuyor yerlerde onları bulmak. Belki vb statik bir yapılandırma değişkeni başvuruyor .. Ama neden her zamanki ilişkisel dizi daha iyi bir çözüm olmazdı. Gerçekleşmeyi bekleyen bir güvenlik delik gibi görünüyor.

Ben etkili şablonları bunları kullanmak mümkün olabilir varsayalım.

Onları asla kullanmayın; bir "dizi" her zaman daha iyi bir çözümdür.

Öncelikle, bu amaçlar için kullanıcı çıkışı kullanmak olsaydı büyük bir güvenlik sorunu olurdu. Internals burada yalnızca geçerli kullanımı vardır.

Göz önüne alındığında, ben çeşitli değişkenler döngü veya parametreler gibi değişkenler göndermek gibi şeyler için hayal.

foreach($name in array('_GET','_POST','_REQUEST')) {
    array_map('stripslashes',$$name);
}

Dilleri (ben bile asked a question about it bir süre geri) elini sürmemek gerekir, ve değişken değişkenler muhtemelen bu kategoriye girer, bu yapılardan biri olan özellikler eklemek için nadir değildir. Bir dil içeren sırf bir özelliği kullanmak zorunda söylemek anlamına gelmez.

Orada (her yineleme pratikte nadiren kullanılan ancak hiç kimse bu önemli bir yapı değil iddia ediyorum sonra) bir sorunu çözmek durumlar olabilir ama sizin kodu ne yaptığını gizler ve değişken değişkenler meydan okurcasına düşmek genel olarak herhangi bir dil özelliği Bu kategori, çok dikkatli tedavi edilmelidir.

(Eğer fantezi bir şey yapmıyorlar eğer gerek olmayacak) çok derinlik değişkenlerin çalışma sürece muhtemelen onlara ihtiyacım yok olacaktır. Hatta daha sonra, muhtemelen aynı şeyi yazmak ve yine aynı sonucu elde etmek için başka bir yol bulabilirsiniz. Bu kısa olabilir (ve bazı durumlarda anlamak daha kolay) Ben dilin parçası olduğunu memnun 01:00 için olsa onları kullanmak, öylesine.

Ben değişken değişkenler için bir çok faydası bulamadım ama yöntemleri için değişkenleri kullanarak sürece ne yaptığınızı net olarak, kullanışlı olabilir. Örneğin basit bir REST hizmete Eğer böyle bir şey yapacağım:

$method = $request->getMethod(); // 'post','get','put','delete'
try 
{
    $response = $resource->$method($request->getInput());
}
catch (BadMethodException $badMethod)
{
    $response = $responseFactory->getError($badMethod);
}

Bazıları bir switch deyimi (hangi olabilir) ile eşit derecede iyi bu yapabileceğini iddia ediyorum ama bu şekilde (başka bir yöntem türü eklemek için karar verirseniz) genişletilebilirlik kendisini ödünç ve üzerinde bir yöntem uygulanması soyutlama korur Bir kaynak.