我正在开发一种关于帖子,评论和喜欢的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
的类将负责实例化和填充对象Post
,Comment
,Like
的属性。
我只是为了这个例子的目的而将存储库作为依赖注入,在真正的类上将注入顶级类,将存储库作为依赖。甚至最好将其提取到界面。这是一个丑陋的类,但我想保持简单,专注于属性。
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
,但它看起来与设置公共属性相同,也可能更有效。
到了这一刻,我带来了几个问题。当我在谈论属性时,我指的是Post
,Comment
,Like
对象不是Wall
类
1)还有其他任何解决方案允许类Wall
编辑这些属性但仍保持此属性的受保护可见性而不具有setter和getter?使用反射会有意义吗?
2)您认为将这些属性公开更好吗?如果是,为什么?
3)您何时确定何时适合在类中使用属性的特定可见性? (只想将我的想法与你的想法进行比较)
答案 0 :(得分:1)
1)通过使用数组来获得动态保护(或私有)值的方法。 protected $data = array();
然后,您可以在受保护的值上使用__set
和__get
方法,因为您不想使用getter和setter。即使受到保护或私密化,反射也会使您的价值可访问。
2)我个人主要使用受保护的值,在您的情况下,我会保护它们。没有其他对象应该能够更改这些值,它们属于该对象。
3)继续2.对我来说,大多数价值都受到保护。它们属于特定对象,任何想要或不显示的人都不应该更改。如果一个不同的对象想要更改或显示值,它应该通过当前保存数据的对象,并且应该告诉调用对象如何以及要做什么/显示。
我个人喜欢这篇文章:https://stackoverflow.com/a/21902271/660410它不能直接回答您的问题,但能够很好地理解三个可见性关键字。 (特别是图像)。