返回空字符串或空值是否有更多优势


Are there more advantages to returning an empty string or null value?

如果我正在编写以下方法(例如),那么以下任一方法都被认为是好的做法:

答:如果文档不存在,则返回一个空字符串?

B:返回一个null值?

在做了很多 Java 和 Java 中需要返回类型的方法之后,我的印象是返回一致的类型是最佳实践,PHP 中也是如此,还是返回null值更好?

DocumentClass
{
    public function getDir($documentId)
    {
        /* Code to get location of document  */
        return (file_exists($document) ? $document : '');
    }
}
if (!empty($documentClass->getDir(5))
{
    /* Do this */
}

如果返回一个null值更好,你能解释一下为什么吗?

PHP 约定

返回布尔FALSE

OOP approch

引发异常。此外,您应该使用仅返回布尔值(真或假)的方法dir_exitsts(或您喜欢的任何其他名称)。并在调用getDir之前使用它

对此确实没有具体的规则。这完全取决于你。

我遵循PHP的方式,它正在返回false

有两个流行的返回值:falsenull

PHP 的内部函数似乎出于任意原因偏爱false,但我个人更喜欢null,因为它更适合表示undefined

旁注:测试假(false=== $x)比is_null($x) :)稍微多一些

但是,在许多情况下,接收此返回值的代码无法对它执行任何有意义的操作;此时您可以抛出异常以跳过该代码段,就像在Java中一样;这是一种方便的错误处理流控制机制。

你会用这个返回的值做什么?这是否意味着逻辑错误、非法输入 - 或者只是一些边缘情况?

在这两种"错误"情况下,我都会坚持使用异常而不是一些边缘返回值 - 特别是因为 PHP 是弱类型语言,并且在某些(愚蠢的)编写==表达式中混合 NULL 和 '' 太容易了。

对于边缘情况,也许我会坚持使用 FALSE 作为要返回的值。在我看来,这是一种有点破碎的方法(查看此链接以获取真正令人抓狂的示例),但至少它是 PHP 中的常见习语。

我将尝试以尽可能少的意见来回答这个基于观点的边缘问题。

从 PHP7.1 开始,可以使用"可为空的返回类型"。

没有"可伪造的返回类型"或"空字符串返回类型"这样的东西。

从 PHP8 开始,"空安全运算符"变得可用。

如果我正在创建一个返回布尔值的函数(或方法),那么它将有一个函数名称,该函数名称也指示应该期望布尔返回值(例如,以 iswashas 等开头的内容),并且如果需要,调用代码始终可以安全地使用 === 来检查其值。 我不会选择性地从这些函数返回null。 如果有任何理由偏离布尔类型结果,那么我将抛出一个异常。

当一个函数要返回一个数组时,我也不会选择性地返回null - 如果数组以外的任何内容是合适的,我将再次抛出异常。 空数组是一个假值,所以我不需要null来达到这个目的。

至于字符串和对象类型返回,我绝对赞成选择性地使用 null。 区分零长度字符串和 null 可能非常有用。 我也更喜欢null而不是空对象,因为与空数组不同,空对象是真实的。

从 PHP7 开始,"零合并运算符"变得可用。这允许使用非常简洁的语法回退到默认值。

所有这些对语言的贡献都引导PHP开发人员为了方便而倾向于空值。

当然,"混合返回类型"在 PHP8 中变得可用,但这只会打开一个已经松散/宽容的系统。 我更经常地尝试找到收紧我的项目的方法,以便它们不那么容易破裂。

file_exists对不存在的文件返回 FALSE

所以你可以用这种方式改变你的状况

if (false ! == $documentClass->getDir(5))
{
    /* Do this */
}

替代品 : is_readable

如果文件名指定的文件或目录存在且可读,则返回 TRUE,否则返回 FALSE

看到问题似乎是关于 OOP,那么请注意,您也可以决定为自己创建一个空对象,这个关于该模式的维基百科页面包含一个"描述",它巧合地使用目录列表器作为示例,碰巧,伙计们和女孩......