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

标签 php class oop instantiation

我目前正在开发一个小型私有(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/

相关文章:

php - Centos 7 - Php56w - 和一些 php 模块问题

php - 如何从 EXIF 获取相机序列号?

php - Laravel 4 路由 - 如果不满足条件则能够跳过路由

Java 编程验证 (GUI)

java - 从 PHP 访问 Java 应用程序

php - 检查一个类的实例是否存在,如果不存在则创建一个实例

JavaScript : make a new safe class constructor

python - 如何在Python中的子方法中访问从父类获得的init变量?

javascript - new 与 Object.create() 之间的真正区别是什么

java - 使用类添加 View 的预期类或包