6

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

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

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值更好,你能解释一下为什么吗?

4

6 回答 6

8

PHP 约定

返回布尔值FALSE

面向对象方法

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

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

我遵循 返回的PHP 方式false

于 2012-08-15T13:14:04.657 回答
2

你会如何处理这个返回值?这应该表示逻辑错误、非法输入 - 还是只是一些边缘情况?

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

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

于 2012-08-15T13:11:22.007 回答
1

file_exists对不存在的文件返回FALSE 。

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

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

选择 : is_readable

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

于 2012-08-15T13:12:31.580 回答
1

有两个流行的返回值:falsenull

PHP 的内部函数似乎false出于任意原因而受到青睐,但我个人更喜欢它,null因为它是代表undefined.

旁注:测试 false ( false=== $x) 比is_null($x):)输入更多

然而,在很多情况下,接收到这个返回值的代码不能用它做任何有意义的事情;这是您可以抛出异常以跳过该代码段的时候,就像在 Java 中一样;它是一种方便的错误处理流控制机制。

于 2012-08-15T13:19:54.200 回答
0

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

于 2012-08-15T14:04:39.563 回答
0

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

从 PHP7.1 开始,“可空返回类型”可用。

没有“错误的返回类型”或“空字符串返回类型”之类的东西。

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

如果我正在创建一个返回布尔值的函数(或方法),那么它将具有一个函数名,该函数名也表明应该期望布尔返回值(例如以is, was,has等开头的东西)并且调用代码总是可以安全地使用===如果需要,检查它的值。我不会选择性地null从这些函数中返回。如果有任何理由偏离布尔类型结果,那么我将抛出异常。

当一个函数要返回一个数组时,我也不会选择返回null——如果数组以外的任何东西都是合适的,我会再次抛出一个异常。一个空数组是一个错误的值,所以我不需要null为此目的。

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

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

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

诚然,“混合返回类型”在 PHP8 中变得可用,但这只会打开一个已经松散/宽容的系统。我更经常尝试寻找方法来收紧我的项目,以使它们不易损坏。

于 2022-01-24T11:45:54.840 回答