带有php 7类型声明的
,如果提供的参数具有比预期的另一种类型,则可以使用php 7类型声明。这可以用于仅允许符号实体吗?
/**
* @param User|MyOtherEntity $entity
*/
public function serialize(TYPEHINTFORENTITY $entity)
{
$json = json_decode($this->serializer->serialize(
$entity,
'json'
), true);
return $json;
}
public function deserialize($json, string $class): TYPEHINTFORENTITY
{
$entity = $this->serializer->deserialize(
json_encode($json),
'MyBundleEntity' . $class,
'json',
DeserializationContext::create()->setGroups(
array('group')
)
);
return $entity;
}
如果我使用相同的函数来序列化不同的实体,我无法使用
public function serialize(User $entity)
因为这不允许序列化的实体。
实体从PHP的角度不是"特殊"对象。您可以通过两种方式进行此操作
- 定义一个常见的接口(可能没有任何方法(,将其typehint并让所有实体实现此
- 使用php 7.2中引入的typehint的
object
类型
使用第一个解决方案,如果有人试图传递不是该界面的实现的东西,您就可以安全。当然,您需要记住,每次在代码库中创建新实体时,都应实现该接口。
使用第二个解决方案,您并不是一个安全的,但是您仍然确定所传递的一切都不是标量或原始类型
使用第一个解决方案,您最终会写下
之类的东西interface Entity { }
class FooEntity implements Entity { }
class BarEntity implements Entity { }
...
public function serialize(Entity $entity) { }
使用第二个解决方案
public function serialize(object $entity) { }
如果您需要允许仅,则建议使用第一个解决方案代码
编辑
我已经看到了其他答案,建议扩展而不是实现接口:如果不是严格必要的话,请不要从超级阶级扩展,因为PHP类只能从一个类扩展,而它们可以实现多个接口。如果您需要第一个解决方案,则接口是要走的方法
使用在不同类型的对象上的类型提示的最佳方法是使用所有实体实现的常见接口,该接口应适用于您的函数。
例如,在您的情况下,我将使用
public function serialize(Serializable $entity)