2009-07-24 32 views
7

私はこの質問を自分で解決しました。ファイル名が間違っていました。PHPクラスが見つかりません

こんにちは皆さん!

私はDrupalとJoomlaのようなCMSを構築しています。私は、モジュールの機能(プラグイン)に取り組んでいる、と私は、次のエラーを得た:ここ

Fatal error: Class 'settings' not found in C:\wamp\www\SYSTEM\view.php on line 22 

は私のコードです:

のsettings.php

start.php

<?php 
//First of all, start with some advertisement 
header("X-Powered-By:ZOMFG CMS, and ofcourse PHP, but that's less important"); 
//Then less impotant stuff lololol. 
session_start();        //Start a session 
mysql_connect($db_host, $db_user, $db_pass); //Connect to database 
mysql_select_db($db_name);      //Select a database 

//Load core 
require_once("core.php"); 

//Load modules 
$res_modules = mysql_query("SELECT * FROM ".$_SERVER["db_prefix"]."modules WHERE enabled=1"); 
echo mysql_error(); 
$module_exists = array(); 
while($row_modules = mysql_fetch_array($res_modules)) 
{ 
    //Load module 
    $name = $row_modules["name"]; 
    modules::load_module($name); 
    //and initialize it 
    eval($name."::init();"); 
    //Yes, it exists 
    $module_exists[$name] = true; 
} 

//Check if the user wants shit from a module 
if(isset($_GET["m"]))//Yes the user want it 
{ 
    //Does the module exist and activated, and has it a function called view? 
    if(isset($module_exists[$_GET["m"]]) && method_exists($_GET["m"], "view"))//Yep 
    { 
     //Load view (should be an array) 
     eval("\$module_view = ".$_GET["m"]."::view();"); 
     if(!is_array($module_view))//Not an array :(
     { 
      error::e500module($_GET["m"], $_SERVER["REQUEST_URI"]); 
     } 
     else//The error would kill the entire script, m'kay 
     { 
      view::index(); 
     } 
    } 
    else//Nope, so display error 
    { 
     error::e404($_SERVER['REQUEST_URI']); 
    } 
} 

<?php 
class settings 
{ 
    function get($what) 
    { 
     $result_get = mysql_query("SELECT value FROM ".$_SERVER["db_prefix"]."settings WHERE key='$what'"); 
     if(mysql_num_rows($result_get) > 0) 
     { 
      $row_get = mysql_fetch_array($result_get); 
      return $result_get["value"]; 
     } 
     else 
     { 
      return -1; 
     } 
    } 
} 

core.php

<?php 
//Load core classes 
require_once("settings.php"); 
require_once("error.php"); 
require_once("theme.php"); 
require_once("view.php"); 
require_once("modules.php"); 

view.php

<?php 
class view 
{ 
    function head() 
    { 
     include("../THEMES/".settings::get("theme")."/head.php"); 
    } 
    function foot() 
    { 
     include("../THEMES/".settings::get("theme")."/foot.php"); 
    } 
    function left() 
    { 
     include("../THEMES/".settings::get("theme")."/left.php"); 
    } 
    function right() 
    { 
     include("../THEMES/".settings::get("theme")."/right.php"); 
    } 
    function index() 
    { 
     include("../THEMES/".settings::get("theme")."/index.php"); 
    } 
} 

Start.phpは明らかに最初に実行されます。それ以前には他のページは実行されませんが、データベース情報を含むcustomsettings.phpは例外です。私は上記の私のコードで$ _SERVER [「db_prefixを」]を用いた場合、私はcustomsettings.phpに設定されているスーパーグローバルを必要とするので、それはです:

<?php 
$db_host = "localhost";   //Database host 
$db_user = "root";    //Database user 
$db_pass = "you may not know this";   //Database password 
$db_name = "zomfg";    //Database name 
$_SERVER["db_prefix"] = "zomfg_";//Prefix, needs to be superglobal 

customsettings.php誰も私を助けることができますか? settings.phpがインクルードされる前に、view.phpのindex関数が呼び出されたようです。申し訳ありませんが、この質問が大きければ、私はただ明確にしたいだけです。また、eval()が悪であると言っていない、私は知っている。

だから、設定クラスが見つからない理由を知りたいのですが。より多くのソースコードが必要な場合は、この質問にコメントしてください。

+0

愚かなことがあるように、私はまた、命名の問題がありました。 .phpを忘れました。 – craigtadlock

答えて

29

settings.phpがview.phpを含むスクリプトに含まれているため、settings.phpを利用できるとは思いますが、通常はそうではないことがわかりました。あなたの選択肢のカップルしている:それは1 を必要と思ったときにPHPがすべてのあなたのクラスを見つけることができるように

  • require_onceすべてのファイルの各クラスファイル内の各クラスのニーズ
  • __autoload()関数を書きます

    2番目のオプションはより柔軟です。

    あなたは、誰かがこの質問につまずく念のget_declared_classes()

+0

申し訳ありませんが、settings.phpをview.phpに含めても動作しません:S –

+0

私は何が間違っていたのか分かります。私のファイル名が間違っています。 Lolz –

+1

+1のprint_r(get_declared_classes())の提案 – billrichards

4

出力しようとするクラスを知りたい特定の場所から利用可能である場合には、私もこの問題を抱えていたと私は確認することによってそれを解決しているPHPの名前ファイルは、実際のファイル内のphpクラスの名前と同じでした。

愚かなことに、私は知っています。

+1

ファイル名は必ずしも重要ではありません。それはあなたのオートローダに依存するかもしれません。 – mattalxndr

+0

ちょっと変わった。知らせてくれてありがとうございます。いずれにしても、これが私の問題を解決したということは肯定的です。 私はEclipseをデフォルトの設定どおりに使用していました。 –

0

問題が発生する可能性があり、誰でも知っておく価値があります。

ファイルApp.php

<? 

class App extends something 
{ 
    function __construct() 
    { 

    } 
} 
?> 

ファイルインデックス:あなたは__autoload()とあなたが誤ってPHPタグを書く自動的にロードされたクラスを保持するファイルでを使用する場合は、クラスが見つからないというエラーが返されます。 PHP

<?php 

function __autoload($classname) { 

    $filename = "./classes/". $classname .".php"; 
    print("Loading $filename<br>\n"); 
    include_once($filename); 

} 


$app = new App(); 

?> 

上記のコードは機能しません。それが機能するためにあなたが長いものと短いオープニングPHPタグApp.phpを交換する必要があります。

<?php 

class App extends something 
{ 
    function __construct() 
    { 

    } 
} 
?> 

多くの短いタグについて作ることができるコメントは、使用PHPのバージョン、php.iniのがあります。ファイルとその残りの部分。しかしそれは無関係です。

7

OPのケースでは以下のようなことはできませんが、他の人には役立つかもしれません。

コードに<?phpの代わりに短いタグ<?が使用されているかどうかを確認し、該当する場合はphp.iniのshort_open_tag設定を確認してください。

あなたは、PHPのインストールが他の誰かから継承した場合、それはオフになっているが、デフォルトでは...

+0

これは、php.iniファイルの設定が異なる新しいサーバーに移動すると非常に簡単に実行できます。 – Ken

0

私は同じ問題がありました。時にはそれはパスの問題です。

の代わりに:

require_once('foo.php'); 

試してみてください。

define('__ROOT__', dirname(dirname(__FILE__))); 
require_once(__ROOT__ . '/your-dir-name/foo.php'); 
関連する問題