web-dev-qa-db-fra.com

PHP classe non trouvée

J'ai résolu cette question moi-même. Le nom de fichier était faux lolz.

Bonjour à tous!

Je construis un CMS comme Drupal et Joomla. Je travaille sur la fonctionnalité du module (plugins), et j'ai 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 celle-ci, à l'exception de customsettings.php qui contient des informations sur la base de données. Si j'ai utilisé $ _SERVER ["db_prefix"] dans mon code ci-dessus, c'est parce qu'il me fallait un superglobal défini 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 m'aider? Il semble que la fonction d'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 que eval () est diabolique, je le sais.

Je veux donc 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.

9
user142019

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

  • require_once tous les fichiers dont chaque classe a besoin dans chaque fichier de classe
  • écris une fonction __autoload() afin que PHP puisse trouver toutes vos classes chaque fois qu'il pense en avoir besoin

La 2ème option est plus flexible.

Si vous voulez savoir si des classes sont disponibles à partir d'un endroit particulier, essayez de générer get_declared_classes()

30
dnagirl

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

Vérifiez si votre code utilise des balises courtes <? au lieu de <?php et si c'est le cas, vérifiez votre paramètre php.ini pour short_open_tag.

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

7
Konstantin

Juste au cas où quelqu'un trébuche sur cette question, j'avais ce problème aussi et je l'ai résolu en m'assurant que le nom du fichier php était identique à celui de la classe php à l'intérieur du fichier réel.

Silly, je sais.

4

J'ai eu le même problème. Parfois, c'est un problème de chemin.

Au lieu de:

require_once('foo.php');

Essayer:

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

Un autre problème peut survenir et il vaut la peine de le savoir. Si vous utilisez __autoload () et que vous écrivez de manière incorrecte vos balises PHP dans le fichier qui contient la classe en cours de chargement automatique, le système retournera une erreur de classe introuvable

Fichier App.php

<?

class App extends something
{
    function __construct()
    {

    }
}
?>

fichier index.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 à ouverture courte par App.php par une longue:

<?php

class App extends something
{
    function __construct()
    {

    }
}
?>

De nombreux commentaires pourraient être faits sur les balises courtes, la version de PHP utilisée, le fichier php.ini et le reste. Mais ce n'est pas pertinent. Utilisez simplement la version longue de la balise PHP

0
JG Estiot