如果我正在编写以下方法(例如),那么以下任一方法都被认为是好的做法:
答:如果文档不存在,则返回一个空字符串?
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
。
有两个流行的返回值:false
或null
PHP 的内部函数似乎出于任意原因偏爱false
,但我个人更喜欢null
,因为它更适合表示undefined
。
旁注:测试假(false
=== $x)比is_null($x)
:)稍微多一些
但是,在许多情况下,接收此返回值的代码无法对它执行任何有意义的操作;此时您可以抛出异常以跳过该代码段,就像在Java中一样;这是一种方便的错误处理流控制机制。
你会用这个返回的值做什么?这是否意味着逻辑错误、非法输入 - 或者只是一些边缘情况?
在这两种"错误"情况下,我都会坚持使用异常而不是一些边缘返回值 - 特别是因为 PHP 是弱类型语言,并且在某些(愚蠢的)编写==
表达式中混合 NULL 和 '' 太容易了。
对于边缘情况,也许我会坚持使用 FALSE
作为要返回的值。在我看来,这是一种有点破碎的方法(查看此链接以获取真正令人抓狂的示例),但至少它是 PHP 中的常见习语。
我将尝试以尽可能少的意见来回答这个基于观点的边缘问题。
从 PHP7.1 开始,可以使用"可为空的返回类型"。
没有"可伪造的返回类型"或"空字符串返回类型"这样的东西。
从 PHP8 开始,"空安全运算符"变得可用。
如果我正在创建一个返回布尔值的函数(或方法),那么它将有一个函数名称,该函数名称也指示应该期望布尔返回值(例如,以 is
、was
、has
等开头的内容),并且如果需要,调用代码始终可以安全地使用 ===
来检查其值。 我不会选择性地从这些函数返回null
。 如果有任何理由偏离布尔类型结果,那么我将抛出一个异常。
当一个函数要返回一个数组时,我也不会选择性地返回null
- 如果数组以外的任何内容是合适的,我将再次抛出异常。 空数组是一个假值,所以我不需要null
来达到这个目的。
至于字符串和对象类型返回,我绝对赞成选择性地使用 null。 区分零长度字符串和 null 可能非常有用。 我也更喜欢null
而不是空对象,因为与空数组不同,空对象是真实的。
从 PHP7 开始,"零合并运算符"变得可用。这允许使用非常简洁的语法回退到默认值。
所有这些对语言的贡献都引导PHP开发人员为了方便而倾向于空值。
当然,"混合返回类型"在 PHP8 中变得可用,但这只会打开一个已经松散/宽容的系统。 我更经常地尝试找到收紧我的项目的方法,以便它们不那么容易破裂。
file_exists
对不存在的文件返回 FALSE。
所以你可以用这种方式改变你的状况
if (false ! == $documentClass->getDir(5))
{
/* Do this */
}
替代品 : is_readable
如果文件名指定的文件或目录存在且可读,则返回 TRUE,否则返回 FALSE。
看到问题似乎是关于 OOP,那么请注意,您也可以决定为自己创建一个空对象,这个关于该模式的维基百科页面包含一个"描述",它巧合地使用目录列表器作为示例,碰巧,伙计们和女孩......