Там какой-либо путь состоит в том, чтобы повторно объявить класс безопасно в PHP?

Все мы знаем, что печально известное "не может повторно объявить класс" ошибка. Там какой-либо метод должен преодолеть это и на самом деле объявить новый класс с тем же именем, или действительно ли это невозможно в PHP 5?

9
задан Charles 24 December 2012 в 23:10
поделиться

5 ответов

Может быть способ использовать какое-то непонятное расширение, но в базовом стандартном PHP, насколько я знаю, нет.

Однако вы всегда можете расширить существующий класс и - возможно, в зависимости от вашего сценария - «протащить» экземпляр этого расширенного класса в приложение, над которым вы работаете.

5
ответ дан 4 December 2019 в 08:51
поделиться

Как отметили Пекка и Техпристер: нет, вы не можете. Однако, если вы используете 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 теперь ссылается на ваш класс в пространстве имен.

14
ответ дан 4 December 2019 в 08:51
поделиться

Это невозможно. В зависимости от варианта использования пространства имен, такие как упомянутый 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 для повторной реализации класса.

2
ответ дан 4 December 2019 в 08:51
поделиться

AFAIK, повторное объявление существующих функций или классов невозможно в PHP.

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

1
ответ дан 4 December 2019 в 08:51
поделиться

По сути, вы не можете повторно объявить класс. Но если очень хотите, можете. :) Все возможно. Нужен класс, который изменяет свою структуру динамически ? Вы можете использовать магический метод __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 (и я бы счел это ошибкой в ​​языковом дизайне).

0
ответ дан 4 December 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: