【问题标题】:PHP Dependency Injection - call injected object's methodPHP 依赖注入 - 调用注入对象的方法
【发布时间】:2023-03-12 18:46:01
【问题描述】:

我正在学习 php 中的依赖注入,我认为我缺少一些东西。

我创建了两个类,AuthorArticle

class Author{
    private $firstName;
    private $lastName;

    public function __construct($firstName, $lastName){
        $this->firstName = $firstName;
        $this->lastName  = $lastName;
    }

    public function getName(){
        return $this->firstName . " " . $this->lastName;
    }
}

class Article{
    private $author;
    private $content;

    public function __construct(Author $author, $content){
        $this->author  = $author;
        $this->content = $content;
    }

    public function getContent(){
        return $this->content;
    }
}

然后,在我的索引页面上,我实例化了我的 Article 类并注入了我的 Author 类:

require "Classes.php";
$Article = new Article( new Author("Chris", "Schmitz"), "this is the content of my article");

print_r($Article);

按预期打印出我的对象:

Article Object ( [author:Article:private] => Author Object ( [firstName:Author:private] => Chris [lastName:Author:private] => Schmitz ) [content:Article:private] => this is the content of my article ) 

这一切都说得通,但是当我从 Author 类调用公共方法 getName() 时出现错误:

echo $Article->author->getName();
// produces php error: PHP Fatal error:  Cannot access private property Article::$author

如果我将一个对象注入另一个对象,我是否应该能够访问注入对象的公共方法?我是否误解了注射的预期效果?我是不是设置错了?

【问题讨论】:

    标签: php class dependency-injection


    【解决方案1】:

    $authorArticleprivate 属性,这意味着您只能从该类中的方法访问它。

    虽然getName() 方法确实是public,但-> 链的所有部分都必须在您使用它们的上下文中可见 - 不幸的是author 不是。

    正如 Halim 所建议的,解决该错误的最简单方法是在 Article 类中为 author 属性创建一个 public getter 方法:

    public function getAuthor() {
        return $this->author;
    }
    

    【讨论】:

    • 是的,但这会破坏封装原则。添加一个简单的getAuthor() 方法会更明显,并保留类中成员的封装。
    • @HalimQarroum 非常正确。
    • @GeorgeBrighton:啊,facepalm。如果它是一条蛇,它会咬我的脸。感谢您指出这一点。
    • @HalimQarroum,只是为了确保我理解,如果我要向Article 类添加一个getAuthor() 方法,它是否只是一个返回对注入类@ 的调用的方法987654335@方法
    • @ChrisSchmitz 不;它会返回注入的对象本身——否则你将Article 耦合到Author。更不用说Author 没有getAuthor() 方法...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2023-04-09
    • 2021-08-04
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多