Есть ли хитрость для динамического переопределения класса в PHP? - PullRequest
2 голосов
/ 11 марта 2010

У меня есть два класса с именем test в двух разных файлах, например, a.php и b.php, логика такая:

include('a.php');
$a = new test();
if($somcondition_is_met)
{
    include('b.php');
    $b = new test();
}

Есть какой-то трюк, которого следует избегать Fatal error: Cannot redeclare class?

Ответы [ 4 ]

2 голосов
/ 11 марта 2010
1 голос
/ 11 марта 2010

С "стандартным" PHP нет, вы не можете делать такие вещи.


Тем не менее, глядя на PECL и руководство, можно было бы использовать расширение classkit - но оно помечено как " не поддерживается " и не имеет был обновлен с 2004 года ... Так что я бы определенно не использовал его.

Цитирование страницы PECL этого расширения:

ВНИМАНИЕ: Этот пакет был прекращено . Пожалуйста, обратитесь к пакет runkit, который полностью до н.э. с Classkit и содержит дополнительные функциональность.


Итак, давайте посмотрим на расширение runkit , которое может помочь, особенно функция runkit_import может вас заинтересовать ( цитирование) :

Аналогично include() однако любой код, находящийся вне функции или класс просто игнорируется. Дополнительно, в зависимости от значения флагов, любые функции или классы, которые уже существуют в текущем запущенном среда будет автоматически перезаписано их новым определения.

Тем не менее, обратите внимание, что официально (глядя на PECL страницу ) расширение runkit не обновлялось с 2006 года ... Что тоже не является хорошим знаком .. Особенно, если речь идет о поддержке PHP 5.3 ...

1 голос
/ 11 марта 2010

classkit_import () выглядит так, как будто он делает именно то, что вы хотите

http://www.php.net/manual/en/function.classkit-import.php

Из ссылки:

Пример # 1 пример classkit_import ()

newclass.php

<?php
class Example {
    function foo() {
        return "bar!\n";
    }
}
?>

main.php

<?php
// requires newclass.php (see above)
class Example {
    function foo() {
        return "foo!\n";
    }
}

$e = new Example();

// output original
echo $e->foo();

// import replacement method
classkit_import('newclass.php');

// output imported
echo $e->foo();

?>

Приведенный выше пример выведет: Foo! бар!

0 голосов
/ 11 марта 2010

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

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

Проверьте документ для получения более подробной информации об интерфейсах. http://php.net/manual/en/language.oop5.interfaces.php

...