Classe PHP ne trouve pas
J'ai résolu cette question de mon propre. Le nom de fichier a été mal lolz.
Bonjour tout le monde!
Je suis en train de construire un CMS comme Drupal et Joomla. Je suis en train de travailler sur la fonction de module (plug-ins), et j'ai eu l'erreur suivante:
Fatal error: Class 'settings' not found in C:\wamp\www\SYSTEM\view.php on line 22
Voici mon code:
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 est évidemment exécuté en premier. Pas d'autres pages sont exécutés avant, à l'exception de customsettings.php qui contient des informations de base de données. Si j'ai utilisé la variable $_SERVER["db_prefix"] dans mon code ci-dessus, c'est parce que j'avais besoin d'une superglobale qui est mis en 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
Quelqu'un peut-il m'aider? Il semble que view.php s'indice de la fonction est appelée avant settings.php est inclus. Désolé si cette question est énorme, je veux juste être clair. Aussi, ne pas dire eval() est mal, je sais.
Donc, je veux savoir pourquoi les paramètres de la classe n'a pas pu être trouvé. Si vous avez besoin de plus de code source, s'il vous plaît commentaire à cette question.
OriginalL'auteur | 2009-07-24
Vous devez vous connecter pour publier un commentaire.
Si vous vous attendez settings.php être disponible pour view.php parce qu'il a été inclus dans un script qui inclut à la fois, j'ai trouvé que ce n'est généralement pas le cas. Vous avez deux choix:
require_once
tous les fichiers de chaque classe dans chaque fichier de classe__autoload()
fonction de sorte que PHP peut trouver toutes vos classes à chaque fois qu'il pense qu'il a besoin d'unLa 2ème option est plus souple.
Si vous voulez savoir les classes sont disponibles à partir d'un lieu spécifique, essayez de la sortie
get_declared_classes()
Je sais ce que j'ai fait de mal. Mon nom de fichier est incorrect. Lolz
+1 pour print_r(get_declared_classes()) suggestion
OriginalL'auteur dnagirl
Ne pas appy dans OP cas, mais peut aider les autres.
Vérifier si votre code utilise les balises courtes
<?
au lieu de<?php
et si oui, vérifiez dans votre php.ini pourshort_open_tag
réglage.Par défaut, elle est désactivée, mais si vous héritez de votre installation de php de quelqu'un d'autre...
OriginalL'auteur Konstantin
Juste au cas où quelqu'un trébuche sur cette question, j'ai eu ce problème aussi, et je l'ai résolu en faisant en sorte que le nom du fichier php est le même que le nom de la classe php à l'intérieur de la taille réelle du fichier.
Idiot, je sais.
hmm bizarre. Merci de me laisser savoir. Je suis convaincu que le problème est résolu pour moi, en tout cas. J'ai été en utilisant Eclipse avec tout ce que les paramètres par défaut sont.
OriginalL'auteur ohnoes_stackoverflown
Il y a un autre problème qui peut se produire et il est utile pour toute personne à le savoir. Si vous utilisez l' __autoload() et dans le fichier qui contient la classe étant chargé de l'écriture de vos balises PHP de manière incorrecte, il sera de retour une classe pas trouvé d'erreur:
Fichier App.php
fichier index.php
Le code ci-dessus ne fonctionne pas. Pour que cela fonctionne, vous devez le remplacer à court balise d'ouverture PHP App.php avec une longue:
Il y a beaucoup de commentaires qui pourraient être faites à propos de balises courtes, la version de PHP utilisée, la php.fichier ini et le reste. Mais il n'est pas pertinent. Suffit d'utiliser la version longue de la balise PHP
OriginalL'auteur JG Estiot
J'ai eu le même problème. Il est parfois problème avec chemin d'accès.
Au lieu de:
Essayer:
OriginalL'auteur superdario128