我正在创建一个邮件类。如果一个函数返回false,我想停止所有函数,
打电话给班级
<?php
$mail= new mail();
$mail->from('abc@gmail.com');
$mail->to('jhon@gmail.com');
$mailsend=$mail->send();
if($mailsend){echo 'mail send';}else{echo 'not send';}
?>
班级
<?php
class mail{
public function from($email){
/*
* email validation
* if not valid return false and stop then send and other functions
*/
}
public function to(){
}
public function send(){
}
}
?>
答案 0 :(得分:3)
考虑使用Exceptions
。
将代码包裹在try..catch
块中,并在发现问题时抛出Exception
。
像这样:
class mail {
public function from($addr) {
if(not valid addr) throw new Exception("Invalid from address");
}
...
}
try
{
$mail = new mail();
$mail->from("invalid email address");
$mail->to("to@example.com");
$mail->send();
}
catch(Exception $e)
{
echo "Email not sent: " . $e->getMessage()."\n";
}
这样,一旦from()
发现了一个无效的地址,它就会抛出异常,执行将在那时停止并在catch
块内继续
答案 1 :(得分:0)
将all组合成一个发送功能
class mail{
public function send($to,$from){
//do the mailing
if(!emailIsValid())
return false;
//and so on
//if all is fine ..validation etc
return true;
}
}
然后像这样称呼它
<?php
$mail= new mail();
if($mail->send('abc@gmail.com','jhon@gmail.com')){echo 'mail send';}else{echo 'not send';}
?>
答案 2 :(得分:0)
解决此问题的一种方法是链接方法调用。为此,除了最后一个send()
之外,类中的每个方法都应返回实例本身。之前的每个方法仅用于设置数据,然后send()
方法将触发验证。
所以你的电话看起来像......
$mail = new Mail();
$mail->to('abc@gmail.com')
->from('xyz@gmail.com')
->send();
你的班级看起来像:
class Mail {
protected $to = null;
protected $from = null;
public function to($email)
{
// You should filter here
$this->to = $email;
return $this;
}
public function from($email)
{
// You should filter here
$this->from = $email;
return $this;
}
public function send()
{
// Validate
if ($this->validate())
{
// Sending logic
}
else
{
// Return or show error
}
}
public function validate()
{
// Verify email values are valid
}
}
因为它被整齐地打包为一个单独的调用链,所以你可以在链中返回错误或者像其他人所建议的那样抛出异常。
答案 3 :(得分:0)
在您的班级中创建一个(私人)变量valid
:
class mail{
private $valid;
public function from($email){
//validation
$valid = false||true; //the return value
}
public function to(){
}
public function send(){
if ($valid) {
//send mail
return true
} else {
return false;
}
}
}
这不是最佳方式,但这种方式与您的版本最相似