web-dev-qa-db-ja.com

PHPクラスが見つかりません

私はこの質問を自分で解決しました。ファイル名が間違っていましたlolz。

みなさん、こんにちは!

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

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

これが私のコードです:

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']);
    }
}

settings.php

<?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で設定されているスーパーグローバルが必要だったためです。

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

誰か助けてもらえますか? settings.phpが含まれる前に、view.phpのインデックス関数が呼び出されているようです。この質問が大きい場合は申し訳ありませんが、明確にしておきたいと思います。また、eval()が悪だとは言わないでください。

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

9
user142019

Settings.phpは、両方を含むスクリプトに含まれているため、view.phpで使用できると予想されますが、通常はそうではないことがわかりました。いくつかの選択肢があります。

  • _require_once_ 各クラスが各クラスファイルで必要とするすべてのファイル
  • __autoload() 関数を記述して、PHPが必要だと思うときはいつでも、すべてのクラスを見つけることができるようにします。

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

クラスが特定の場所から利用できることを知りたい場合は、出力してみてください get_declared_classes()

30
dnagirl

以下はOPの場合にはうまくいきませんが、他の人を助けるかもしれません。

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

デフォルトではオフになっていますが、他の誰かからphpインストールを継承する場合は...

7
Konstantin

誰かがこの質問に出くわした場合に備えて、私もこの問題を抱えていました。phpファイルの名前が実際のファイル内のphpクラスの名前と同じであることを確認することで解決しました。

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

私も同じ問題を抱えていました。パスに問題がある場合があります。

の代わりに:

require_once('foo.php');

試してください:

define('__ROOT__', dirname(dirname(__FILE__)));
require_once(__ROOT__ . '/your-dir-name/foo.php');
0
superdario128