2009-03-17 18 views
1

ここではコードの一部です:変数PHPの変数とURL機能

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

それが動作する変数の変数に基づいていますが、私は実際にどのように理解していません。だから、コードの最初の部分で、何が起こっている

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; 

: 私の知る限りでは、変数の変数は、このようなもののために使用されていますか?また、中括弧はどのような機能を果たしますか?彼らはコンパイラに何を考えさせるのですか?

答えて

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

は、単に名前が$ _GET [ "FUNC"]に格納され、パラメータ$ _GET [ "PARAM"]として通過されるメソッドを呼び出します。

括弧は、例えばecho "calling {$_GET['func']}";

多くのためのPHP manual page on variable variablesを参照してください、(あなたも同じような目的のために、文字列に括弧を使用するメソッド名を明確にするのに役立つなどの変数変数を 使用するためには

配列 $$a[1]を書く場合、 の曖昧さの問題を解決する必要があります。として$a[1]を使用するのであれば、パーサは を知る必要がありますまたは変数として$$aを入力し、[1]のインデックスを から変数に変更したい場合は、このあいまいさを解決する の構文は次のとおりです。${$a[1]} 最初のケースは${$a}[1] 秒です。セキュリティ

ノートこれが受け入れ答えですが、私はあなたがそう盲目的にユーザー入力を使用してはならないことを追加するつもりだとして、そのあなたがwouldn $ OBJの方法があるかもしれません呼び出されたくありません。

たとえば、許可されたメソッドの配列に対してメソッド名をチェックできます。

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

また、特定のパターンに続くメソッド名のみを許可することもできます。 「AJAX」で接頭辞:

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

か、その接頭辞を持つ唯一の方法は

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

呼び出すことができるように接頭辞が渡されたメソッド名に追加されるという考えに変化、その他があります。基本的な考え方を示していることをうまくいけば、は、最悪の敵が$_GETアレイを構築したと仮定します!

+0

私はそれを手に入れました。したがって、私のfuncのパラメータが "GetID"でparamが2の場合、私はそれを取得します:$ obj-> GetID(2); – Vordreller

+0

これはもちろん危険です。実際には、信頼できないユーザー入力からの関数名を受け入れることは決してありません。しかし、あなたはそれに取り組んでいますよね? – bobince

+1

良い点は、答えを拡大しました。 –

1

これは基本的にパラメータによって関数を呼び出しています。

あなたのような要求を行うのであれば、:あなたはこの関数呼び出しを取得してしまいます何

mypage.php?func=prop&param=value 

$obj->prop('value') 

中括弧は[一緒に配列表記を維持し、それを適用するのに役立ちます"func"]を$ obj - > $ _ GETの代わりに$ _GET変数に置き換えます(これは有効な配列になります)。あなたは括弧を使用しなかった場合、何をやっているだろうことは次のようになります。この場合

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

、あなたは配列$ OBJのキー「FUNC」を求められることに注意してください - > $ _ GET 、単に$ _GETの代わりに。