【问题标题】:Class Instantiation Fails类实例化失败
【发布时间】:2009-01-21 14:19:01
【问题描述】:

如果在实例化过程中给出了无效参数,我在让我的对象正常失败时遇到一些问题。我有一种感觉,这是我需要重新审视的地方的一个小语法。任何帮助都将不胜感激。

class bib {
   protected $bibid;
   public function __construct($new_bibid) {
      if(!$this->bibid = $this->validate_bibid($new_bibid)) {
        echo 'me';
        return false;
      }
      //carry on with other stuff if valid bibid
    }

    private static function validate_bibid($test_bibid) {
       //call this method every time you get a bibid from the user
       if(!is_int($test_bibid)) {
            return false;
       }
       return (int)$test_bibid;
    }
 }

请注意,我在那里有一个“echo me”行来证明它实际上是返回 false。我在我的 PHP 中调用它的方式如下:

if(!$bib=new bib('612e436')) {
    echo 'Error Message';
} else {
    //do what I intend to do with the object
}

这会从上面输出 me,然后继续进入 else 块,执行我打算对有效对象执行的操作。

谁能发现我在里面做错了什么?

谢谢!

【问题讨论】:

  • 在构造函数的第一行发现另一个问题

标签: php oop class


【解决方案1】:

我发现这段代码有几个问题。

  • 首先,我认为你想做这样的事情:

    $myBib=新围兜(); if($myBib->validate_bibid('612e436')) { ..做事.. }

    (或类似的东西)

    记住 __construct 不是一个普通的方法。它是一个构造函数,它不应该返回任何东西。它已经隐式返回对您创建的新实例的引用。

  • 其次,您的 validate_bibid 返回布尔值或整数。你不会立即遇到问题,但我个人不喜欢这种风格。

  • 第三,你已经声明了一个受保护的成员 $bibid,但你没有在任何地方设置或引用它。例如,我希望它在构造函数中设置。之后,您可以直接调用 validate_bibid 而无需任何参数。

这段代码显然会让您感到困惑,因为它有一些奇怪的结构,因此不会以正常方式运行。我建议重新考虑并从头开始重写这篇文章。

更新:

另一个问题:

我不认为这条线和你想的一样:

 if(!$this->bibid = $this->validate_bibid($new_bibid)) {

你可能是这个意思:

 if(!$this->bibid == $this->validate_bibid($new_bibid)) {

 // Or even better:

 if($this->bibid <> $this->validate_bibid($new_bibid)) {

【讨论】:

  • 感谢您的评论。该构造将 $bibid 设置为返回的经过验证的 bibid,因此使用它。此外,该构造执行大量数据库访问以获取围兜的其他属性,这就是我尝试一步验证和实例化所有属性的原因。我肯定会考虑第 2 点。
【解决方案2】:

您不能在 PHP 中的构造函数中返回 - 对象仍照常创建。

你可以使用工厂或类似的东西;

if(!$bib = Bib_Factory::loadValidBib('612e436')){
    echo 'Error Message';
} else {
    //do what I intend to do with the object
}

或者在构造函数中抛出异常,使用 try catch 代替 if 语句。

【讨论】:

  • 拥有一个名为 'valid' 的属性会被认为是不好的形式,然后只需执行以下操作: $bib = new bib('612e436'); if($bib->isValid()) {//做事}
  • 我真的看不出它有什么问题,但是如果所有 isValid 方法正在检查传递给构造函数的 var 是一个整数,那么我会在构造函数并抛出异常。但归根结底,这是一个品味问题。
【解决方案3】:

当然,您需要与 == 进行比较,而不是 = 这是一个赋值操作。

【讨论】:

  • 我将返回的、经过验证的 int 分配给 bibid。如果验证失败,则返回 false,不满足 if 条件。
猜你喜欢
  • 1970-01-01
  • 2022-12-03
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 2014-12-11
  • 1970-01-01
相关资源
最近更新 更多