如果在实例化期间给出了无效参数,我在使对象优雅地失败时遇到一些问题。我觉得这是一个小语法的东西,我只需要新鲜的眼睛。任何帮助都非常感谢。
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块,执行我打算用有效对象做的事情。
有人能看到我在那里做错的事吗?
谢谢!
答案 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)
当然,您需要与==而不是=进行比较,这是一个赋值操作。