类实例化失败

时间:2009-01-21 14:19:01

标签: php oop class

如果在实例化期间给出了无效参数,我在使对象优雅地失败时遇到一些问题。我觉得这是一个小语法的东西,我只需要新鲜的眼睛。任何帮助都非常感谢。

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
}

这会从上面输出我,但继续进入else块,执行我打算用有效对象做的事情。

有人能看到我在那里做错的事吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

我在这段代码中看到了几个问题。

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

    $ myBib = new bib(); 如果($ myBib-> validate_bibid( '612e436')) {..do stuff ..}

    (或类似的东西)

    请记住__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)) {

答案 1 :(得分:1)

您无法在PHP中的构造函数中返回 - 该对象仍然正常创建。

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

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

或者在构造函数中抛出异常并使用try catch而不是if语句。

答案 2 :(得分:0)

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