__autoload($ class)不工作?找不到类错误

时间:2011-03-15 01:24:26

标签: php class object autoload

我正在关注PRO PHP AND JQUERY一书中的一些例子,但出于某种原因,这些例子不起作用。即使我从书籍网站下载的示例也不起作用。不确定什么是错的,因为我完全按照书中所做的那样......

/public/Index.php

include_once '../sys/core/init.inc.php';
$cal = new Calendar($dbo, "2010-01-01 12:00:00"); //ERROR Class 'Calendar' not found

/sys/core/init.inc.php

    function __autoload($class)
    {
        $filename = "../sys/class/class." . $class . ".inc.php";
        if ( file_exists($filename) )
        {
            include_once $filename;
        }
    }

/sys/class/class.calendar.inc.php

class Calendar extends DB_Connect
{
    private $_useDate;
    private $_m;
    private $_y;
    private $_daysInMonth;
    private $_startDay;

    /**
     * Create a database containg relevant info
     *
     * @param object $dbo a database object
     * @param string $useDate the date to build calender
     */

    public function __construct($dbo=NULL, $useDate=NULL)
    {
        /*
         * Call the parent constructor to check db object 
         */
        parent::__construct($dbo); 
    }


}

这非常令人讨厌,因为书中的每一章都建立在这个简单的基础之上。我的猜测是__autoload()是问题所在,但我不知道......

3 个答案:

答案 0 :(得分:3)

文件路径没有指向正确的位置。

Index.php ...

中,更好的想法是这样的
define('DOCROOT', dirname(__FILE__));

...然后像这样修改你的__autoload() ......

function __autoload($class)
{
    $filename = DOCROOT . "/sys/class/class." . strtolower($class) . ".inc.php";
    if ( file_exists($filename) )
    {
        include_once $filename;
    }
}

在包含文件名之前,您应strotlower(),因为您的课程为Calendar,但您的文件名为calendar

答案 1 :(得分:1)

首先,根据官方文件,你不鼓励在新代码中使用__autoload(),因为它可能在未来被删除或删除;相反,像这样使用spl_autoload_register():

//first define a custom function
function myAutoLoader( $className ){

    $path = strtolower( path/to/your/class/ . $className . '.php' );

    include_once( $path );

}

注意我们如何strtolower()$ className。这是为了确保类名(通常以大写字母开头)与文件名一致(通常全部为小写)。在某些环境(尤其是Windows)中,这可能不是必需的,而只是为了更安全。例如,我不必在我的开发环境中使用Windows,但我的生产环境(debian)不会接受它。

然后将该函数名称作为参数传递给spl_autoload_regsiter。请注意,函数名称是字符串

 //Now use spl_autoload_register()
spl_autoload_register( 'myAutoLoader' );

如果您希望捕获异常,您可以在自定义函数中执行以下操作:

//first define a custom function with exception handling
function myAutoLoader( $className ){

    $path = strtolower( path/to/your/class/ . $className . '.php' );

    include_once( $path );

    if( !class_exists( $className, false ) ){
       throw new RuntimeException( 'Class '. $className . ' has not been         
       loaded yet' ); 
    }
}

//then the spl_autoload_register(), just like before
spl_autoload_register( 'myAutoLoader' );

然后,在声明你的课程时,你必须抓住抛出的异常。

答案 2 :(得分:0)

我使用'替换"时出现此类型错误,如果使用",则不会出现此错误:

正确的写作:

function __autoload($class) {

    echo HOME_INC."/$class.class.php";

    if(is_file(HOME_INC."/$class.class.php")){

        include_once HOME_INC."/$class.class.php";
    }elseif(is_file(ADMIN_INC."/$class.class.php")){

        include_once ADMIN_INC."/$class.class.php";
    }
}

错误的写作:

function __autoload($class) {

    echo HOME_INC.'/$class.class.php';

    if(is_file(HOME_INC.'/$class.class.php')){

        include_once HOME_INC.'/$class.class.php';
    }elseif(is_file(ADMIN_INC.'/$class.class.php')){

        include_once ADMIN_INC.'/$class.class.php';
    }
}