大家好!
我正在构建像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()是邪恶的。
所以我想知道为什么无法找到设置类。如果您需要更多源代码,请对此问题发表评论。
答案 0 :(得分:30)
虽然您希望settings.php可用于view.php,因为它包含在包含它们的脚本中,但我发现通常情况并非如此。你有几个选择:
require_once
每个类文件中每个类需要的所有文件__autoload()
函数,以便PHP可以在认为需要的时候找到所有类第二种选择更灵活。
如果您想知道某个地方的课程,请尝试输出get_declared_classes()
答案 1 :(得分:7)
以下内容并不适用于OP的情况,但可能有助于其他人。
检查您的代码是否使用短标记<?
而不是<?php
,如果是,请检查您的php.ini是否为short_open_tag
设置。
默认情况下它处于关闭状态,但如果您从其他人继承您的php安装...
答案 2 :(得分:4)
以防万一有人偶然发现这个问题,我也遇到了这个问题,我通过确保php文件的名称与实际文件中php类的名称相同来解决它。
傻,我知道。答案 3 :(得分:0)
可能会出现另一个问题,任何人都应该知道它。如果您使用__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标签的长版本
答案 4 :(得分:0)
我有同样的问题。有时它是路径的问题。
而不是:
require_once('foo.php');
尝试:
define('__ROOT__', dirname(dirname(__FILE__)));
require_once(__ROOT__ . '/your-dir-name/foo.php');