属性可见性,getter和setter PHP

时间:2014-06-19 10:52:09

标签: php properties

我正在开发一种关于帖子,评论和喜欢的Php插件。所以我会 发布,评论和喜欢的对象。

这个类有很多属性来描述它自己的类,Post类的一个小例子可以。

class Post
{
    protected $infoPost;

    protected $postId;

    protected $content;

    protected $poster_type;

    protected $poster_id;

    protected $likes;

    protected $comments;

    // and more but you got the idea

    public function __construct($postId,
                                $poster_type = null,
                                $poster_id = null,
                                $content = null,
                                $likes = null,
                                $comments = null)

           $this->postId = $postId;
           $this->poster_type = $poster_type;
           $this->poster_id = $poster_id;
           $this->content = $content;
           $this->likes = $likes;
           $this->comments = $comments;

}

现在,名为Wall的类将负责实例化和填充对象PostCommentLike的属性。

我只是为了这个例子的目的而将存储库作为依赖注入,在真正的类上将注入顶级类,将存储库作为依赖。甚至最好将其提取到界面。这是一个丑陋的类,但我想保持简单,专注于属性。

class Wall
{

    protected $postRepo;

    protected $commentRepo;

    protected $likeRepo;

    protected $post;

    protected $content;

    protected $likes;

    protected $comments;

    public function __construct(PostRepository $postRepo,
                                CommentRepository $commentRepo,
                                LikeRepository $likeRepo)
    {
           $this->postRepo = $postRepo; 
           $this->commentRepo = $commentRepo;
           $this->likeRepo = $likeRepo;
    }

    // Return Post Object
    public function createPost($postId,$posterType,$posterId)
    {
       $postOrmObject = $this->postRepo->create($postId,$posterType,$posterId);
       $post = new Post($postOrmObject->id,$postOrmObject->posterType,$postOrmObject->posterId);
       $this->post = $post;
       $post->setInfoPost($postOrmObject);
       return $post;
    }

    // Return Content Object
    public function createContent($postId,array $contentInfo)
    {
       $contentOrmObject = $this->contentRepo->create($postId,$content)
       $content = new Content($contentOrmObject->postId,$contentInfo);
       $this->content = $content;

       if ($this->post instanceof Post)
       {
          // here where I change the property
          $this->post->setContent($content);
       }

       return $content;
    }

    public function getPost()
    {
       return $this->post;
    }
}

所以在这一点上我知道这些对象的属性应该是动态的,但同时受到保护,因为只有1个类有责任更改它,但是对于其他类来说,获取该属性的数据可能很有用。

好吧,好吧,此时设置getter和setter,但后来有10个属性,我来了一个十字架,在我的课上有20个方法,我也想避免这样做。

另一种方法是设置魔术方法__get__set,但它看起来与设置公共属性相同,也可能更有效。

到了这一刻,我带来了几个问题。当我在谈论属性时,我指的是PostCommentLike对象不是Wall

1)还有其他任何解决方案允许类Wall编辑这些属性但仍保持此属性的受保护可见性而不具有setter和getter?使用反射会有意义吗?

2)您认为将这些属性公开更好吗?如果是,为什么?

3)您何时确定何时适合在类中使用属​​性的特定可见性? (只想将我的想法与你的想法进行比较)

1 个答案:

答案 0 :(得分:1)

1)通过使用数组来获得动态保护(或私有)值的方法。 protected $data = array(); 然后,您可以在受保护的值上使用__set__get方法,因为您不想使用getter和setter。即使受到保护或私密化,反射也会使您的价值可访问。

2)我个人主要使用受保护的值,在您的情况下,我会保护它们。没有其他对象应该能够更改这些值,它们属于该对象。

3)继续2.对我来说,大多数价值都受到保护。它们属于特定对象,任何想要或不显示的人都不应该更改。如果一个不同的对象想要更改或显示值,它应该通过当前保存数据的对象,并且应该告诉调用对象如何以及要做什么/显示。

我个人喜欢这篇文章:https://stackoverflow.com/a/21902271/660410它不能直接回答您的问题,但能够很好地理解三个可见性关键字。 (特别是图像)。