__autoload ($ class) не работает?класс не найден ошибка - PullRequest
5 голосов
/ 15 марта 2011

Я следую некоторым примерам в книге PRO PHP AND JQUERY, но по некоторым причинам примеры не работают. Даже примеры, которые я скачал с сайта книг, не работают. Не уверен, что не так, потому что я сделал именно так, как в книге ..

/ общественного / 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 / ядро ​​/ init.inc.php

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

/ SYS / класс / 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 ]

3 голосов
/ 15 марта 2011

Пути к файлам не указывают на правильные места.

Лучшей идеей было бы что-то вроде этого в 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 голос
/ 11 февраля 2015

Прежде всего, вам не рекомендуется использовать __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' );

Если вы хотите перехватить исключение, вы можете сделать что-то подобное в своей пользовательской функции, например так:поймать выброшенное исключение при объявлении вашего класса.

0 голосов
/ 28 октября 2016

Я получил эту ошибку типа при использовании ' заменил ", если использовать ", эта ошибка отсутствует:

Правильное написание:

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';
    }
}
...