我正在使用traits实现Symfony应用程序中的一些可标记行为,使用Doctrine2进行持久化,并使用注释来配置。主要的烦恼是,在trait中,我的IDE不知道$this->tags的类型,并且会弹出一堆警告。我非常在意在此处记录我的代码,以便其他开发人员可以轻松地使用。
据我所知,我的问题在于我无法在trait中定义$tags属性,因为我需要覆盖注释。我可以避免在TaggableMethods中完全定义$tags,但对我来说,这会破坏封装性,或者至少使代码变得更难阅读。我可以使用Yaml或XML配置持久性,但是我所有其他实体都使用注释。因此,我正在寻找一种避免生成运行时通知的方法,Symfony将其转换为ContextErrorException,在开发过程中终止我的脚本。这可能与“我们可以使用特征来映射Doctrine2中的ManyToOne关系吗?”和“特征-与父类的属性冲突”有关。
此外, "PHP 5.4: why can classes override trait methods with a different signature?" 中提到的继承方法的行为与我想要的属性非常接近 - 有人能解释为什么存在属性和方法之间的差异吗?
trait TaggableMethods {
/** @var \Doctrine\Common\Collections\Collection */
protected $tags; // <-- Can't seem to define here…
public function addTag(Tag $tag) {
$this->tags->add($tag);
}
public function removeTag(Tag $tag) {
$this->tags->removeElement($tag);
}
public function getTags() {
return $this->tags;
}
}
class TaggableThingA {
use TaggableMethods;
/**
* @var \Doctrine\Common\Collections\Collection
* @ORM\ManyToMany(targetEntity="Tag")
* @ORM\JoinTable(name="ThingA__Tag")
*/
protected $tags; // <--… because PHP complains about this
}
class TaggableThingB {
use TaggableMethods;
/**
* @var \Doctrine\Common\Collections\Collection
* @ORM\ManyToMany(targetEntity="Tag")
* @ORM\JoinTable(name="ThingB__Tag")
*/
protected $tags;
}
据我所知,我的问题在于我无法在trait中定义$tags属性,因为我需要覆盖注释。我可以避免在TaggableMethods中完全定义$tags,但对我来说,这会破坏封装性,或者至少使代码变得更难阅读。我可以使用Yaml或XML配置持久性,但是我所有其他实体都使用注释。因此,我正在寻找一种避免生成运行时通知的方法,Symfony将其转换为ContextErrorException,在开发过程中终止我的脚本。这可能与“我们可以使用特征来映射Doctrine2中的ManyToOne关系吗?”和“特征-与父类的属性冲突”有关。
此外, "PHP 5.4: why can classes override trait methods with a different signature?" 中提到的继承方法的行为与我想要的属性非常接近 - 有人能解释为什么存在属性和方法之间的差异吗?