an 的要点Exception
是发生了一些你无法恢复的事情。因此,它会停止执行并冒泡,直到它位于顶部 ( Error: Uncaught Exception
) 或直到它被 a 捕获并处理try/catch
。
如果您绝对想要多个错误,您可以在类中跟踪该状态:
abstract class Statefull // abstract because it makes no sense instantiating this
{
protected $isValid = true;
protected $errors = array();
protected function invalidate($field, $error) {
$this->isValid = false;
$this->errors[$field] = $error;
}
public function isValid() { return $this->isValid; }
public function getErrors() { return $this->errors; }
}
这个示例类允许每个字段出现一个错误,并且可以按如下方式进行扩展。
class Test extends Statefull
{
protected $name;
protected $description;
function setName($name) {
if (empty($name)) this->invalidate('name', 'Name is empty');
else $this->name = $name;
return $this;
}
function setDescription($description) {
if (empty($description)) this->invalidate('description', 'Description is empty');
else $this->description = $description;
return $this;
}
}
并且可以这样使用:
$test = new Test();
$test->setName('')->setDescription('');
if (!$test->isValid()) {
var_dump($test->getErrors());
die();
}
如果你有 PHP 5.4,你也可以通过以下方式解决这个问题traits
:
trait Statefull
{
protected $isValid = true;
protected $errors = array();
protected function invalidate($field, $error) {
$this->isValid = false;
$this->errors[$field] = $error;
}
public function isValid() { return $this->isValid; }
public function getErrors() { return $this->errors; }
}
然后实现将是这样的,其优点是不需要扩展类(如果您已经从不同的基类扩展您的模型):
class Test
{
use Statefull;
protected $name;
protected $description;
function setName($name) {
if (empty($name)) this->invalidate('name', 'Name is empty');
else $this->name = $name;
return $this;
}
function setDescription($description) {
if (empty($description)) this->invalidate('description', 'Description is empty');
else $this->description = $description;
return $this;
}
}
用法和以前一样。如果您这样做,请注意特征中的限制属性带来的限制:
如果一个 trait 定义了一个属性,那么一个类不能定义一个同名的属性,否则会发出错误。如果类定义兼容(相同的可见性和初始值),则为 E_STRICT,否则为致命错误。