2011-10-24 13 views
1

PHP OOPには比較的新しいので、コントローラ経由でPHPクラスの関数を呼び出すことができないようです。私の現在の設定は次のとおりです。PHP OOP、jQuery、MVC

  • のindex.php
  • class.Class1.php
  • 私には、 index.phpの以内
  • functions.controller.php
  • script.js

class.Class1.php、新しいClassオブジェクトを作成し、いくつかのHTMLを出力するメソッドをいくつか使用します。私はscript.jsでjs関数を使用してfunctions.controller.phpと通信し、class.Class1.phpのメソッドを呼び出して戻ります(リンクのonclick属性を使用して呼び出されます)script.jsへのデータは、index.phpにHTMLを出力します。

問題は、特定のオブジェクトのデータを取得するためにメソッドを使用する方法がわかりません。私は、コントローラを呼び出すとき:

$.ajax({ 
    type: 'GET', 
    url: 'functions/functions.controller.php', 
    data: 'r=' + 'h', 
    success: function(data){ 
     $('.showing').html(data); 
    } 
}); 

を私は500内部サーバーエラーを取得:

[25-Oct-2011 01:24:06] PHP Warning: include(classes/class.Class1.php) [function.include]: failed to open stream: No such file or directory in /Users/Joey/Desktop/root/Test/functions/functions.controller.php on line 7

[25-Oct-2011 01:24:06] PHP Warning: include() [function.include]: Failed opening 'classes/class.Class1.php' for inclusion (include_path='.:/Applications/MAMP/bin/php5.3/lib/php') in /Users/Joey/Desktop/root/Test/functions/functions.controller.php on line 7

[25-Oct-2011 01:24:06] PHP Fatal error: Class 'Class1' not found in /Users/Joey/Desktop/root/Test/functions/functions.controller.php on line 9

これはcontroller.phpです:

include('classes/class.Class1.php'); 

$in = new Class1; 

echo $in->getData(); 

誰もがこの上でいくつかの光を当てるていただけますか?また、AJAXのヒントを持つ他のPHP OOP MVCも歓迎します。現在のコードをもっと必要とするなら、私は投稿して喜んでします。

+0

本当にコントローラに直接要求する必要はありますか?あなたが達成しようとしている何らかのMVCのように見えます。コントローラーによって処理される '/ my/url'のようなURLはありませんか? – PeeHaa

+0

500レスポンスのWebサーバーログに表示されるエラーメッセージは何ですか?また、あなたの質問の先頭に記載されているファイル名とコード内の参照との間には多少の矛盾があるようです。あなたはそれを掃除できますか? – Phil

+0

@PeeHaa MVCはURL書き換えを自動的には暗示しないので、私はその前提にジャンプしません – Phil

答えて

0

あなたのインクルードパスが混ざっているように見えます。

私は例えば

// PHP >= 5.3 
require_once __DIR__ . '/../classes/class.Class1.php'; 

// PHP < 5.3 
require_once dirname(__FILE__) . '/../classes/class.Class1.php`; 
+0

ああ、いかに恥ずかしいですか? – Joey

+0

これは私の問題を解決しました。クラスのメソッドを呼び出すことができました。既存のオブジェクトのデータを取得したいのですが、毎回そのクラスの新しいオブジェクトを作成する必要があります。どのように私はこれを解決できるか考え? – Joey

+2

@Joey:既存のオブジェクトがありません。各スクリプトの全体が各要求とともに実行されます。 PHP変数に格納されたデータは、処理される要求を超えて保持されません。拡張機能は、作成するリソースに関連するデータを格納する可能性があります。データは '$ _SESSION'で自動的にシリアライズできますが、通常は同じセッション内でしかアクセスできません(複数のユーザはセッションを共有しません)。データベースは、データを永続化する主なメカニズムです。 – outis

1

、あなたがfunctionsディレクトリから抜け出すために最初のディレクトリを横断するために、実際に

index.php 
classes/class.Class1.php 
functions/functions.controller.php 
script.js 

functions.controller.phpからclass.Class1.phpを含める必要がされたファイル構造を仮定していますPHPがファイルを含むときに親のディレクトリ( "/ Users/Joey/Desktop/root/Test /")がPHPの検索パスにないため、PHPは "classes/class.Class1.php"を見つけることができません。インクルードパスにphp.ini.htaccess(PHPをApacheモジュールとして実行している場合)またはprogrammaticallyのいずれかに、 "/ Users/Joey/Desktop/root/Test /"を追加します。最後のケースでは、ドキュメントルートを使用できます。例えば、ドキュメントルートがある場合は、「/ユーザ/ジョーイ/デスクトップ/ルート/」(検索パスに追加するフォルダの親)です:

set_include_path(get_include_path() . PATH_SEPARATOR 
       . $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'Test'); 

あなたはそのアップデートのコードを配置する場合追加するフォルダ内にある初期化ファイルのインクルードパスには、次のものを使用できます。

set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__);