2009-07-24 8 views
7

Ich löste diese Frage meine eigene. Der Dateiname war falsch lolz.PHP-Klasse nicht gefunden

Hallo an alle!

Ich baue ein CMS wie Drupal und Joomla. Ich arbeite an der Modul-Funktion (Plug-in), und ich bekam die folgende Fehlermeldung:

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 ist offensichtlich zuerst ausgeführt. Mit Ausnahme von customsettings.php, das Datenbankinformationen enthält, werden keine anderen Seiten davor ausgeführt. Wenn ich $ _SERVER [ "db_prefix"] in meinem obigen Code verwendet wird, ist es, weil ich ein superglobalen benötigt, die in customsettings.php gesetzt:

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 

Kann mir jemand helfen? Es scheint, dass die index-Funktion von view.php aufgerufen wird, bevor settings.php enthalten ist. Tut mir leid, wenn diese Frage riesig ist, ich möchte nur klar sein. Sagen Sie auch nicht eval() ist böse, ich weiß.

Also ich möchte wissen, warum die Einstellungen Klasse nicht gefunden werden konnte. Wenn Sie mehr Quellcode benötigen, kommentieren Sie bitte diese Frage.

+0

dumm, wie es ist, ich auch eine Namens Problem hatte. Habe die .php vergessen. – craigtadlock

Antwort

29

Obwohl Sie erwarten würden, dass die Datei "settings.php" für die Datei "view.php" verfügbar ist, weil sie in einem Skript enthalten war, das beide enthält, habe ich festgestellt, dass dies normalerweise nicht der Fall ist. Sie haben ein paar Möglichkeiten:

  • require_once alle Dateien jeder Klasse Bedürfnisse in jeder Klassendatei
  • eine __autoload() Funktion schreiben, so dass PHP alle Klassen finden kann, wenn er denkt, braucht es eine

Die zweite Option ist flexibler.

Wenn Sie Klassen wissen, sind aus einem bestimmten Ort verfügbar versuchen get_declared_classes()

+0

Sorry, auch include settings.php in view.php funktioniert nicht: S –

+0

Ich weiß was ich falsch gemacht habe. Mein Dateiname ist falsch. Lolz –

+1

+1 für print_r (get_declared_classes()) Vorschlag – billrichards

4

Nur für den Fall ausgibt jemand auf diese Frage stolpert, hatte ich auch dieses Problem und ich es gelöst, indem sichergestellt wird, dass der Name des PHP Datei war identisch mit dem Namen der PHP-Klasse in der eigentlichen Datei.

Dumm, ich weiß.

+1

Der Name der Datei ist nicht unbedingt wichtig. Das hängt möglicherweise von Ihrem Autoloader ab. – mattalxndr

+0

hmm seltsam. Danke für die Information. Ich bin mir sicher, dass dies das Problem für mich auf jeden Fall behoben hat. Ich habe Eclipse mit den Standardeinstellungen verwendet. –

0

Es gibt ein anderes Problem, das auftreten kann und es ist es wert für jeden, es zu kennen.Wenn Sie __autoload() und in der Datei verwenden, die die Klasse enthält wird automatisch geladen Sie Ihre PHP-Tags falsch schreiben, wird es eine Klasse nicht gefunden Fehler zurück:

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. Denn es arbeiten Sie kurz die Eröffnung PHP-Tag App.php mit einem langen ersetzen müssen:

<?php 

class App extends something 
{ 
    function __construct() 
    { 

    } 
} 
?> 

Es gibt viele Kommentare, die gemacht werden könnten über Short-Tags, die PHP-Version verwendet, die php.ini Datei und der Rest davon. Aber es ist irrelevant. Verwenden Sie einfach die lange Version des PHP-Tags

7

Das folgende gilt nicht im OP-Fall, aber könnte anderen helfen.

Überprüfen Sie, ob Ihr Code Short Tags <? anstelle von <?php verwendet und wenn ja, dann überprüfen Sie Ihre php.ini für short_open_tag Einstellung.

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

+0

Dies kann sehr leicht passieren, wenn Sie auf einen neuen Server wechseln, auf dem die Datei php.ini wahrscheinlich andere Einstellungen hat - toller Fang @Konstantin. – Ken

0

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

Statt:

require_once('foo.php'); 

Versuchen:

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