Garip '$ {}' kod için PHP 5.3 desteği?

6 Cevap php

Ben sadece PHP 5.3 yükseltilmiş ve yeni bir müşteri için eski bir web destekleyen başladım. Ben daha önce rastlamak ettik oldukça garip PHP kodu kullanmak gibi görünüyor.

${"variable_name"}: $ _GET veya $ _REQUEST değişkenleri erişmeye çalışıyor iken, geliştirici aşağıdaki kullandı

Ben nedeniyle (PHP ${"variable_name"} stil kodu ayrıştırma değil muhtemelen çünkü) tanımlanmamış değişkenler oluşturulan bildirimleri almak.

$_REQUEST['variable_name'] bu değişen beklendiği gibi çalışır, ama tüm bunların kod geçmesi ve site masif ve proprietry düzen yöntemleri kullanır gibi değiştiremezsiniz.

Bu etiketleri / kod-bloklarından desteği açmak mümkün olmadığını biliyor mu? Ben PHP.ini bir göz attık ve ASP tarzı etiketleri ve kısa etiketleri bir söz var ama imkan sağlayan bu (onlar ben sadece bir çekim değer olduğunu düşündüm, yine de tamamen farklı görünüyor) hiçbir etkisi yoktur.

6 Cevap

Ben bu sözdizimi ile yeni bir şey olduğunu sanmıyorum:

$a = 10;
var_dump(${"a"});

Sadece çalışıyor ;-)


You problem is probably due to the fact that, before, register_globals was enabled (by default, if PHP <= 4.something), and is now disabled -- and that is good for security !

Açık olarak ayarlandığında register_globals ile, herhangi bir değişken $_REQUEST otomatik olarak uygulamanızda bir vartiable olarak enjekte edilir -- well, actually, this depends on the variables_order configuration option, but this one almost always includes Get, Post, and Cookie, at least.

Örneğin, $_GET['my_var'], ayrıca bir $my_var değişkeni olacak ... Ve bu da sözdizimi ile ulaşılabilir gibi bir değişken varsa ${'my_var'}


Considering register_globals is Off by default since something like PHP 4.2, and should disappear in PHP 6 (if I remember correctly), I would advise against re-activating it... at least, if you have the time required to correct / test the code...

Değişkenler için kaşlı ayraç sözdizimi PHP gömülü bir parçasıdır ve oldukça süre için yaklaşık edilmiş. Mevcutsa nedeni kullanırken diziler ve nesne sözdizimlerine belirsizlikleri gidermek için variable variables.

Manuel:

In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second.

Bu tür heredoc syntax kullanarak bir şey çıkış yaparken dizi veya nesne değişkenler gibi çeşitli durumlarda, çok kullanışlı bir sözdizimi.

I register_globals, ben sadece bu sıradışı sözdizimi yorumlamak istedim kullanma hakkında başkaları tarafından tavsiye yinelemek olmaz.

$ {"Deðiþken_adý"} sözdizimi kıvırcık parantez içindekiler ilk değerlendirilir dışında, pratikte $ deðiþken_adý aynıdır. Bu PHP'nin son sürümlerinde, hatta beta sürümleri tarafından desteklenmektedir. Ne PHP'nin yeni sürümleri tarafından desteklenmiyor olsa, global değişken olarak $ _REQUEST (ve diğer) değişkenleri tescil desteği. Bunu sağlamak için bir ayar var:

register_globals = on

Ama güvenlik sorunları nedeniyle üretim kullanımı için tavsiye edilmez. Bazı 'sed' gibi araç üzerinden size kaynağını çalıştırmak ve düzenli ifade ile kullanımlarını değiştirmek daha kolay olabilir.

Eski sunucu muhtemelen REGISTER_GLOBALS üzerinde bulunur. Yani garip parantez sorun değildir.

REGISTER_GLOBALS tüm değişkenleri koyar $_REQUEST Eğer $_REQUEST['test'] $test ya da benzeri ulaşılabilir erişebilirsiniz anlam küresel kapsamda normal değişkenler gibi ${"test"}

Braket sözdizimi varsayılan olarak açıktır, ve ben / kapalı açabilirsiniz inanmıyorum.

register_globals olasılıkla açılmıştır. {$variable_name} sözdizimi üzerine her zaman, ama register_globals $_REQUEST['variable_name'] içine $variable_name gibi şeyler dönüyor.

Mümkünse eğer rağmen, bunu açtıktan Önlemek - uzun karşı tavsiye olmuş bir sebebi var, ve tamamen PHP6 uzakta gidiyor.

register_globals php 5.3 olarak önerilmiyor ve php 6.0 olarak silinecektir. Ne yapmak istediğinizi daha uygun bir şey, yani $_GET['variable_name'] değişkeni yeniden adlandırmak için en PHP IDE (zendo stüdyo 6 +) bulunan Refactoring özelliğini kullanmaktır.