PHP ve URL fonksiyonları Değişken değişkenler

2 Cevap php

Burada bir kod parçası:

$obj = new myClass();
$obj->{$_GET["func"]}($_GET["param"])

It works based on variable variables, but I don't really understand how. As far as I know, variable variables are used for stuff like this:

require "dbsettings.php"
$member_id = $_GET['id'];
$db = new DBconnector();
$vars = array('username','passw','email','info','datejoined','dateofbirth');

foreach ($vars as $var) {
  $$var = $db->getUserInfo($member_id,$var);
}
echo $username;
echo $passw;
echo $email;
echo $info;
echo $datejoined;
echo $dateofbirth;

Yani, kodun ilk parça, ne oluyor? Ayrıca, parantez ne işlev hizmet ediyor? Ne derleyici düşünmek söyleyebilirim?

2 Cevap

$obj->{$_GET["func"]}($_GET["param"])

Sadece ismi $ _GET ["işlev"] saklanır ve bir parametre $ _GET ["param"] olarak geçmesi yöntemini çağırır.

Parantez (aynı zamanda benzer amaçlar için dizeleri parantez kullanmak yöntem adı disambiguate hizmet, örneğin echo "calling {$_GET['func']}";

PHP manual page on variable variables fazla, örneğin bakınız

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.

A note on security

Bu kabul cevap olarak, ben size denilen istemem $ obj ilgili yöntemler olabilir, bu yüzden körü körüne kullanıcı girişi kullanmak gerektiğini eklemek için gidiyorum.

Siz, örneğin, izin verilen yöntemler bir dizi, örneğin karşı yöntem adını kontrol edebilir

$method=$_GET["func"];
$ok=in_array($method, array('foo', 'bar', 'frobozz'));

Alternatif olarak, yalnızca belirli bir desen takip yöntem isimleri, örneğin izin verebilir 'ajax' öneki:

$method=$_GET["func"];
$ok=preg_match('/^ajax[A-Za-z]/', $method);

Veya önek geçti yöntem adı eklenir bu fikir, bir varyasyon yalnızca bu önek ile yöntemleri çağrılabilir böylece

$method='ajax'.preg_replace('/[^A-Za-z]/', '', $_GET["func"]);

Orada başka yolları vardır, ama umarım bu temel ilkesini gösterir: assume your worst enemy constructed the $_GET dizisi

Bu temelde parametrelerine bağlı bir funcion çağırıyor.

Yani, böyle bir istek yaparsanız:

mypage.php?func=prop&param=value

Bu işlev çağrı alma bitireceğiz Ne:

$obj->prop('value')

Parantez birlikte dizi gösterimini tutmak ve (geçerli bir dizi olabilir) yerine $ obj-> $ _GET ve $ _GET değişkene ["fonk"] uygulamak için hizmet vermektedir. Eğer parantez kullanmak olmadıysa, ne yapıyor olacak benzer olacaktır:

($obj->$_GET)["func"](...)

Bu durumda, yerine sadece $ _GET arasında, array $ obj-> $ _GET anahtar "fonksiyon" için soran olacağını unutmayın.