2011-07-19 11 views
-1

PHPでのOOPプログラミングの経験はあまりなく、私の検索では結果は得られませんが、メソッドの直接的な解決方法はありません。私は提案のいくつか試してみたが、何私が手にすることは、メモリ過負荷エラーメッセージです:OOPの動的メソッド呼び出し

// URL Decides which controller method to load 
$page = $_GET['page']; 

// I want to load the correct controller method here 
$this->$page(); 

// A method 
public function home(){} 

// Another method 
public function about(){} 

// e.g. ?page=home would call the home() method 

編集:私は必要なのはこれです。

<?php 

class Controller { 

    // Defines variables 
    public $load; 
    public $model; 

    public function __construct() { 

     // Instantiates necessary classes 
     $this->load  = new Load(); 
     $this->model = new Model(); 

     if (isset($_GET['page'])) { 

      $page = $_GET['page']; 

      $fc = new FrontController; // This is what crashes apparently, tried with and without(); 

     } 

    } 

} 
+2

試しましたか? – netcoder

答えて

0

あなたはこのようなものを使用して動的プロパティとメソッドを呼び出すことができます:

$this->{$page}(); 
0

は、クラスを使用しますここに私の完全なコードです。

Class URLMethods { 
    public function home(){ ... } 
    public function about(){ ... } 
} 

$requestedPage = $_GET['page']; 

$foo = new URLMethods(); 
$foo->$requestedPage(); 
+0

しかし、url変数がフローを制御できるようにすることは、セキュリティなどの理由でひどい考えです。これを行うつもりなら、GET変数をサニタイズ(明示的に許可された値をチェック)してください。 –

3

私が正しくあなたの質問を理解していれば、あなたはおそらくもっとこのような何かをしたいと思います:

class FrontController { 
    public function home(){ /* ... */ } 
    public function about(){ /* ... */ } 
} 

$page = $_GET['page']; 
$fc = new FrontController; 
if(method_exists($fc, $page)) { 
    $fc->$page(); 
} else { 
    /* method doesn't exist, handle your error */ 
} 

は、これはあなたが探しているものですか?ページは、入ってくる$ _GET ['page']変数を調べ、FrontControllerクラスに$ _GET ['page']という名前のメソッドがあるかどうかを確認します。そうであれば、呼び出されます。それ以外の場合は、エラーについて何か他のことを行う必要があります。

-1

call_user_funcを使用してこれを実現できます。私はあなたがこのように呼び出し可能な関数に別の文字列を追加することもたいと思いますHow do I dynamically invoke a class method in PHP?

参照:

あなたはおそらくしたくないメソッドを呼び出すためにハッカーを防ぐために
public function homeAction(){} 

+0

なぜこのようなメソッドをプライベートにしないのですか? – Ryan

+0

別のクラスからそのメソッドを呼び出す必要がある場合に備えてください。とにかく、あなたのコメントの質問は主観的なものであり、これはZendFrameworkが実際に行う方法なので、実際にこれを行うにはいくつかの論理があると思います。 – s3v3n

+0

その後、追加セキュリティが無意味なときはいつですか? – s3v3n

関連する問題