0

我一直担心通过字符串引用它们来调用方法。

基本上在我当前的场景中,我使用静态数据映射器方法来创建并返回一组数据模型对象(例如 SomeDataMapper::getAll(1234))。模型遵循 Active Record 设计模式。在某些情况下,可能会返回数百条记录,我不想一次将所有内容都放入内存。所以,我使用一个迭代器来翻阅记录,如下

$Iterator = new DataMapperIterator('SomeDataMapper', 'getAll', array(1234));

while ($Iterator->hasNext()) {
  $data = $Iterator->next();
}

这是这样做的好方法吗?将映射器类的名称和方法作为字符串传递是一个坏主意吗?我担心这个想法不能移植到其他语言。对于像 Ruby 和 Python 这样的语言来说,这通常是正确的吗?如果是这样,任何人都可以推荐一个好的替代品吗?

仅供参考,为了将来的人们参考,我将这种方法称为:

$method = new ReflectionMethod($className, $methodName);
$returnValue = $method->invokeArgs(null, $parameters);
4

3 回答 3

3

这本质上是工厂模式的一个版本——使用字符串创建对象实例。

但是,我质疑使用迭代器来控制数据分页的设计理念——这并不是迭代器的真正目的。除非我们只是名字混乱,但我可能更喜欢看到这样的东西。

$pager = new DataMapperPager( 'SomeDataMapper', 'someMethod', array(1234) );
$pager->setPageNum( 1 );
$pager->setPageSize( 10 );
$rows = $pager->getResults();

foreach ( $rows as $row )
{
   // whatever
}

当然,DataMapperPager::getResults() 可以返回一个迭代器或任何你想要的。

于 2009-07-01T17:43:40.393 回答
1

这是一种可接受的方式。Python 和 Ruby 都支持它,因此应该是可移植的。Python 可以像 PHP 一样简单地做到这一点,但是 Ruby 有更多的功能。至少在 Python 中,当您引用的特定类尚未导入或尚未在文件中看到时(即该类在您尝试引用它的同一文件中的较低位置)时,它很有用。

从 Ruby 中的字符串获取类对象:http: //infovore.org/archives/2006/08/02/getting-a-class-object-in-ruby-from-a-string- contains-that-c​​lasses-姓名/

于 2009-07-01T17:23:41.667 回答
1

PHP 并不真正支持任何其他方式的函数传递。PHP 中的所有动态方法调用函数都采用他们所谓的“回调”——有关相关文档,请参见http://us.php.net/manual/en/language.pseudo-types.php#language.types.callback 。正如您将看到的,它们只是具有不同使用模式的字符串或字符串数​​组,因此您离我们不远了。

然而,有一些设计模式可以解决这个问题。例如,您可以定义所有映射器类都必须实现的 DataMapper 接口。然后,您可以将映射器实例传递给迭代器,而不是将类和方法作为字符串传递,并且由于它需要接口,因此可以直接调用接口方法。

伪代码:

interface DataMapper
{
   public function mapData($data);
}

class DataMapperIterator ...
{
  public function __construct(DataMapper $mapper, ...)
  {
   ...
  }
  ...
  public function next()
  {
    ... now we can call the method explicitly because of interface ...
    $this->mapper->mapData($data);
  }
}

class DataMapperImplemenation implements DataMapper
{
  ...
  public function mapData($data)
  {
    ...
  }
 ...
}

使用传入的字符串按名称调用方法并不可怕,可能只有性能损失,因为生成的字节码不能被优化 - 总会有符号查找 - 但我怀疑你会注意到这一点。

于 2009-07-01T17:24:22.087 回答