Класс PHP не найден [закрыт]


Я решил этот вопрос самостоятельно. Имя файла было неправильным, lolz.

Всем привет!

Я создаю CMS, такие как Drupal и Joomla. Я работаю над функцией модуля (плагины), и я получил следующую ошибку:

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

Кто-нибудь может мне помочь? Кажется, что view.php функция индекса вызывается перед settings.php входит в комплект. Извините, если этот вопрос огромен, я просто хочу внести ясность. Также не говорите, что eval() - это зло, я знаю.

Поэтому я хочу знать, почему не удалось найти класс настроек. Если вам нужно больше исходный код, пожалуйста, прокомментируйте этот вопрос.

Author: Bram, 2009-07-24

5 answers

Хотя вы могли бы ожидать settings.php быть доступным для view.php поскольку это было включено в сценарий, который включает их обоих, я обнаружил, что обычно это не так. У вас есть несколько вариантов:

  • require_once все файлы, необходимые каждому классу в каждом файле класса
  • напишите __autoload() функция, позволяющая PHP находить все ваши классы всякий раз, когда он считает, что ему это нужно

2-й вариант является более гибким.

Если вы хотите знать классы доступны из определенного места попробуйте вывести get_declared_classes()

 29
Author: dnagirl, 2015-04-22 16:24:35

Следующее не применимо в случае ОП, но может помочь другим.

Проверьте, использует ли ваш код короткие теги <? вместо <?php, и если да, то проверьте свой php.ini на наличие настроек short_open_tag.

По умолчанию он выключен, но если вы унаследовали свою установку php от кого-то другого...

 7
Author: Konstantin, 2014-11-01 08:40:08

На всякий случай, если кто-то наткнется на этот вопрос, у меня тоже была эта проблема, и я решил ее, убедившись, что имя файла php совпадает с именем класса php внутри фактического файла.

Глупо, я знаю.

 4
Author: ohnoes_stackoverflown, 2014-01-12 22:07:45

Есть еще одна проблема, которая может возникнуть, и об этом стоит знать всем. Если вы используете __autoload() и в файле, содержащем загружаемый класс, вы неправильно напишете свои теги PHP, он вернет ошибку "Класс не найден":

Файл App.php

<?

class App extends something
{
    function __construct()
    {

    }
}
?>

Файл index.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 и остальном. Но это не имеет значения. Просто используйте длинную версию тега PHP

 0
Author: JG Estiot, 2014-10-09 13:04:21

У меня была та же проблема. Иногда это проблема с путем.

Вместо:

require_once('foo.php');

Попробуйте:

define('__ROOT__', dirname(dirname(__FILE__)));
require_once(__ROOT__ . '/your-dir-name/foo.php');
 0
Author: superdario128, 2016-06-16 23:53:34