LINUX.ORG.RU

[php] Cannot redeclare class, а хочется...

 


0

0

Делаю последовательное подключение файлов из определённой дирректории. В каждом - один и тот же по названию класс (и интерфейс тоже один). Когда какая-то из реализаций опознает вход как свой, подключение прекращается и работаю с этим оставшимся классом.

в общих чертах всё выглядит так:

foreach ( scandir as $file ) {
    include $file;

    $a = new MyClass();

    if ( $a->check($input) ) break;

    exit ('wrong input');
}

Соответственно, умный пых думает, что я неправ и отказывается инициировать функцию, уже инициированную.

  • как сделать так, чтобы было всем хорошо?
  • может я дурак и неправильно подхожу к решению?
  • в чём смысл жизни?
★★★★★

как сделать так, чтобы было всем хорошо?

1. Использовать include_once вместо include

2. Использовать autoload (работает, когда имя файла можно определить по имени класса)

3. В подключаемом файле писать такое:

<?php
    if (!class_exists('MyClass')) :

        class MyClass {
// ...
        }

    endif;
?>

Ad arbitrium.

может я неправильно подхожу к решению?

Да. В случае подключения файлов с классами/функциями лучше использовать include_once/require_once вместо include/require.

в чём смысл жизни?

В ЖИЗНИ в буквальном смысле — СМЫСЛА НЕТ! Но если рассматривать ЖИЗНЬ как ИГРУ, то смысл сразу появляется, — ибо в игре присутствуют: интерес, азарт, предвкушение выигрыша и будущих всевозможных событий

sjinks ★★★
()
Ответ на: комментарий от sjinks

Так я тоже умею :)

Вообще, сейчас всё крутится на подобии autoload, но реализованном eval'ом.

А вот интересно, можно ли в пхп убить объявленную функцию... Или переназвать.

include_once - будет писаться warning вместо fatal'а, а в случае с require_once вообще разницы не будет (кроме типа ошибки).

helios ★★★★★
() автор топика
Ответ на: комментарий от helios

include_once - будет писаться warning вместо fatal'а

Почему? Если везде будут xxx_once, то файлы, содержащие объявления функций, будут подключаться только один раз, и ошибка Cannot redeclare xxx исчезнет. Если я правильно проблему понял.

А вот интересно, можно ли в пхп убить объявленную функцию... Или переназвать.

Можно. Есть расширения типа RunKit, ClassKit, APD. Но местами это реализовано криво, что повышает вероятность упасть от сегфолта.

sjinks ★★★
()
Ответ на: комментарий от sjinks

Можно. Есть расширения типа RunKit, ClassKit, APD. Но местами это реализовано криво, что повышает вероятность упасть от сегфолта.

Ок. остаюсь на своей реализации.

Почему? Если везде будут xxx_once, то файлы, содержащие объявления функций, будут подключаться только один раз, и ошибка Cannot redeclare xxx исчезнет. Если я правильно проблему понял.

Cannot redeclare лезет, когда мы 2 раза подключаем файлы, в которых определены одинакоые функции.

_once не даст 2 раза подключить один и тот же файл. А у меня разные файлы... (Реализующие одинаковые интерфейсы)

Да и если я падаю при подключении одного файла 2жды, то при once у меня будет лезть ошибка, что я пытаюсь подключить ещё раз (как я и сказал: warning вместо fatal'а)

helios ★★★★★
() автор топика

>может я дурак и неправильно подхожу к решению?
у тебя несколько разных классов с одинаковым названием, и ты еще спрашиваешь?
Сделай базовый класс, для каждой реализации сделай потомка. Перебирай производные классы.

iSage ★★★★
()

Решение очень дурацкое. Это плохой паттерн программирования, который приводит к запутыванию кода и усложняет поддержку и доработку программы. Зачем придумывать собственные костыли, изучите общепринятую практику построения библиотек. Один файл - один класс, каждый класс уникален в своем пакете, таким образом полное название пакет+класс представляет из себя уникальный ресурс. В яве, например, так сделано, и оттуда это перешло во многие (может, даже, все) пхп-фреймворки, потому что это простое и верное решение.

А Ваше надо переделать.

heisenberg ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.