2009-01-21 78 views
1

如果在实例化过程中给出无效参数,我会遇到一些问题让我的对象正常失败。我有一种感觉,这是一个小语法的东西,我只是需要新鲜的眼睛。任何帮助都不胜感激。类实例化失败

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; 
    } 
} 

请注意,我有一个'回声我'行在那里证明它实际上是返回false。说我在我的PHP调用此方式如下:

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

这从上面输出我,但然后继续进入else块,做什么,我打算用一个有效的对象做。

任何人都可以发现我在那里做错了什么吗?

谢谢!

+0

在构造函数的第一行发现了另一个问题 – 2009-01-21 15:21:41

回答

1

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

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

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

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

+0

将一个名为'valid'的属性视为不良形式,然后执行如下操作: $ bib = new bib('612e436'); if($ bib-> isValid()){// do stuff} – 2009-01-21 14:30:41

+0

我真的没有看到它的问题,但亲自如果所有的isValid方法正在做的是检查传递给构造函数的var是一个整数,那么我会在构造函数中执行检查并抛出一个异常。但这是一天结束时的品味问题。 – Simon 2009-01-21 14:35:47

2

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

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

    $ myBib =新围兜(); 如果($ myBib-> validate_bibid( '612e436')){ 东西..do ..}

    (或类似的东西)

    记得__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)) { 
+0

感谢您的评论。该构造设置$ bibid与返回的验证bibid,所以它被使用。此外,该构造会执行大量的数据库访问来获取其他属性,这就是为什么我试图验证并实例化所有步骤。我一定会考虑第2点。 – 2009-01-21 15:02:22

0

当然,您需要与==进行比较代替=这是一个分配操作。