Перегрузка статических свойств с помощью PHP - PullRequest
1 голос
/ 11 января 2011

Я пытаюсь автоматизировать процесс доступа к библиотекам в рамках, которую я использую (CodeIgniter), но сталкиваюсь с некоторыми проблемами.

В настоящее время Codeigniter загружает библиотеки следующим образом:

$this->CI->load->library('name');
$this->CI->name->method();

Излишне говорить, что это целая куча кода для чего-то, чего можно достичь с гораздо меньшими затратами.

Я бы хотел получить доступ к моей библиотеке следующим образом:

_Lib::name->method();

_LibЗатем класс позаботится о загрузке нужной библиотеки (или направит загрузку этой библиотеки в класс загрузчика в этом случае).

Однако приведенный выше код приводит к ошибке «неожиданный T_OBJECT_OPERATOR».

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

Есть идеи?Помня о том, что он должен выглядеть максимально удобным и понятным.

Я бы хотел избежать использования чего-то вроде _Lib ('name') -> method (), так как писать это довольно утомительнокаждый раз.

Редактировать:

В итоге я создал библиотеку по умолчанию, из которой я расширяю свои библиотеки, библиотека по умолчанию имеет свойства, которые управляют загрузкой других библиотек (или модели, или помощники, или ... и т. д.) для соответствующего загрузчика, так что я могу сделать

$this->lib->name->method();

Спасибо всем за ваши ответы

Ответы [ 2 ]

2 голосов
/ 11 января 2011

Как вы написали, _Lib :: name является константой класса. Вы имели в виду _Lib::$name->method();?

2 голосов
/ 11 января 2011

«Неожиданная T_OBJECT_OPERATOR» ошибка означает, что ваш вызов _Lib::name не возвратил объект, из которого можно связать вызов метода.Технически, _Lib::name возвращает значение константы класса name в _Lib.Вы пытаетесь сделать

class _Lib
{
    const name;
}
_Lib::name->method();

, но константа не может содержать объект, поэтому нет ->.

Вы не хотите преобразовывать свою библиотеку в статические вызовы, , потому чточто-нибудь статичное вписывается в глобальную сферу и гораздо труднее проверить .Просто продолжайте использовать то, что предлагает CI "из коробки".

Если вы хотите иметь один класс для глобального управления вашими другими классами, рассмотрите возможность использования Inpendency Injection Container как тот, который предлагается в Symfony Components .

...