Php 避免实例化具有无效参数的对象

Php 避免实例化具有无效参数的对象,php,class,oop,instantiation,Php,Class,Oop,Instantiation,我目前正在开发一个小的私人项目,以便更全面地了解PHP和OOP。基本上,我正在创建一个小应用程序,可以创建帖子并标记它们 到目前为止,课程的组织方式如下: 发布 表示数据库中的帖子,并具有诸如editPost()、attachTag()等函数 标签 表示数据库中的标记,类似地,具有诸如editTag()等功能 姿势 这就像一个管理界面,用于创建/删除新帖子和标签、列表 他们等等 现在,当我实例化一个新的Post对象时,我通过传递Post ID作为它的必需参数来实现。当我这样做时,我希望能够首

我目前正在开发一个小的私人项目,以便更全面地了解PHP和OOP。基本上,我正在创建一个小应用程序,可以创建帖子并标记它们

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

  • 发布
    表示数据库中的帖子,并具有诸如
    editPost()
    attachTag()
    等函数

  • 标签
    表示数据库中的标记,类似地,具有诸如
    editTag()
    等功能

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

现在,当我实例化一个新的Post对象时,我通过传递Post ID作为它的必需参数来实现。当我这样做时,我希望能够首先检查ID是否有效。到目前为止,我一直在使用postils类(
isValidID($id)
)中的一个方法来实现这一点,这样控制器就可以在实例化Post类之前执行检查。然而,我一直在读关于这个原则的书,在我看来,我应该在Post类本身中执行这个检查

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

非常感谢您抽出时间,非常感谢:)


然后你会使用它,比如:

<?php
  $post = Post::create(1234);

  if (is_null($post)) {
    /* Invalid ID */
  }
?>

或者,如果您选择抛出异常:

<?php
  try {
    $post = Post::create(1234);
  } catch (YourInvalidIDException $e) {
    /* Invalid ID */
  }
?>


如果不希望在所需数据丢失或无效时创建对象,则应在
Post
类上创建静态工厂方法。类似于工作原理。如果我理解正确,我需要研究工厂方法设计模式。谢谢你的意见!谢谢,这对我来说很有意义@SeanBright不客气。Tbh我不确定我是否应该自己编辑这些东西,毕竟这是SOBy的wiki方面,我一直在想……如果我选择仅通过静态方法实例化对象,是否有任何方法可以防止对象以其他方式实例化(例如,
$post=new post(43)
)?谢谢对你把构造函数设置为私有的,就像我上面的例子一样。@SeanBright:哦,我明白了,我不知怎么错过了。谢谢你的澄清!
<?php
  try {
    $post = Post::create(1234);
  } catch (YourInvalidIDException $e) {
    /* Invalid ID */
  }
?>