<?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是完全可以的。