2009-07-24 6 views
7

J'ai résolu cette question moi-même. Le nom de fichier était incorrect lolz.Classe PHP non trouvée

Bonjour à tous!

Je construis un CMS comme Drupal et Joomla. Je travaille sur la fonction du module (plug-ins), et j'obtenu 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. Aucune autre page n'est exécutée avant elle, sauf customsettings.php qui contient des informations de base de données. Si je $ _SERVER [ "db_prefix"] dans mon code ci-dessus, il est parce que je avais besoin d'un superglobale qui est situé dans 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 me aider? Il semble que la fonction index de view.php soit appelée avant que settings.php soit inclus. Désolé si cette question est énorme, je veux juste être clair. Aussi, ne dites pas eval() est le mal, je sais. Donc, je veux savoir pourquoi la classe de paramètres n'a pas pu être trouvée. Si vous avez besoin de plus de code source, veuillez commenter cette question.

+0

stupide comme il est, j'ai aussi eu un problème de nommage. J'ai oublié le .php. – craigtadlock

Répondre

29

Bien que vous vous attendiez à ce que settings.php soit disponible à view.php parce qu'il a été inclus dans un script qui les inclut tous les deux, j'ai constaté que ce n'est généralement pas le cas. Vous avez deux choix:

  • require_once tous les fichiers besoins de chaque classe dans chaque fichier de classe
  • écrire une fonction __autoload() pour que PHP peut trouver toutes vos classes chaque fois qu'il pense qu'il a besoin d'un

La 2ème option est plus flexible.

Si vous voulez connaître les cours sont disponibles à partir d'un endroit particulier essayer sortie get_declared_classes()

+0

Désolé, même en incluant settings.php dans view.php ne fonctionne pas: S –

+0

Je sais ce que j'ai fait de mal. Mon nom de fichier est erroné. Lolz –

+1

+1 pour print_r (get_declared_classes()) suggestion – billrichards

4

quelqu'un Juste au cas où 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 php fichier était le même que le nom de la classe php dans le fichier réel.

Silly, je sais.

+1

Le nom du fichier n'a pas nécessairement d'importance. Cela peut dépendre de votre autochargeur. – mattalxndr

+0

hmm bizarre. Merci de me le faire savoir. Je suis certain que cela a réglé le problème pour moi, en tout cas. J'utilisais Eclipse avec les paramètres par défaut. –

0

Il existe un autre problème qui peut survenir et qui vaut la peine d'être connu.Si vous utilisez __autoload() et dans le fichier qui contient la classe en cours autochargée vous écrivez vos balises PHP correctement, il renvoie une erreur classe non trouvée:

Fichier app.php

<? 

class App extends something 
{ 
    function __construct() 
    { 

    } 
} 
?> 
index de fichiers

. php

<?php 

function __autoload($classname) { 

    $filename = "./classes/". $classname .".php"; 
    print("Loading $filename<br>\n"); 
    include_once($filename); 

} 


$app = new App(); 

?> 

Le code ci-dessus ne fonctionne pas. Pour que cela fonctionne, vous devez remplacer la balise PHP courte ouverture app.php avec une longue:

<?php 

class App extends something 
{ 
    function __construct() 
    { 

    } 
} 
?> 

Il y a beaucoup de commentaires qui pourraient être faits sur les balises courtes, la version de PHP utilisée, le php.ini fichier et le reste. Mais ce n'est pas pertinent. Utilisez simplement la version longue de l'étiquette PHP

7

Ce qui suit ne s'applique pas dans le cas d'OP mais pourrait aider d'autres personnes.

Vérifiez si votre code utilise des étiquettes courtes <? au lieu de <?php et si oui, vérifiez votre php.ini pour le paramètre short_open_tag.

Par défaut, il est désactivé, mais si vous héritez votre installation php de quelqu'un d'autre ...

+0

Cela peut arriver très facilement si vous passez à un nouveau serveur où le fichier php.ini a probablement des paramètres différents - great catch @Konstantin. – Ken

0

j'eu le même problème. Parfois, c'est un problème avec le chemin.

Au lieu de:

require_once('foo.php'); 

Essayez:

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