PHP-класс не найден

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

Всем привет!

Я создаю 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"); } } в <?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"); } } в <?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"); } } в <?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"); } } в <?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"); } } в <?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, очевидно, выполняется первым. Перед ним не выполняются другие страницы, за исключением customettings.php, который содержит информацию о базе данных. Если я использовал $ _SERVER ["db_prefix"] в моем коде выше, это потому, что мне нужен суперглобальный, который установлен в customettings.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 

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

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

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

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

Второй вариант более гибкий.

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

Следующий пример не относится к делу OP, но может помочь другим.

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

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

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

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

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

Файл App.php

 <? class App extends something { function __construct() { } } ?> 

file 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

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

Вместо:

 require_once('foo.php'); 

Пытаться:

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