我目前正在开发一个小型私有项目,以便更好地熟悉PHP和OOP。基本上,我正在创建一个能够创建帖子并标记它们的小应用程序。
到目前为止,这些课程的组织方式如下:
发表
表示数据库中的帖子,并具有editPost()
,attachTag()
等功能。
代码
表示数据库中的标记,同样地,还具有editTag()
等功能。
PostUtils
这就像一个管理界面,它用于创建/删除新的帖子和标签,列表
他们等等。
现在,当我实例化一个新的Post对象时,我通过将帖子ID作为其必需参数传递来实现。当我这样做时,我希望能够先检查ID是否有效。到目前为止,我一直在使用PostUtils类(isValidID($id)
)中的方法,因此控制器可以在Post类实例化之前执行检查。但是,我一直在阅读有关Tell, Don't Ask原则的内容,在我看来,我应该在Post类本身中执行此检查。
理想情况下,我希望只有在传递有效ID时才能实例化对象。所以我的问题是,当传递无效的ID时,该类的最佳行为是什么?这有意义吗?或者我的整个架构是否需要改为开始?
非常感谢您的时间,非常感谢:)
答案 0 :(得分:3)
<?php
public class Post
{
private function __construct($id)
{
/* Private constructor... do your normal initialization here */
}
private static function isValidID($id)
{
if (/*... check if $id is valid ... */) {
return true;
}
return false;
}
public static function create($id)
{
if (!self::isValidID($id)) {
return NULL; // Or throw an exception
}
return new Post($id);
}
}
?>
然后你会使用它,比如:
<?php
$post = Post::create(1234);
if (is_null($post)) {
/* Invalid ID */
}
?>
或者如果您选择抛出异常:
<?php
try {
$post = Post::create(1234);
} catch (YourInvalidIDException $e) {
/* Invalid ID */
}
?>