Как создать фабрику, которая динамически расширяет класс, так что его тип изменяется, но он наследует родительские методы? - PullRequest
0 голосов
/ 05 февраля 2010

То, что я хотел бы сделать, - это иметь статическую функцию фабрики, которой вы можете дать серию атрибутов, и она возвращает объект, который был ранее необъявленным классом, который расширяет известный класс.

В основном:

<?php
class foo {
  public $a;

  function increment($b = 1){
    $this->a += $b;
  }
}

function factory($name, $a){
  //returns an object of class $name that extends foo with $this->a set to $a
}

так что если я напишу код:

<?php
$bar = factory("bar",12);
$bar->increment(5);
print_r($bar);
if(is_a($bar, "foo")){
  echo "is a Foo";
}
$moo = factory("moo", 4);
$moo->increment();
print_r($moo);
if(is_a($moo, "foo")){
  echo "is a Foo";
}

Я получаю: [править]

bar Object
(
    [a] => 17
)
is a Foo
moo Object
(
    [a] => 5
)
is a Foo

Но я не знаю, с чего начать искать команды, необходимые для этого. Я думаю, что в моей фабричной функции мне нужно как-то объявить, что значение $ name расширяет родительский класс, но не вносит в него изменений, а затем создать новое $ name. Таким образом, он имеет все функции родительского класса, просто другого типа.

1 Ответ

1 голос
/ 05 февраля 2010

Проверьте, что в API отражения PHP есть методы, которые вам нужны для извлечения и создания нового класса, но как это сделать, а затем создать его экземпляр, я не уверен. Я знаю, что это возможно, потому что я уверен, что именно так работает Mocking в PHPUnit. Возможно, вы также захотите взглянуть на различные классы, связанные с объектами Mock, в PHPUnit, чтобы получить некоторые идеи.

Тем не менее, если вы на самом деле не добавляете / не перегружаете методы, зачем вам это вообще нужно? Почему бы просто не использовать свойство в объекте или использовать интерфейс? Какова цель здесь?

...