2011-11-09 9 views
1

私はOOP PHPを使用してMVCパターンを構築しようとしています。私が正確に何を望んでいるかを理解するために、残りの記事をお読みください。PHP MVCデザインの問題

これは、メインコントローラは、次のようになりますと、ローダークラスを拡張し、メインコントローラを拡張し、ホームページコントローラ

class Home extends Controller { 

    function __construct() { 
     parent::__construct(); 
    } 

    public function index() { 
     $this->load->model("test"); 
     $this->test->get_all(); 
     $data = array (
      'name' => "Amr", 
      'age' =>24 
     ); 
     $this->load->view("home_view",$data); 
    } 

} 

です:

class Controller extends Loader { 
    public $load; 

    function __construct(){ 
     parent::__construct(); 
     $this->load = new Loader(); 
    } 
} 

問題を抱えているLoaderクラスは、この

のように見えます
class Loader { 

    public $Error; 

    function __construct(){ 
     $this->Error = new Error(); 
    } 

    public function model($Modelname){ 
     $this->$Modelname = $Modelname; 
     if (file_exists("models/".$Modelname.".php")){ 
      require_once $Modelname . ".php"; 
      $this->$Modelname = new $Modelname; 
     }else{ 
      $this->Error->Not_found(); 
     } 
    } 

    public function view($Viewname,$data=NULL){ 
     if(is_array($data)){ 
      extract($data); 
     } 
     if (file_exists("views/".$Viewname.".php")){ 
      require_once $Viewname . ".php"; 
     }else{ 
      $this->Error->Not_found(); 
     } 
    } 

    public function helper($helper) { 
     if (file_exists("helpers/".$helper.".php")){ 
      require_once $helper . ".php"; 
      $this->$helper = new $helper; 
     }else{ 
      $this->Error->Not_found(); 
     } 
    } 

} 

私がする必要があるのは、FROM HOMEPAGE Con​​trolこのようなことをしてはいけません。

$this->load->model("someModel"); // model name is test 
$this->someModel->someMethodInModel(); // the model method is get_all() 
// and the same for helper 
$this->load->helper("someHelper"); 
$this->someHelper->someMethodInHelper(); 

誰でも手伝ってもらえますか?

EDIT:これを行うときに私が取得していますエラーは次のとおりです。

Notice: Undefined property: Home::$test

Fatal error: Call to a member function get_all() on a non-object

注:モデル名がtestで、モデルの方法は、あなたが何get_all()

答えて

0
public function model($Modelname){ 
$this->$Modelname = $Modelname; 
if (file_exists("models/".$Modelname.".php")){ 
require_once $Modelname . ".php"; 
$this->$Modelname = new $Modelname; 

です助けが必要ですか?現在のコードを使用すると、あなたのホームコントローラに

を入力できます。私はちょうどそれを自分で試しました。どのようなエラーが出ますか?何が正しく機能していないのですか?

+0

私はポストジョンで編集しました。私は何を得ているのですか、ありがとうございました。助けてください –

+0

質問を編集して現在のコードを表示してください。 –

+0

私はコードを編集しました。現在のコードは、家のコントローラ –

0

私はあなたでしたが、 "loader"クラスを呼び出し、新しいモデル/ヘルパー/ビューを変数に格納する "load()"メソッドをコントローラに配置します。

0

あなたのローダーはコントローラクラスではなく、Loaderクラスのメンバーとしてモデルのインスタンスを作成していると思います。

+0

のインデックスメソッドに2行追加されている以外は同じものを使用しています。どうすれば修正できますか? –

+0

これはスコープの問題であり、オブジェクト指向プログラミングの基礎の1つです。あなたの 'Loader'クラスはモデルをインスタンス化して、あなたのコントローラクラスが' load() 'メソッドを呼び出すのではなく、そのクラスのメンバとして追加しています。コントローラからモデルにアクセスするには、代わりに '$ this-> load-> someModel-> someMethodInModel();を実行する必要があります。 –

0

お使いのベースのコントローラは、ローダーが、その後

class Controller extends Loader { 
    public $load; 

    function __construct(){ 
     parent::__construct(); 
     $this->load = new Loader(); 
    } 
} 

プロパティのようにそれを使用

class Controller extends Loader { 

} 

別の方法に変更し、それは魔法のメソッドフックhttp://php.net/manual/en/language.oop5.overloading.php#object.get

class Controller { 
    public $load; 

    function __construct(){ 
     parent::__construct(); 
     $this->load = new Loader(); 
    } 

    function __get($modelName){ 
     return $this->load->$modelName; 
    } 


} 
を使用することである理由がない拡張する場合
関連する問題