2012-04-09 4 views
0

オブジェクトクラスを正しくインスタンス化できましたが、関数を呼び出す方法がわかりません。 は、ここに私のPHPコードです:PHPにGET変数を渡してクラスをインスタンス化して関数を呼び出す

$obj = new router(); 
class router{ 

public function __construct(){ 
    if($_SERVER['REQUEST_METHOD'] == 'GET'){ 
     echo "GET"; 
     $page = 'index'; 
     $funct = 'myfuncempty'; 

     if (!empty ($_GET)){ 
      $page = $_GET['page']; 
      $funct = $_GET['func']; 
     } 
     $obj = new $page(); //instantiating object with get from class 
     $obj->funct; 
    } 
    else{ 
     echo "POST"; 
    } 

} 

} 
class index{ 

public function __construct(){ 
    echo "hello I'm index"; 
} 
public function myfunc(){ 
    echo "yo"; 
} 

public function myfuncempty(){ 
    echo "empty get"; 
} 
} 

class login{ 
public function __construct(){ 
    echo "hello I'm login"; 
} 

public function loggedin(){ 
    echo "you're logged in"; 
} 

public function loggedinempty(){ 
    echo "its empty"; 
} 
} 

そして、これは私がGET経由で変数を渡すために使用するHTMLフォームです:

<html> 
<head></head> 
<body> 
<form action="index.php" method="POST"><input type ="text" name="page" id="page" /><input type="submit" /></form> 
<form action="index.php" method="GET">Page:<input type="text" name="page" id="page" />Function:<input type="text" name="func" id="func" /><input type= "submit" /> 
</body> 
</html> 

私は、ページの中でインデックスを入力し、機能のためでMYFUNC、Iこの応答を取得:

GEThello I'm login Notice: Undefined property: login::$funct in /home/cr47/public_html/final_project/index.php on line 27 

だから、それは正しく「ページ」を渡すと、オブジェクトをインスタンス化するが、それは正しくてmyfunc関数を呼び出すされませんされています。 アイデア

+2

ギャングセキュリティホール。 – ThiefMaster

+0

@ThiefMaster何が、マシンをハッキングしようとしているのですか?自分の妥協したクラスを作成し、それを$ _GETパラメータでインスタンス化しますか? – pp19dd

+0

自分のアプリケーションにクラスがあるか、誰かが任意のメソッドを呼び出すことができる「安全」でないPHPクラスが組み込まれている可能性があります。たとえ何らかの議論に合格することができないと、リスクはちょうど中程度です。しかし、とにかく、少なくともスパムがログファイルに記録されたり、誰かにメールを送信したりするエラーを引き起こす可能性があります。 – ThiefMaster

答えて

2

$obj->$funct();

$obj->funct;を置き換えしかし注意してください。ユーザーが任意のクラスをインスタンス化できないようにする必要があります。少なくともホワイトリストを使用するか、安全なクラスでのみ使用されるカスタムクラスのサブクラスである必要があります(つまり、ユーザーが行うことができないパブリックメソッドは実行できません)。

+0

ありがとう!出来た。私は実際のサイトでこれほどのことはしません。それは私が週末に立ち往生してきた宿題です。私はそれがちょうど私が得ていない構文だったと思った。 – CR47

関連する問題