2009-07-24 30 views
7

He resuelto esta pregunta por mi cuenta. El nombre del archivo estaba equivocado lolz.Clase de PHP no encontrada

¡Hola a todos!

Estoy construyendo un CMS como Drupal y Joomla. Estoy trabajando en la función de módulo (plugins), y tengo el siguiente error:

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

Aquí está mi código:

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 se ejecutará en primer lugar, obviamente. No se ejecutan otras páginas antes, excepto customsettings.php que contiene información de la base de datos. Si usara $ _SERVER [ "db_prefix"] en mi código anterior, es porque necesitaba un superglobal que se encuentra 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 

¿Alguien puede ayudarme? Parece que se llama a la función de índice de view.php antes de que se incluya settings.php. Lo siento si esta pregunta es enorme, solo quiero ser claro. Además, no digas que eval() es malo, lo sé.

Así que quiero saber por qué la clase de configuración no se pudo encontrar. Si necesita más código fuente, por favor coméntelo a esta pregunta.

+0

estúpida como lo es, también tenía un problema de nomenclatura. Olvidé el .php. – craigtadlock

Respuesta

29

Aunque es de esperar que settings.php esté disponible para view.php porque está incluido en un script que incluye ambos, he descubierto que, por lo general, este no es el caso. Usted tiene un par de opciones:

  • require_once todos los archivos de las necesidades de cada clase en cada archivo de clase
  • escribir una función __autoload() por lo que PHP puede encontrar todas las clases cada vez que piensa que necesita una

La segunda opción es más flexible.

Si usted quiere saber las clases están disponibles en un determinado lugar intentar dar salida a get_declared_classes()

+0

Lo siento, incluso el archivo settings.php en view.php no funciona: S –

+0

Sé lo que hice mal. Mi nombre de archivo es incorrecto Lolz –

+1

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

4

Sólo en caso de que alguien se topa con esta pregunta, he tenido este problema también y lo resolví, asegurándose de que el nombre del php el archivo era el mismo que el nombre de la clase php dentro del archivo real.

tonto, lo sé.

+1

El nombre del archivo no necesariamente importa. Eso podría depender de su autocargador. – mattalxndr

+0

hmm extraño. Gracias por hacérmelo saber. Estoy seguro de que esto solucionó el problema para mí, en cualquier caso. Estaba usando Eclipse con las configuraciones predeterminadas. –

0

Hay otro problema que puede ocurrir y vale la pena que cualquiera lo sepa.Si utiliza __autoload() y en el archivo que contiene la clase de ser cargados automáticamente a escribir sus etiquetas PHP de forma incorrecta, devolverá un error de clase no encontrado:

Archivo app.php

<? 

class App extends something 
{ 
    function __construct() 
    { 

    } 
} 
?> 

índice de archivo. php

<?php 

function __autoload($classname) { 

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

} 


$app = new App(); 

?> 

El código anterior no funciona. Para que funcione es necesario sustituir la etiqueta PHP corta apertura app.php con una larga:

<?php 

class App extends something 
{ 
    function __construct() 
    { 

    } 
} 
?> 

Hay muchos comentarios que se podrían hacer sobre las etiquetas cortas, la versión de PHP se utiliza, el php.ini archivo y el resto. Pero es irrelevante. Simplemente use la versión larga de la etiqueta PHP

7

Lo siguiente no es útil en el caso de OP pero podría ayudar a otros.

Compruebe si su código usa etiquetas cortas <? en lugar de <?php y en caso afirmativo, compruebe su configuración de php.ini para short_open_tag.

Por defecto está apagado, pero si se hereda la instalación de PHP de otra persona ...

+0

Esto puede suceder muy fácilmente si se mueve a un nuevo servidor donde el archivo php.ini probablemente tenga configuraciones diferentes: excelente catch @ Konstantin. – Ken

0

tuve el mismo problema. A veces es un problema con el camino.

En lugar de:

require_once('foo.php'); 

Probar:

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