it-swarm.com.de

PHP Klasse nicht gefunden

Ich habe diese Frage selbst gelöst. Der Dateiname war lolz falsch.

Hallo zusammen!

Ich baue ein CMS wie Drupal und Joomla. Ich arbeite an der Modulfunktion (Plugins) und habe die folgende Fehlermeldung erhalten:

Fatal error: Class 'settings' not found in C:\wamp\www\SYSTEM\view.php on line 22

Hier ist mein 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 wird offensichtlich zuerst ausgeführt. Davor werden keine anderen Seiten ausgeführt, mit Ausnahme der Datei customettings.php, die Datenbankinformationen enthält. Wenn ich in meinem obigen Code $ _SERVER ["db_prefix"] verwendet habe, dann weil ich einen Superglobal brauchte, der in der Datei customettings.php eingestellt ist:

customettings.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

Kann mir jemand helfen? Die Indexfunktion von view.php wird anscheinend aufgerufen, bevor settings.php enthalten ist. Entschuldigung, wenn diese Frage groß ist, ich möchte nur klar sein. Sag auch nicht, dass eval () böse ist, ich weiß.

Daher möchte ich wissen, warum die Einstellungsklasse nicht gefunden wurde. Wenn Sie mehr Quellcode benötigen, kommentieren Sie diese Frage bitte.

9
user142019

Obwohl Sie erwarten würden, dass settings.php für view.php verfügbar ist, da es in einem Skript enthalten ist, das beide enthält, habe ich festgestellt, dass dies normalerweise nicht der Fall ist. Sie haben zwei Möglichkeiten:

  • require_once alle Dateien, die jede Klasse in jeder Klassendatei benötigt
  • schreiben Sie eine __autoload() -Funktion, damit PHP alle Ihre Klassen finden kann, wenn er glaubt, dass er eine benötigt

Die 2. Option ist flexibler.

Wenn Sie wissen möchten, dass Klassen an einem bestimmten Ort verfügbar sind, geben Sie Folgendes aus: get_declared_classes()

30
dnagirl

Das Folgende trifft nicht auf OP zu, kann aber anderen helfen.

Überprüfen Sie, ob Ihr Code kurze Tags verwendet: <? anstelle von <?php. Wenn ja, überprüfen Sie Ihre php.ini auf short_open_tag-Einstellungen.

Standardmäßig ist es ausgeschaltet, aber wenn Sie Ihre PHP-Installation von jemand anderem erben ...

7
Konstantin

Für den Fall, dass jemand auf diese Frage stößt, hatte ich auch dieses Problem und habe dafür gesorgt, dass der Name der PHP-Datei mit dem Namen der PHP-Klasse in der eigentlichen Datei übereinstimmt.

Dumm, ich weiß.

Ich hatte das gleiche Problem. Manchmal ist es ein Problem mit dem Pfad.

Anstatt:

require_once('foo.php');

Versuchen:

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

Es gibt ein weiteres Problem, das auftreten kann, und es lohnt sich, es zu kennen. Wenn Sie __autoload () verwenden und in die Datei, in der sich die automatisch geladene Klasse befindet, Ihre PHP -Tags falsch geschrieben haben, wird der Fehler "Klasse nicht gefunden" zurückgegeben:

Datei App.php

<?

class App extends something
{
    function __construct()
    {

    }
}
?>

datei index.php

<?php

function __autoload($classname) {

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

}


$app = new App();

?>

Der obige Code funktioniert nicht. Damit es funktioniert, müssen Sie das kurze öffnende PHP Tag App.php durch ein langes ersetzen:

<?php

class App extends something
{
    function __construct()
    {

    }
}
?>

Es gibt viele Kommentare zu kurzen Tags, der verwendeten Version von PHP, der Datei php.ini und dem Rest davon. Aber das ist irrelevant. Verwenden Sie einfach die lange Version des PHP -Tags

0
JG Estiot