我目前正在开发一个小型私有(private)项目,以便更熟悉 PHP 和 OOP。基本上,我正在创建一个小应用程序,能够创建帖子并为其添加标签。
到目前为止,类(class)的组织方式如下:
帖子
代表数据库中的帖子,具有editPost()
、attachTag()
等函数。标签
代表数据库中的一个标签,同样有editTag()
等函数。PostUtils
这就像一个管理界面,它用于创建/删除新帖子和标签、列表 他们等等。
现在,当我实例化一个新的 Post 对象时,我通过将帖子 ID 作为其必需参数传递来实现。当我这样做时,我希望能够首先检查该 ID 是否有效。到目前为止,我一直通过使用 PostUtils 类中的方法 (isValidID($id)
) 来完成此操作,以便 Controller 可以在实例化 Post 类之前执行检查。但是,我一直在阅读有关 Tell, Don't Ask 的内容。原则,在我看来,我应该在 Post 类本身中执行此检查。
理想情况下,我希望仅在传递有效 ID 时才实例化该对象。所以我的问题是,当传递无效 ID 时,该类的最佳行为是什么?这有道理吗?或者我的整个架构是否需要从一开始就改变?
非常感谢您抽出宝贵的时间,非常感谢:)
最佳答案
<?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 */
}
?>
关于php - 避免使用无效参数实例化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23665897/