2009-07-24 16 views
7

मैंने इस प्रश्न को स्वयं हल किया। फ़ाइल नाम गलत लॉज था।PHP वर्ग नहीं मिला

सभी को नमस्कार!

मैं ड्रूपल और जूमला जैसे सीएमएस का निर्माण कर रहा हूं। मैं (प्लगइन्स) मॉड्यूल सुविधा पर काम कर रहा हूँ, और मैं निम्नलिखित त्रुटि मिली:

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

यहाँ मेरी कोड है:

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 स्पष्ट रूप से पहले मार डाला जाता है। डेटाबेस जानकारी वाले customsettings.php को छोड़कर, इसके अलावा अन्य पृष्ठ निष्पादित नहीं किए जाते हैं। अगर मैं $ _SERVER इस्तेमाल किया [ "db_prefix"] ऊपर मेरी कोड में, यह क्योंकि मैं एक superglobal जो 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 

किसी को भी मेरी मदद कर सकते हैं? ऐसा लगता है कि view.php के इंडेक्स फ़ंक्शन को सेटिंग्स.php शामिल करने से पहले बुलाया जाता है। क्षमा करें अगर यह सवाल बड़ा है, तो मैं बस स्पष्ट होना चाहता हूं। यह भी मत कहो eval() बुराई है, मुझे पता है।

तो मैं जानना चाहता हूं कि सेटिंग्स वर्ग क्यों नहीं मिला। अगर आपको अधिक स्रोत कोड चाहिए, तो कृपया इस प्रश्न पर टिप्पणी करें।

+0

बेवकूफ के रूप में यह है, मैं भी एक नामकरण का मुद्दा था। .php भूल गए। – craigtadlock

उत्तर

29

हालांकि आप settings.php को view.php पर उपलब्ध होने की अपेक्षा करेंगे क्योंकि इसे एक स्क्रिप्ट में शामिल किया गया था जिसमें दोनों शामिल हैं, मुझे पता चला है कि यह आमतौर पर मामला नहीं है। ताकि पीएचपी जब भी यह सोचता है कि यह एक की जरूरत है अपने सभी वर्गों पा सकते हैं

  • एक __autoload() समारोह लिखने

    • require_once सभी फाइलों को प्रत्येक वर्ग फ़ाइल में प्रत्येक वर्ग की जरूरत है: आप विकल्पों की एक जोड़ी

      दूसरा विकल्प अधिक लचीला है।

      आप वर्गों को पता है get_declared_classes()

  • +0

    क्षमा करें, view.php में settings.php भी शामिल नहीं है: एस –

    +0

    मुझे पता है कि मैंने क्या गलत किया है। मेरा फ़ाइल नाम गलत है। Print_r के लिए लॉल्ज़ –

    +1

    +1 (get_declared_classes()) सुझाव – billrichards

    4

    शायद ज़रुरत पड़े किसी को इस सवाल पर ठोकर outputting कोशिश चाहते हैं कि किसी विशेष स्थान से उपलब्ध हैं, तो मैं इस समस्या को भी था और मुझे यकीन है कि बनाने के द्वारा इसे हल है कि php के नाम फ़ाइल वास्तविक फ़ाइल के अंदर PHP वर्ग के नाम के समान थी।

    मूर्ख, मुझे पता है।

    +1

    फ़ाइल का नाम आवश्यक नहीं है। यह आपके ऑटोलोडर पर निर्भर हो सकता है। – mattalxndr

    +0

    हम्म अजीब। मुझे बताने के लिए धन्यवाद। मैं सकारात्मक हूं कि इसने किसी भी मामले में मेरे लिए समस्या तय की है। मैं एक्लिप्स का उपयोग कर रहा था जो डिफ़ॉल्ट सेटिंग्स हैं। –

    0

    एक और समस्या है जो हो सकती है और किसी के भी इसे जानना उचित है।

    फ़ाइल App.php

    <? 
    
    class App extends something 
    { 
        function __construct() 
        { 
    
        } 
    } 
    ?> 
    

    फ़ाइल सूचकांक: आप __autoload() और फ़ाइल उस वर्ग autoloaded जा रहा है आप अपने PHP टैग गलत तरीके से लिख रखती में उपयोग करते हैं, यह एक वर्ग नहीं मिला त्रुटि लौटाएगा। PHP

    <?php 
    
    function __autoload($classname) { 
    
        $filename = "./classes/". $classname .".php"; 
        print("Loading $filename<br>\n"); 
        include_once($filename); 
    
    } 
    
    
    $app = new App(); 
    
    ?> 
    

    उपरोक्त कोड काम नहीं करता है। php.ini

    <?php 
    
    class App extends something 
    { 
        function __construct() 
        { 
    
        } 
    } 
    ?> 
    

    कई टिप्पणी है कि छोटे टैग के बारे में बनाया जा सकता है कर रहे हैं, पीएचपी के संस्करण का उपयोग किया, यह आप एक लंबे एक के साथ कम उद्घाटन पीएचपी टैग App.php प्रतिस्थापित करने की आवश्यकता काम करने के लिए फ़ाइल और बाकी के बाकी। लेकिन यह अप्रासंगिक है। बस PHP टैग

    7

    के लंबे संस्करण का उपयोग करें निम्नलिखित ओपी के मामले में एप नहीं है लेकिन दूसरों की मदद कर सकता है।

    जांचें कि आपका कोड <?php के बजाय <? संक्षिप्त टैग का उपयोग करता है और यदि हां, तो short_open_tag सेटिंग के लिए अपनी php.ini देखें।

    डिफ़ॉल्ट रूप से यह बंद है, लेकिन यदि आप किसी और से अपने php स्थापना ... वारिस

    +0

    यह एक नए सर्वर पर जाने पर बहुत आसानी से हो सकता है जहां php.ini फ़ाइल की अलग-अलग सेटिंग्स होती हैं - महान पकड़ @ कॉन्स्टेंटिन। – Ken

    0

    मैं एक ही मुद्दा था। कभी-कभी यह पथ के साथ समस्या है।

    बजाय

    :

    require_once('foo.php'); 
    

    प्रयास करें:

    define('__ROOT__', dirname(dirname(__FILE__))); 
    require_once(__ROOT__ . '/your-dir-name/foo.php'); 
    
    संबंधित मुद्दे