避免使用无效参数实例化对象

时间:2014-05-14 21:59:06

标签: php class oop instantiation

我目前正在开发一个小型私有项目,以便更好地熟悉PHP和OOP。基本上,我正在创建一个能够创建帖子并标记它们的小应用程序。

到目前为止,这些课程的组织方式如下:

  • 发表
    表示数据库中的帖子,并具有editPost()attachTag()等功能。

  • 代码
    表示数据库中的标记,同样地,还具有editTag()等功能。

  • PostUtils
    这就像一个管理界面,它用于创建/删除新的帖子和标签,列表 他们等等。

现在,当我实例化一个新的Post对象时,我通过将帖子ID作为其必需参数传递来实现。当我这样做时,我希望能够先检查ID是否有效。到目前为止,我一直在使用PostUtils类(isValidID($id))中的方法,因此控制器可以在Post类实例化之前执行检查。但是,我一直在阅读有关Tell, Don't Ask原则的内容,在我看来,我应该在Post类本身中执行此检查。

理想情况下,我希望只有在传递有效ID时才能实例化对象。所以我的问题是,当传递无效的ID时,该类的最佳行为是什么?这有意义吗?或者我的整个架构是否需要改为开始?

非常感谢您的时间,非常感谢:)

1 个答案:

答案 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 */
  }
?>