PHP:如果一个变量空白,如何将变量分配给两个字符串之一?

Gre*_*ham 6 php string boolean compare variable-assignment

我想知道为什么这不能分配一个字符串$separator:

$separator = $options['title-separator'] || ' | ';
Run Code Online (Sandbox Code Playgroud)

在其他地方,$ option已分配给某些文本或空字符串.(实际上,在我的现实生活中,它是一些文字或错误,但无论如何......).$ separator是TRUE而不是字符串.

以下内容实现了我想要的,但似乎不必要地冗长:

$separator = ( $s = $options['title-separator'] ) ? $s : ' | ';
Run Code Online (Sandbox Code Playgroud)

我来自JavaScript,这两个例子都有相同的结果,这对我来说是合乎逻辑的.为了理解这一点,我需要了解哪些PHP?现在,我只是被每个地方使用的数百个额外字符所困扰.:) 谢谢!

The*_*ail 5

在PHP 5.3 coalesce函数上看到这个?::

PHP的合并功能?

所以你可以写:

$separator = $options['title-separator'] ?: ' | ';
Run Code Online (Sandbox Code Playgroud)

编辑:正如KingCrunch所说,你会得到这个通知:

Notice: Undefined index: ...
Run Code Online (Sandbox Code Playgroud)

,但仅限于您已配置系统.

在我们的PHP代码库中,我们coalesce(...)定义了一个自定义函数,它返回第一个isset()返回true的替代函数.


Kin*_*nch 5

第一

$seperator = isset($options['title-seperator'])
  ? $options['title-separator']
  : ' | ';
Run Code Online (Sandbox Code Playgroud)

不是动词,它只是想要它告诉你的完整.但是,使用PHP5.3,您可以使用快捷方式

$seperator = $options['title-seperator'] ?: ' | ';
Run Code Online (Sandbox Code Playgroud)

但是你会得到很多关于未定义索引键的注意事项.我建议留下第一个例子.

另一个(在我看来)更清洁的解决方案是引入默认值.而不是使用"按原样"选项将它们与预定义值的数组合并

$defaults = array(
  'title-separator' => ' | '
);
$options = array_merge ($defaults, $options);
Run Code Online (Sandbox Code Playgroud)

现在您不需要关心它,并且您在一个地方拥有所有默认值,而不是分散在您的代码中.


小智 5

PHP 7 引入了 Null Coalescing 运算符,您可以在其中使用

$first_name = $_POST['f_name'] ?? 'no data found';
Run Code Online (Sandbox Code Playgroud)