2011-02-09 13 views
0

Я использую библиотеку, Zend Framework в этом и есть путьЗагрузка нескольких версий одной и той же библиотеки

ZendFramework-1.10.8/library/Zend/

я загрузить его в index.php

realpath(CENTRAL_LIBS_PATH . '/ZendFramework-1.10.8/library'), // /Zend left out

и поэтому может назвать один из классов класса с Zend_Form_

Теперь, на мой вопрос, как я могу использовать mult несколько версий одной и той же библиотеки. Я предполагаю, что бы загрузить оба из index.php в

realpath(CENTRAL_LIBS_PATH . '/ZendFramework-1.10.8/library'), 
realpath(CENTRAL_LIBS_PATH . '/ZendFramework-2.0.0/library') 

но потом, когда я звоню класс как Zend_Form, как я явно сказать ему, чтобы использовать один из v1.10.8 или один из v2.0.0 ? Я помню, где-то читал, что если 2 библиотеки имеют один и тот же класс, то указанная выше библиотека называется. Но как я могу переключаться между 2 по желанию? Можно ли это сделать в том же проекте?

+3

Есть ли какая-то особая причина, по которой вы хотите использовать несколько версий одной и той же библиотеки из одного сценария? –

+3

Итог: это не совсем невозможно, но это шоссе к черту уродливого кода. – Mchl

+0

Как и @Mchi, это может быть полезно, но я сделаю все возможное, чтобы избежать этого. Это звучит как кошмар, ожидающий своего служения. Как @Mark Бейкер спросил: «Почему ты хочешь это сделать? Там может быть способ избежать этого. –

ответ

2

Zend Framework 2 классы сгруппированы в пространствах имен и имеют свой автозагрузчик, который просматривает каталоги (это должно быть соотношение 1: 1 между каталогом и пространством имен).

Вам необходимо будет зарегистрировать оба автозагрузчика (вам может потребоваться перезаписать ZF 1.10, чтобы использовать автозагрузку SPL, чтобы вы могли зарегистрировать несколько автозагрузчиков. В этот момент автозагрузчики должны обрабатывать все сами, поскольку существует отличная разница в том, как ZF1 попробует загрузить Zend_Form, и ZF2 попытается загрузить Zend \ Form. Я бы, вероятно, пошел дальше и модифицировал автозагрузчик ZF1, чтобы игнорировать любой запрос, который использует истинные пространства имен PHP.

Не забывайте, что автозагрузка SPL использует FIFO метод поиска классов, поэтому, если вы намереваетесь использовать в основном классы ZF2, сначала необходимо зарегистрировать его автозагрузчик и второй ZF1, так как это даст вам достойное повышение производительности.

+1

Хотя это решение, вероятно, будет работать, я не рекомендую это делать. Существует такое разрыв между каркасом с использованием пространств имен и фреймворка, не использующим пространства имен, в которые вы собираетесь столкнуться с головными болями. –

+0

Как это работает для других библиотек вообще, если в библиотеке нет автозагрузчика. Я пытаюсь понять это в самых простых условиях. Библиотека, которая представляет собой группу классов в иерархии папок и 2 разных версии, загружается, как я описал выше. Как мне сообщить, что мой проект Zend загружает класс из одного, а не из другого (мы больше не говорим о 2 версиях Zend, всего 2 версии библиотеки в целом) – jblue

+0

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

Смежные вопросы