Динамическое поколение дочерних классов - PHP - PullRequest
0 голосов
/ 22 сентября 2009

У меня есть абстрактный класс «объект», который обеспечивает базовую функциональность CRUD наряду с проверкой и т. Д. Обычно я бы использовал магическую функцию __autoload ($ name) для загрузки класса, который существовал бы в его собственном файле, названном так же, как класс я хочу ленивый груз. Код будет выглядеть примерно так, что, как вы можете себе представить, становится довольно повторяющимся.

final class bicycle extends object {
    public function __construct($id=null) {
      parent::__construct($id, __CLASS__);
    }
    public function __toString() {
      return($this->name);
    }
}

Мой вопрос заключается в том, могу ли я каким-то образом динамически генерировать эти классы на лету, чтобы мне не приходилось создавать одну и ту же функциональность снова и снова - таким образом, уменьшая накладные расходы и время проектирования. Поддерживает ли PHP5 это или я просто переоцениваю мощь OO PHP?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 22 сентября 2009

Вместо того, чтобы вставлять это в копию, почему бы вам не поместить код методов __construct и __toString в определение вашего object класса?

Что-то вроде этого должно сделать:

class object {
    public function __construct($id = null) {
        $this->name = get_class($this);
    }
    public function __toString() {
      return($this->name);
    }
    protected $name;
}

final class bicycle extends object {

}

И, называя это:

$a = new bicycle();
var_dump($a);

Вы получаете:

object(bicycle)[1]
  protected 'name' => string 'bicycle' (length=7)

Что означает экземпляр класса bicycle с именем property в правильном значении.

Нет необходимости копировать и вставлять любой код - кроме определения самого класса bicycle.


В качестве идентификатора, если вы действительно хотите генерировать класс динамически, вы можете использовать что-то вроде этого:

$code = 'final class bicycle extends object {}';
eval($code);

Вам просто нужно создать переменную $code динамически.

Но Я бы настоятельно рекомендовал против этого :

  • у вас не будет помощника по коду в вашей IDE, так как он не может видеть класс
  • у вас не будет phpdoc для вашего класса (по той же причине)
  • всегда есть " eval is evil " - и это вполне верно, по крайней мере, в этой ситуации.
  • использование "new bicycle" без объявления класса кажется неправильным!
  • должно быть некоторое влияние на производительность с использованием eval

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

0 голосов
/ 22 сентября 2009

Эта функциональность не существует в PHP5. Он может быть доступен в PHP6, но поскольку пока нет пакета для Ubuntu, я не буду продолжать.

0 голосов
/ 22 сентября 2009

Ну, для __toString вы просто помещаете его в родительский класс. Пример следует:

class BaseObject {
    public function __toString() {
        return $this->name;
    }
}

class bicycle extends BaseObject {
}

$b = new bicycle();
$b->name = 'foo';
echo $b;

Я не совсем уверен, что вы пытаетесь сделать, переопределив конструктор для передачи в CLASS .

...