Метод класса, вызывающий другой метод класса без include / require? - PullRequest
0 голосов
/ 06 августа 2010

Понятия не имею, как сформулировать этот вопрос в поисковой системе.

Я немного запутался, как классы используют методы других классов без include / require. Я видел это в PHP пару раз. Исходя из фона C ++, мне пришлось включить все, чтобы использовать его, так что это немного сбивает с толку.

Но хорошо, мы идем:

Скажи, что у меня есть improve_db_connection.php:

class improve_db_connection
{

    protected $_connection;

    public function __construct($host, $user, $pwd, $db)
    {
        $this->_connection = @new mysqli($host, $user, $pwd, $db);
        if (mysqli_connect_error()) {
            throw new RuntimeException('Cannot access database: ' .
                mysqli_connect_error());
        }
    }

    public function getResultSet($sql)
    {
        $results = new Pos_MysqlImprovedResult($sql, $this->_connection);
        return $results;
    }
}

new Pos_MysqlImprovedResult является экземпляром класса Pos_MysqlImprovedResult, а не Impro_DB_Connection. Не объявляя функцию include для включения класса Pos_MysqlImproveResult, файл improve_db_connection.php просто знает, где находится класс.

Это потому, что Pos_MysqlImproveResult.php находится в том же каталоге, что и improve_db_connection.php?

То же самое с Zend Framework. Но файлы есть в подкаталогах и тому подобное. У меня есть класс в application/modules/SF/models, который использует другую функцию класса, которая находится в application/modules/SF/models/resources. Это из-за соглашения об именах этих классов Zend, что Zend просто анализирует эти файлы и добавляет его в php __autoload?

Ответы [ 2 ]

2 голосов
/ 08 августа 2010

Чтобы добавить объяснение Валорина, в PHP есть магический метод, который пытается найти определения классов, когда он не может найти определение класса.Для подробного объяснения перейдите сюда: http://php.net/manual/en/language.oop5.autoload.php

Суть этого:

function __autoload ($class_name) {
    // write your logic to find the class name

    // iterate over the available paths
    foreach(explode(PATH_SEPARATOR, get_include_path()) as $path) {
        // create a local variable representing the file path to the would be include file
        $file = implode(DIRECTORY_SEPARATOR, array(
            $path, "{$class_name}.class.inc",
        ));

        // If the file doesn't exist, continue, avoiding further processing
        if (!file_exists($file)) { continue; }

        // require the file, and return to avoid further processing
        require_once $file;
        return;
    }
}

// provided there's a foo.class.inc file in one of your paths ...
$Foo = new Foo;
1 голос
/ 06 августа 2010

Zend Framework использует Zend_Loader для автоматической загрузки классов, когда вы ссылаетесь на них, при условии, что он может найти их в логическом месте.

Я предполагаю, что вы запускаете скрипт на основе Zend Application, который автоматически настраивает автозагрузчик и выполняет всю тяжелую работу.Поскольку ваши файлы расположены в их логических папках, а классы имеют названия соглашений ZF, ZF найдет их и загрузит их, когда вы на них ссылаетесь.

Более подробная информация содержится в руководстве по ZF:
http://framework.zend.com/manual/en/zend.loader.html
http://framework.zend.com/manual/en/zend.application.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...