我不确定这实际上是你应该如何设计的。听起来您应该从保存数据的类中抽象出常用方法(也许您想使用DataMapper
?)。但是,如果您认为这种ActiveRecord
带有继承的模式是有意义的,我认为您正在寻求做这样的事情?
abstract class Base
{
public function add($data)
{
$something = do_stuff($this->getId($data));
}
abstract protected function getId($data);
}
class Derived extends Base
{
private $idKey = 'DerivedKey';
protected function getId($data)
{
return $data[$this->idKey];
}
}
http://php.net/manual/en/language.oop5.abstract.php
在您的情况下,您将拥有通用方法(CRUD),但调用抽象受保护方法来获取特定内容。
这是Template Method Pattern
http://en.wikipedia.org/wiki/Template_method_pattern
编辑:如果您认为您可能有添加额外列/元数据/等的类,那么您可以尝试另一件事。
abstract class Base
{
public function add($data)
{
$something = array();
$something[] = do_stuff($this->getId($data));
$something[] = do_stuff($this->getName($data));
$something[] = $this->additionalFields($data);
}
abstract protected function getId($data);
abstract protected function getName($data);
protected function additionalFields($data)
{
// no additional fields by default
}
}
class Derived extends Base
{
private $idKey = 'DerivedKey';
private $nameKey = 'DerivedName';
private $other = 'new thing';
protected function getId($data)
{
return $data[$this->idKey];
}
protected function getName($data)
{
return $data[$this->nameKey];
}
protected function additionalFields($data)
{
return do_foo($this->other, $data);
}
}
请记住,这些都是向您展示 OOP 模式的人为设计的示例。我假设getId
例如可能更复杂。如果你有一些一直遵循这种模式的东西,一个更好的设计可能就是:
class Base
{
protected $metadata = array(
'id' => 'defaultId',
'name' => 'defaultName'
);
public function add($data)
{
foreach ($metadata as $key => $value) {
do_something($key, $data[$value]);
}
}
}
class Derived extends Base
{
public function __construct()
{
$this->metadata['id'] = 'DIfferentId';
}
}
同样,这只是一种您可以适应您的需求的模式。