PHP OOP场景下:子类TextDocument能否持有FileDocument对象?
问题:PHP中子类持有另一个子类的实例是否可行?
存在一个名为Document的基类,以及两个子类FileDocument和TextDocument。FileDocument类拥有fileName、fileType和blob属性;TextDocument类拥有content属性,并且可以持有一个FileDocument类的对象。
相关代码实现
Document基类
class Document{ /** * @ORM\Id * @ORM\GeneratedValue(strategy="NONE") * @ORM\Column(name="id", type="guid") */ private string $id; /** * @ORM\Column(name="type", type="string", length=20) */ private string $type; /** * @ORM\Column(name="authorName", type="string", length=20) */ private string $authorName; // getters and setters are here }
FileDocument子类
class FileDocument extends Document { /** * @ORM\Column(name="fileName", type="string", length=20) */ private string $fileName; /** * @ORM\Column(name="fileType", type="string", length=20) */ private string $fileType; /** * @ORM\Column(name="file", type="blob", length=20) */ private string $file; public function getFileName(): string { return $this->fileName; } public function setFileName(string $fileName): void { $this->fileName = $fileName; } public function getFileType(): string { return $this->fileType; } public function setFileType(string $fileType): void { $this->fileType = $fileType; } // 其他getters和setters }
TextDocument子类
class TextDocument extends Document { /** * @ORM\Column(name="content", type="text", length=20) */ private string $content; /** * @ORM\OneToOne(targetEntity=FileDocument::class) */ private FileDocument $file; public function getContent(): string { return $this->content; } public function setContent(string $content): void { $this->content = $content; } public function getFileDocument(): FileDocument { return $this->file; } public function setFileDocument(FileDocument $fileDocument): void { $this->file = $fileDocument; } // 其他getters和setters }
回答
完全可以实现这种场景,PHP对这种类间关联没有限制——只要两个类都被正确加载(比如通过Composer自动加载),子类之间完全可以建立关联关系,不管它们是否继承自同一个父类。
不过你的原始代码存在几处细节错误,需要修正才能正常运行:
Document类中$authorName属性定义末尾缺少分号;FileDocument类里的getContentType()/setContentType()方法没有对应属性,应该改为操作$fileType并修正方法名;TextDocument类的getter/setter方法存在拼写错误,方法名和属性名不匹配,需要统一为getFileDocument()/setFileDocument()并对应$file属性。
从ORM(比如Doctrine)的角度来看,TextDocument和FileDocument之间的@OneToOne关联也是完全合法的,只要ORM配置正确,就能正常完成持久化和查询操作。
内容的提问来源于stack exchange,提问作者Ibrahim EL-Sanosi
相关产品推荐
相关产品推荐

