Почему Codeigniter предполагает, что я хочу создать экземпляр класса при использовании $ this-> load? - PullRequest
2 голосов
/ 05 января 2011

В Codeigniter, когда мы используем $this->load('class_name') в контроллере, CI попытается создать экземпляр класса / модели, используя его конструктор.

Но иногда мне на самом деле не нужен экземпляр из этого класса, я просто хочу вызвать из него несколько статических функций. Кроме того, существует большое ограничение для $this->load('class_name'), оно не позволяет мне передавать параметры конструктору (если мы не расширим или не изменим базовый класс CI).

Я думаю, что функция $this->load('class_name') должна делать только require_once для файла php класса для меня, и позволить мне свободно делать вещи (создавать экземпляры / вызывать статические функции) с классом в контроллере.

Должен ли я просто игнорировать эту функцию и использовать require_once или написать свою собственную функцию __autoload для загрузки классов? Таким образом, я просто чувствую себя странно, потому что кажется, что я не пишу коды внутри окна CI.

Ответы [ 2 ]

1 голос
/ 23 августа 2012

Я считаю создание и загрузку объектов CodeIgniter очень ограниченными. Я хочу полный контроль над моим кодом и немного магии на заднем плане. Вместо этого я начал использовать Doctrine's Class Loader . Это очень легкий и по сути SPL автозагрузчик (также хорошая альтернатива). Вам не нужен весь Shebang Doctrine с ORM и всем этим, только ClassLoader. Есть некоторая конфигурация, чтобы разобраться в этом, но она творит чудеса.

С PHP 5.3 у меня теперь есть классы пространства имен в каталоге Application. Например, я создал новый класс в каталоге Tests: Application \ Tests \ SomeTest.php

Этот тест может выглядеть примерно так:

namespace Tests;

class SomeTest {
  ...
}

Я бы использовал этот класс в своем коде (контроллеры, представления, помощники), просто используя полностью определенное пространство имен (например, $test = new \Tests\SomeTest) или оператор "use" в верхней части моего кода (use \Tests\SomeTest as SomeTest).

Таким образом, я намереваюсь заменить все библиотеки и модели вариантами пространства имен OO. В этом есть много преимуществ: быстрая автозагрузка с SPL, полная поддержка IntelliSense IDE для классов / методов (CodeIgniter действительно плох для этого), ваш код более переносим для других сред или проектов.

Тем не менее, я до сих пор много использую движок CodeIgniter. Это в основном означает, что у меня есть $CI =& get_instance() в большинстве моих классов. Это все еще в стадии разработки, и я думаю, что основная причина, по которой мне нужен CI, - это доступ к базе данных. Если я смогу это учесть ... и использовать что-то вроде Dependency Injection, то мне вообще не понадобится CodeIgniter в моих классах. Я просто буду использовать его для MVC-фреймворка и иногда использовать его методы в моих контроллерах.

Я знаю, что это выходит за рамки вашего вопроса, но, надеюсь, это хоть какая-то пища - и это помогает мне получить это и в письменной форме.

1 голос
/ 05 января 2011

Вы можете передать параметры своему конструктору. См. Раздел «Передача параметров при инициализации вашего класса» в руководстве пользователя .

...