2009-07-24 9 views
7

Tôi đã giải quyết câu hỏi này của riêng mình. Tên tập tin sai lầm lolz.Không tìm thấy lớp PHP

Xin chào mọi người!

Tôi đang xây dựng một CMS như Drupal và Joomla. Tôi đang làm việc trên các tính năng mô-đun (plug-in), và tôi đã nhận được lỗi sau:

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

Đây là mã của tôi:

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 được rõ ràng thực hiện đầu tiên. Không phải các trang khác được thực thi trước nó, ngoại trừ customsettings.php chứa thông tin cơ sở dữ liệu. Nếu tôi sử dụng $ _SERVER [ "db_prefix mà"] trong mã của tôi ở trên, đó là vì tôi cần một người superglobal mà được đặt trong 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 

thể ai giúp tôi? Có vẻ như chức năng chỉ mục của view.php được gọi trước khi bao gồm settings.php. Xin lỗi nếu câu hỏi này là rất lớn, tôi chỉ muốn được rõ ràng. Ngoài ra đừng nói eval() là ác, tôi biết.

Vì vậy, tôi muốn biết lý do tại sao các lớp cài đặt không thể tìm được. Nếu bạn cần thêm mã nguồn, vui lòng nhận xét cho câu hỏi này.

+0

ngốc như nó có, tôi cũng đã có một vấn đề đặt tên. Quên tệp .php. – craigtadlock

Trả lời

29

Mặc dù bạn mong chờ settings.php có sẵn để view.php bởi vì nó đã được bao gồm trong một kịch bản trong đó bao gồm cả hai, tôi đã phát hiện ra rằng điều này thường không phải là trường hợp. Bạn có một vài lựa chọn:

  • require_once tất cả các file mỗi lớp nhu cầu trong mỗi tập tin lớp
  • viết một chức năng __autoload() để PHP có thể tìm thấy tất cả các lớp học của bạn bất cứ khi nào nó nghĩ rằng nó cần một

Tùy chọn thứ 2 linh hoạt hơn.

Nếu bạn muốn biết lớp học có sẵn từ một địa điểm cụ thể thử xuất ra get_declared_classes()

+0

Xin lỗi, kể cả settings.php vào view.php cũng không hoạt động: S –

+0

Tôi biết mình đã làm gì sai. Tên tệp của tôi sai. Lolz –

+1

+1 cho print_r (get_declared_classes()) gợi ý – billrichards

4

Chỉ trong trường hợp ai đó tình cờ vào câu hỏi này, tôi có vấn đề này quá và tôi giải quyết nó bằng cách đảm bảo rằng tên của php tập tin giống như tên của lớp php bên trong tập tin thực tế.

Ngớ ngẩn, tôi biết.

+1

Tên của tệp không nhất thiết phải quan trọng. Điều đó có thể phụ thuộc vào bộ nạp tự động của bạn. – mattalxndr

+0

hmm lạ. Cảm ơn vì đã cho tôi biết. Tôi tích cực rằng điều này cố định vấn đề đối với tôi, trong mọi trường hợp. Tôi đã sử dụng Eclipse với bất kỳ cài đặt mặc định nào. –

0

Có một vấn đề khác có thể xảy ra và rất đáng để mọi người biết điều đó.Nếu bạn sử dụng __autoload() và trong các tập tin chứa lớp được tự động nạp thẻ bạn viết PHP của bạn không đúng cách, nó sẽ trả về một lỗi không tìm thấy lớp:

file App.php

<? 

class App extends something 
{ 
    function __construct() 
    { 

    } 
} 
?> 

chỉ số tập tin. php

<?php 

function __autoload($classname) { 

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

} 


$app = new App(); 

?> 

Mã trên không có tác dụng. Đối với nó để làm việc bạn cần phải thay thế việc mở ngắn PHP thẻ App.php với một dài một:

<?php 

class App extends something 
{ 
    function __construct() 
    { 

    } 
} 
?> 

Có rất nhiều ý kiến ​​cho rằng có thể được thực hiện về thẻ Tóm lại, phiên bản của PHP được sử dụng, php.ini và phần còn lại của nó. Nhưng nó không liên quan. Chỉ cần sử dụng phiên bản dài của thẻ PHP

7

Những điều sau đây không có hiệu lực trong trường hợp của OP nhưng có thể giúp người khác.

Kiểm tra xem mã của bạn có sử dụng các thẻ ngắn hay không <? thay vì <?php và nếu có, hãy kiểm tra cài đặt php.ini của bạn cho short_open_tag.

Theo mặc định, nó đã tắt nhưng nếu bạn kế thừa cài đặt php của bạn từ người khác ...

+0

Điều này có thể xảy ra rất dễ dàng nếu di chuyển đến một máy chủ mới, nơi tệp php.ini có thể có các cài đặt khác nhau - tuyệt vời bắt @Konstantin. – Ken

0

Tôi có cùng vấn đề. Đôi khi đó là vấn đề với đường dẫn.

Thay vì:

require_once('foo.php'); 

Hãy thử:

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