Использование двух классов с одинаковым именем - PullRequest
3 голосов
/ 29 декабря 2010

У меня есть два приложения PHP, которые имеют два класса с одинаковым именем. - приложение1 с классом "Проект" - приложение 2 с классом «Проект»

Мне нужно использовать классы первого приложения во втором, но два класса с одним именем вызывают ошибку («Неустранимая ошибка PHP: Невозможно переопределить класс Project ...»).

Я не могу изменить имена классов. Я должен использовать PHP 5.2 (без пространства имен в PHP 5.2).

Есть ли решение?

Может быть:

  • используйте класс Project
  • undef этот класс (что-то вроде "unset Project", возможно ли это с PHP?)
  • включает () 2-й класс
  • используйте 2-й класс

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

Ответы [ 2 ]

6 голосов
/ 07 апреля 2012

У меня недавно была эта проблема с (смущающе) Joomla.Мне нужно было найти версии двух разных установок с одним скриптом, загрузив их два файла "version.php" и затем прочитав свойства класса.Но, конечно, они оба называются «JVersion», и из-за этого невозможно требовать () оба version.php файла.

После долгих раздумий я понял, что eval () может занять место require ().Поэтому я просто читаю содержимое файлов version.php и изменяю имена классов, затем eval () этот текст, и затем я могу получить доступ к обоим классам с разными именами.Могу поспорить, что вам нужен код.Вот что у меня получилось ...



    $v15_txt=file_get_contents($old_dir.'/libraries/joomla/version.php');
    $v15_txt=preg_replace('/class JVersion/i', 'class JVersion15', $v15_txt);
    eval('?>'.$v15_txt);
    $jvold=new JVersion15;
    $old_version = $jvold->RELEASE.'.'.$jvold->DEV_LEVEL;

    $v25_txt=file_get_contents($new_dir.'/libraries/cms/version/version.php');
    $v25_txt=preg_replace('/class JVersion/i', 'class JVersion25', $v25_txt);
    eval('?>'.$v25_txt);
    $jvnew=new JVersion25;
    $new_version = $jvnew->RELEASE.'.'.$jvnew->DEV_LEVEL;


Просто измените его, чтобы он загружал два нужных файла для ваших нужд и переименовывал их по мере необходимости.Извините, что вам пришлось ждать более года.: -)

Трудно поверить, что в PHP нет встроенной функции undeclare ($ classname).Я даже не мог решить эту проблему с помощью пространства имен, потому что для этого нужно изменить исходные два файла.Иногда тебе просто нужно думать вне рамок.

4 голосов
/ 29 декабря 2010

Стоп.

Что бы вы ни делали, это неправильно.Резервное копирование.Переоцените, что вы делаете и почему.

Если после этого вам все равно нужно это сделать.Выберите приложение и выполните поиск и замену этого имени класса в приложении.Если он хорошо спроектирован, он должен быть уникальным и простым для выполнения.

Документируйте, черт возьми, тот факт, что вы делали это в любой внешней документации, которую используете.

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