2015-10-23 49 views
1

我正在创建函数,我希望能够输出与函数内的语句是否符合的真或假有关的函数。这方面的一个例子是这样的:在函数中返回true/false以进一步解释为什么返回false的原因

function pokeme($number){ 
    if($number > 10) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

然而,一个问题,这个方法是,如果函数返回false,您将无法破译其中虚假意味着尤其是如果有什么,不止一个,如果/ else语句。

我的问题是,我该如何输出一个false加上一种方式来稍后识别那个错误是什么?

我可以做一个数组吗?

return array("false", "message pertaining to whatever"); 

然而,如果做到这一点,你不能真正做到这一点,再加上...:

if(pokeme()){ /*success*/ } else { /*there may be multiple falses for different situations... how do I distinguish what it is? */} 
+0

你应该检查在PHP中抛出和处理异常。 – sotoz

+0

您可以定义一组规则,如*“field X是一个数字,它应该> Y,如果不是,则错误消息应该是Z”*。您可以在对象数组中定义这些规则并将其应用于表单输入。您也可以下载[表单验证器](http://www.html-form-guide.com/php-form/php-form-validation.html),而不是实现这样的事情。 – GolezTrol

+0

正如sotoz所说,看看[例外](http://php.net/manual/en/language.exceptions.php)。这是你想要的吗? – FirstOne

回答

2

请注意,这里展示的想法可能并不是最好的,但一旦你掌握了它,它会变得更容易。另请阅读结束注释。

如果你想使用这样的(是真的期望和假的问题):

if(pokeme()){ /*success*/ } else { /* not needed */} 

你可以做这样的事情:

function pokeme($number){ 
    //let's say you want to return true if it's >10 and -9 to -1 
    if($number > 10){ 
     // do something 
     return true; 
    } 
    if($number < 0 && $number > -10){ 
     return true; 
    } 
    // handling multiple problems (just 2 ^^) 
    if($number < -9){ 
     throw new Exception("Invalid input. Can't use negative smaller than -9."); 
    } 

    throw new Exception('Invalid input. Expected bigger than 10.'); 
} 

两个测试:

try{ 
    echo "RESULT1 :".pokeme(-42).":"; // not shown (error in this line) 
    echo "RESULT2 :".pokeme(11).":"; // not shown 
}catch(Exception $e){ 
    echo "Error: '".$e->getMessage()."'"; // Just the message 
} 

echo "<br><br>"; 

try{ 
    echo "RESULT3 :".pokeme(11).":<br>"; // shown 
    echo "RESULT4 :".pokeme(10).":"; // not shown (error in this line) 
}catch(Exception $e){ 
    echo $e; // Full error 
} 

你可以这样使用它:

try{ 
    if(pokeme(11)){ 
     echo "VALID INPUT<br>"; 
    } 
    if(pokeme(5)){ 
     echo "I'm not seen :\\"; 
    } 
}catch(Exception $e){ 
    echo "Error: '".$e->getMessage()."'"; 
} 

结束注释:想象一下,您正在使用可能会导致错误的内置php函数。这样你必须用try..catch来处理它。

更多关于Exceptions

1

对于全自动输入验证你可以使用Symfony的形式组成的,并其Validation。 您还可以添加非常简单的约束LessThan(10)一样,在您的示例中,组件会自动将适当的错误消息写回到您的页面(以及无效的表单,例如不执行数据库插入)。 它存在很多准备使用的约束条件,您也可以创建自己的约束条件。

或者如果你想自己写所有,我建议你阅读之前OOPException handling

编辑

如果你想“收”的错误与它的消息,解决这个程序为您的代码示例(不推荐),你可以在超全局变量$ _SESSION临时数组存储此消息。我明确地说超全球变量。不要使用全局变量,并用global键注入它,这将成为long therm中非常复杂的代码。

无论如何,我的想法使用$ _SESSION。此代码的工作对我来说:

<?php 
session_start(); 

// Resetting the tmp session array on every page reload. That previous error messages are resetted. 
$_SESSION['errors'] = array(); 

function printSessionErrors() { 
    // Print errors stored in the session if some exists 
    if(array_key_exists('errors', $_SESSION)) { 
     foreach($_SESSION['errors'] as $i => $error) { 
      $success = true === $error['success'] ? 'true' : 'false'; // Only for print 
      $message = $error['message']; 
      echo "Success: $success. Message: $message <br>"; 
     } 
    } 
} 

function pokeme($number){ 
    $expected = 10; 
    $success = null; 

    if($number > $expected) 
    { 
     $success = true; 
    } 
    else 
    { 
     $_SESSION['errors'][] = array('success' => $success, 
             'message' => "Number $number is less than $expected"); 
     $success = false; 
    } 

    return $success; 
} 

pokeme(1); 
pokeme(7); 
pokeme(99); 
printSessionErrors(); 

现在依靠,如果它是一个表单POST或程序验证您添加在上面printCleanSessionErrors()session_start()后)或上的代码底部。

我得到这样的输出:

Success: false. Message: Number 1 is less than 10 
Success: false. Message: Number 7 is less than 10 

你只需要在$_SESSION['errors'][] = array ....添加到您的其他错误情况。

+0

刚刚更新了我的问题。 – Majo0od

+0

@ Majo0od我现在编辑了我的答案,因为您的更新而提供给您一个具体的解决方案。 –