PHP的编码风格;未找到任何记录";,当需要整数时

PHP的编码风格;未找到任何记录";,当需要整数时,php,coding-style,Php,Coding Style,对于返回“未找到此类记录”的函数,PHP中的最佳返回值是什么 考虑以下问题的简化示例: function getLatestPostId() { $postId = Db::latestPostId(); return (is_null($postId)) ? null : $postId; // Is returning null the best option? } 我通常的方法是返回null,但我混合了integer和null作为函数的可能返回类型 我在别处读到的

对于返回“未找到此类记录”的函数,PHP中的最佳返回值是什么

考虑以下问题的简化示例:

function getLatestPostId()
{
    $postId = Db::latestPostId();
    return (is_null($postId)) ? null : $postId;
    // Is returning null the best option?
}
我通常的方法是返回
null
,但我混合了
integer
null
作为函数的可能返回类型

我在别处读到的相关原则:

  • 不返回混合类型(例如,如果需要布尔值,则始终返回布尔值,而不是null)
  • 如果返回数组,但未找到任何项,则返回空数组
取决于找到数据时的“预期返回类型”

  • 如果您通常返回int(用于id、counts等),bool值(exists)在第一种情况下返回null,在第二种情况下返回false,因此您可以使用类似于
    If(!result)

  • 如果通常返回数组,则返回空数组

  • 你使用什么风格其实并不重要,只要它有意义并且你坚持下去。如果它在整个应用程序中都是一致的,并且对您有效,那么就可以了

    取决于找到数据时的“预期回报类型”

  • 如果您通常返回int(用于id、counts等),bool值(exists)在第一种情况下返回null,在第二种情况下返回false,因此您可以使用类似于
    If(!result)

  • 如果通常返回数组,则返回空数组


  • 你使用什么风格其实并不重要,只要它有意义并且你坚持下去。如果它在整个应用程序中都是一致的,并且对您有效,那么就可以了

    如果没有最新的帖子,并且这不是一个有问题的状态,那么在这里返回
    null
    基本上没有什么错。返回混合类型是PHP等语言的优势之一,如果滥用它可能会导致问题,但这不是滥用

    最重要的是保持一致性:不要将标量和数组作为返回值混合使用,不要将原语和对象类型混合使用


    理论上,如果一个最新的帖子总是被认为存在,那么返回混合类型将是一种报告错误情况的机制;在这种情况下,事情开始变得不那么清晰,抛出一个异常可能是正确的。

    如果没有最新的帖子,并且这不是一个有问题的状态,那么在这里返回
    null
    从根本上说没有什么错。返回混合类型是PHP等语言的优势之一,如果滥用它可能会导致问题,但这不是滥用

    最重要的是保持一致性:不要将标量和数组作为返回值混合使用,不要将原语和对象类型混合使用


    理论上,如果一个最新的帖子总是被认为存在,那么返回混合类型将是一种报告错误情况的机制;在这种情况下,事情开始变得不那么清晰,抛出异常可能是正确的。

    实际上取决于您的应用程序。你需要身份证吗?在这种情况下,抛出一个异常。您的应用程序在没有ID的情况下能否正常运行?只需返回
    null
    并处理它。

    实际上取决于您的应用程序。你需要身份证吗?在这种情况下,抛出一个异常。您的应用程序在没有ID的情况下能否正常运行?只要返回null并处理它。

    怎么样,因为
    ==
    (检查值和类型)的发明,很多PHP自己的函数返回FALSE或预期值,不管是什么

    如果你养成了使用这种结构的习惯,一切都会好起来

    $x = function();
    if ( $x === FALSE ) {
        // error situation
    } else {
        // all is well proceed
    }
    
    当然,更好的方法是使用异常
    throw
    catch
    。然后,在错误情况下返回的数据类型是标准的,即异常对象

    function getLatestPostId()
    {
        $postId = Db::latestPostId();
        if (is_null($postId))  {
            throw new Exception('PostId is not available');
        }
        return $postId;
    }
    
    .... 
    
    try {
        $x = getLatestPostId();
        // code when postid is available goes here
    }
    catch Exception($e) {
        // when posyId is not available do this
    }
    

    既然
    ==
    (检查值和类型)的发明,很多PHP自己的函数返回
    FALSE
    或预期值,不管是什么

    如果你养成了使用这种结构的习惯,一切都会好起来

    $x = function();
    if ( $x === FALSE ) {
        // error situation
    } else {
        // all is well proceed
    }
    
    当然,更好的方法是使用异常
    throw
    catch
    。然后,在错误情况下返回的数据类型是标准的,即异常对象

    function getLatestPostId()
    {
        $postId = Db::latestPostId();
        if (is_null($postId))  {
            throw new Exception('PostId is not available');
        }
        return $postId;
    }
    
    .... 
    
    try {
        $x = getLatestPostId();
        // code when postid is available goes here
    }
    catch Exception($e) {
        // when posyId is not available do this
    }
    

    不混合返回值是一个很好的原则,但php本身并不坚持这一点。这更像是一个一般的编程原则,对于其他编程语言,如C和Java,这是一个严格的原则。例如,在Java中,一个函数(或方法,就像在那里调用的那样)只能返回一种变量类型,函数封装外形看起来像这样强制它(注意方法名称前面的
    int
    ,它定义了预期的返回值):

    如果你想告诉打电话的人什么也没找到(通过发出警告,或者如果你想更严格一些,说这是一个错误),你必须抛出一个异常

    Php与其他编程语言有点不同,因为它对变量类型非常灵活。在示例中,请查看以下php代码:

    $my_var = 12; // now i'm an integer
    $my_var = 12 .' is a number'; // now i'm a string
    
    没有做任何事情,变量突然变成了字符串。如果您想在Java中执行同样的操作,则必须执行以下操作:

    int myInteger = 12;
    String myString = myInteger + " is a number";
    
    如您所见,您必须声明另一个变量。这是因为Java在内存中为整数保留了一定的空间,整数有最小和最大大小。但是,字符串(不是基本数据类型)实际上可以有任何大小。Php为您处理所有这些,因此您不必担心它,也不必事先告诉您的变量包含什么样的值

    现在看一些php函数。在示例中,函数
    date
    返回字符串,如果出现错误,则返回布尔值
    false
    explode
    返回数组或布尔值
    falsefunction getLatestPostId() {
        // try to fetch the post id
        if($no_post_id_found) {
            throw new Exception('No last post id found...');
        }
    
        // all set, return the id!
        return $last_post_id;
    }
    
    try {
        $post_id = getLatestPostId();
    } catch (Exception $e) {
        echo 'Something went wrong: '. $e->getMessage();
    }