Все мы знаем, что печально известное "не может повторно объявить класс" ошибка. Там какой-либо метод должен преодолеть это и на самом деле объявить новый класс с тем же именем, или действительно ли это невозможно в PHP 5?
Может быть способ использовать какое-то непонятное расширение, но в базовом стандартном PHP, насколько я знаю, нет.
Однако вы всегда можете расширить существующий класс и - возможно, в зависимости от вашего сценария - «протащить» экземпляр этого расширенного класса в приложение, над которым вы работаете.
Как отметили Пекка и Техпристер: нет, вы не можете. Однако, если вы используете PHP> = 5.3, вы можете использовать пространства имен и конструкцию use, чтобы эффективно «повторно объявить» класс. Вот пример:
// MyClass.php
класс MyClass {
const MY_CONST = 1;
}
/ / MyNamespaceMyClass.php
пространство имен Mynamespace;
класс MyClass {
const MY_CONST = 2;
}
// example.php { {1}} require_once 'MyClass.php';
require_once 'MyNamespaceMyClass.php';
использовать Mynamespace \ MyClass как MyClass;
echo MyClass :: MY_CONST; // выводит 2
Таким образом, вы получили желаемый результат, поскольку MyClass теперь ссылается на ваш класс в пространстве имен.
Это невозможно. В зависимости от варианта использования пространства имен, такие как упомянутый jpfuentes2, могут работать на вас.
Один из способов взлома - реализовать собственный новый «оператор».
Пример:
$GLOBALS['class_map'] = array('A' => 'A');
function _new($class){
$realClass = $GLOBALS['class_map'][$class];
return new $realClass;
}
class A {}
$a = _new('A');
// change the implementation
$GLOBALS['class_map']['A'] = 'B';
$a2 = _new('A');
Другой способ - использовать runkit для повторной реализации класса.
AFAIK, повторное объявление существующих функций или классов невозможно в PHP.
Если бы вы могли сказать, что пытаетесь сделать, может быть, есть другое решение ...
По сути, вы не можете повторно объявить класс. Но если очень хотите, можете. :) Все возможно. Нужен класс, который изменяет свою структуру динамически ? Вы можете использовать магический метод __call и шаблон State.
class Example
{
var $state;
public function setImplementation($state)
{
$this->state = $state;
}
public function __call($method, $args)
{
if (method_exists($this->state, $method))
return $this->state->$method($args);
else
// error
}
}
Существует также набор инструментов PHP для динамической игры с классами: http://php.net/manual/en/book.runkit.php
Я знаю, что переопределение класса и его методов возможно в Ruby (и я бы счел это ошибкой в языковом дизайне).