PHP替换实体中的静态方法,最佳实践


PHP Replacing static methods in Entities, best practices

<?php
class Entity {
    /**
     * @var array|stdClass|Collection|string
     **/
    private $mixed;
    public function getMixedAsPhpArray(array $filter) {
        return EntityHelper::toPhpArray($this->mixed, $filter);
    }
}

给定上面的类,假设PHPDoc块中的任何类型都可以调用$mixed,您将如何删除对EntityHelper::toPhpArray的静态调用?(这只是我面临的一个问题的简化示例,我有一个函数要接受"脏入脏出"((我不能将它添加到实体中,因为许多实体需要这个函数,也不能用这个方法从Abstrart实体扩展,因为它们已经扩展了其他各种函数(。

我正在使用Symfony,并考虑在助手中使用DI,但用对服务容器的调用替换所有new Entity将是一个糟糕(且缓慢(的想法。另一个想法是返回脏输出并使用服务对其进行清理和过滤,但我也认为这是一个坏主意,因为它会将实体中的所有数据都带到应用程序中,然后在我认为应该一次完成的情况下再带到服务中,并删除错误(可能还有内存使用…(。

最佳解决方案将取决于您的应用程序,但您可能使用的一种方法是将您的助手代码放入一个特性中:

<?php
trait ArrayCleaner {
  public function toPhpArray($dataToFilter, $filterArray) {
     // ... your code here
  }
}
class Entity {
  use ArrayCleaner;
  /**
   * @var array|stdClass|Collection|string
   **/
  private $mixed;
  public function getMixedAsPhpArray(array $filter) {
    return $this->toPhpArray($this->mixed, $filter);
  }
}

http://php.net/manual/en/language.oop5.traits.php

好吧,你可以用一个特性来做到这一点。

trait EntityHelperTrait
{
    private function toPhpArray($value, $filter) {
        // body of method
    }
}
class Entity
{
    use EntityHelperTrait;
    /**
     * @var array|stdClass|Collection|string
     **/
    private $mixed;
    public function getMixedAsPhpArray(array $filter) {
        return $this->toPhpArray($this->mixed, $filter);
    }
}

但基于您(公认的简化(的示例,您正在混合责任。类型转换的工作,本质上就是这样,应该属于其他地方,而不是烘焙到Entity类本身中。

我认为让实体返回另一个组件的"脏"输出以过滤/clean/whatever是完全可以的。