Класс не найден PHP ООП

Я не могу заставить это работать.

<?php


        function __autoload($classname){
            include 'inc/classes/' . $classname . '.class.php';
        }



__autoload("queries")

$travel = new queries();
echo $travel->getPar("price");

?>

А это файл inc/classes/queries.class.php.

<?

 class queries {

        function getPar($par, $table='travel', $type='select') {

            $result = $db->query("
             $type *
             FROM $table
             WHERE
             $par LIKE
            ");
            while ($row = $result->fetch_assoc()) {

                return "
                 $row[$par]
                ";
            }

    }
}

?>

Он возвращает «Запросы класса не найдены». Что с этим не так?

РЕДАКТИРОВАТЬ:

Неустранимая ошибка: невозможно повторно объявить __autoload() (ранее объявленный в /index.php:5) в /index.php в строке 5.

Какого черта? Я не могу повторно объявить функцию, которая уже объявлена ​​в отдельной строке, почему?


person djpredator17    schedule 07.07.2012    source источник
comment
Пожалуйста, не загрязняйте свой вопрос бессмысленным содержанием, чтобы обойти слишком много кода, недостаточное ограничение прозы.   -  person Michael Berkowski    schedule 07.07.2012
comment
@Майкл Ну, что еще делать? Ограничение может иметь смысл в целом, но в данном случае оно не позволило задать априорно действительный вопрос.   -  person Konrad Rudolph    schedule 07.07.2012
comment
Я уже отредактировал это, я не беспокоюсь об этом :)   -  person djpredator17    schedule 07.07.2012
comment
@djpredator17: настроен ли ваш php с short_open_tag = on< /а>?   -  person DCoder    schedule 07.07.2012


Ответы (3)


Вместо этой ужасной мерзости вы должны научиться использовать spl_autoload_register()< /а>:

spl_autoload_register( function( $classname ){

    $filename = 'inc/classes/' . $classname . '.class.php';

    if ( !file_exists( $filename) ){
        throw new Exception("Could not load class '$classname'.". 
                            "File '$filename' was not found !");
    }

    require $filename;

});

И вы должны зарегистрировать автозагрузчик в вашем файле index.php или bootstrap.php и сделать это только один раз для каждого загрузчика (эта возможность позволяет вам определить несколько загрузчиков, но это используется, когда у вас есть сторонняя библиотека, у которой есть собственный автозагрузчик .. как в случае Свифтмейлер).

P.S. пожалуйста, научитесь использовать подготовленные операторы с MySQLi или PDO.

Обновить

Поскольку вы только сейчас изучаете ООП, вот несколько вещей, которые могут вам пригодиться:

Лекции:

Книги:

person tereško    schedule 07.07.2012
comment
Я только начал с ООП, готовые операторы будут чуть позже, но на самом деле спасибо за предложение :) - person djpredator17; 07.07.2012
comment
@djpredator17, добавил несколько ссылок, которые могут вам помочь - person tereško; 07.07.2012
comment
Если бы я мог проголосовать за ваш пост, я бы сделал это как минимум дважды :) ты так много! - person djpredator17; 08.07.2012
comment
Я забыл добавить одну строку: руководство по использованию PDO. Из того, что мне кажется, большинство руководств по PDO довольно ужасны и заполнены ошибками/вводимым кодом. - person tereško; 08.07.2012

Попробуйте так (без автозагрузки класса):

function __autoload($classname){
    include_once 'inc/classes/' . $classname . '.class.php';
}
$travel = new queries();

См. также эту ссылку.

person yAnTar    schedule 07.07.2012
comment
Я сделал, как вы предложили, но мы вернулись к классовым запросам, не найденным. - person djpredator17; 07.07.2012
comment
Я предлагаю функцию __autoload, но вы используете функцию load и делаете так в функции __autoload - var_dump($classname) - возможно проблемы с путями. - person yAnTar; 07.07.2012
comment
Неустранимая ошибка: невозможно повторно объявить запросы класса в inc/classes/queries.class.php в строке 4. Это строка, в которой я объявляю это в первый раз (второго раза нет...) - person djpredator17; 07.07.2012
comment
Не используйте call __autoload(queries) и вместо этого используйте include_once - person yAnTar; 07.07.2012
comment
Даже если я просто include_once файл (правильно), он не распознает класс. - person djpredator17; 07.07.2012
comment
Вы удалили строку __autoload(queries)? - person yAnTar; 07.07.2012
comment
давайте продолжим это обсуждение в чате - person yAnTar; 07.07.2012

удалите эту строку из своего кода __autoload("queries"), вам не нужно вызывать автозагрузчик, он будет вызываться сам по себе всякий раз, когда он встречает любой необъявленный класс, и используйте require_once вместо включения и отладки, если ваши пути верны или нет.

person Rupesh Patel    schedule 07.07.2012