PHP 奇怪的语法 - 它叫什么?
PHP Weird Syntax - What is it called?
我一直在关注一个关于 PHP 框架的视频系列,我遇到了一个奇怪的结构。我只是想知道它叫什么,这样我就可以多读一些了。在视频中,演讲者给出了这个代码
public function edit($id = NULL)
{
$id == NULL || $this->data['user'] = $this->user_m->get($id);
...
}
他说,如果调用者没有传递id,那么$id将设置为null,如果传递了$id,用户将从数据库中检索并保存在数据数组中。
事实是,这是一个条件语句,但它不在 if 或 while 之类的语句中。我以前从没见过。我搜索了内联或 loop/if 语句之外的条件,奇怪的语法但没有成功。就像我说的,我想阅读更多关于它的信息,看看它是一个通用的 PHP 功能还是特定于框架的。
谢谢。
sytnax 称为 "short-circuit evaluation",是大多数编程语言中使用的优化技术。 ||
的右表达式仅在左表达式为假时才被计算,因为 - 否则 - 结果不依赖于右表达式的值(因为 &&
的右表达式仅判断左边是否为真)。
您可以将示例重写为 ($id == NULL) || ($this->data['user'] = $this->user_m->get($id));
以使其更清楚。仅当 $id
不是 NULL
.
时才计算赋值表达式
但是,这行代码是难以维护的代码的完美示例,因为您需要花很多时间思考它的作用...:)
为了找到这个问题的正确答案,我们必须首先说明您的函数语法中可能(我会说可能,因为我仍然不是 100% 确定)错误:
public function edit($id == NULL)
应该是:
public function edit($id = NULL)
这对于其余代码完全有意义,因为它会将 局部变量 ID 设置为 NULL(如果未设置),否则它将设置它。
就是说,剩下的,正如评论中所说,只是一个 OR 逻辑运算(好吧,不管你怎么看,我习惯将它解释为三元运算符,因为它更容易如果有人不知道它是如何工作的),我只是觉得我应该指出与许多其他语言不同的是,在 PHP 中你可以直接在逻辑运算的第二个或第三个或任何参数中评估一个变量。
简而言之,您的操作:
$id == NULL || $this->data['user'] = $this->user_m->get($id);
也可以写成:
if ($id !== null) {
$this->data['user'] = $this->user_m->get($id);
}
当然是可读的,否则你也可以这样做:
$id !== NULL && $this->data['user'] = $this->user_m->get($id);
甚至:
$this->data['user'] = $id !== NULL ? $this->user_m->get($id) : $this->data['user'];
基本的三元运算符是:
condition ? iftrue : iffalse
你的"variation"更像是一种"use"的逻辑运算,叫做短路求值,其实就是OR逻辑运算符仅当左手运算符为 FALSEY 时才计算右手运算符,因此:
$id == NULL || $this->data['user'] = $this->user_m->get($id);
$id == NULL
<-- 左手运算符
$this->data['user'] = $this->user_m->get($id)
<-- 右手运算符
采取我们上面所说的,如果 $id == NULL 是假的,(也就是说,如果 $id 不为空),那么执行右边的运算符,所以将 $this->data['user'] 设置为 $this->user_m->get($id),否则什么都不做。
我一直在关注一个关于 PHP 框架的视频系列,我遇到了一个奇怪的结构。我只是想知道它叫什么,这样我就可以多读一些了。在视频中,演讲者给出了这个代码
public function edit($id = NULL)
{
$id == NULL || $this->data['user'] = $this->user_m->get($id);
...
}
他说,如果调用者没有传递id,那么$id将设置为null,如果传递了$id,用户将从数据库中检索并保存在数据数组中。
事实是,这是一个条件语句,但它不在 if 或 while 之类的语句中。我以前从没见过。我搜索了内联或 loop/if 语句之外的条件,奇怪的语法但没有成功。就像我说的,我想阅读更多关于它的信息,看看它是一个通用的 PHP 功能还是特定于框架的。
谢谢。
sytnax 称为 "short-circuit evaluation",是大多数编程语言中使用的优化技术。 ||
的右表达式仅在左表达式为假时才被计算,因为 - 否则 - 结果不依赖于右表达式的值(因为 &&
的右表达式仅判断左边是否为真)。
您可以将示例重写为 ($id == NULL) || ($this->data['user'] = $this->user_m->get($id));
以使其更清楚。仅当 $id
不是 NULL
.
但是,这行代码是难以维护的代码的完美示例,因为您需要花很多时间思考它的作用...:)
为了找到这个问题的正确答案,我们必须首先说明您的函数语法中可能(我会说可能,因为我仍然不是 100% 确定)错误:
public function edit($id == NULL)
应该是:
public function edit($id = NULL)
这对于其余代码完全有意义,因为它会将 局部变量 ID 设置为 NULL(如果未设置),否则它将设置它。
就是说,剩下的,正如评论中所说,只是一个 OR 逻辑运算(好吧,不管你怎么看,我习惯将它解释为三元运算符,因为它更容易如果有人不知道它是如何工作的),我只是觉得我应该指出与许多其他语言不同的是,在 PHP 中你可以直接在逻辑运算的第二个或第三个或任何参数中评估一个变量。
简而言之,您的操作:
$id == NULL || $this->data['user'] = $this->user_m->get($id);
也可以写成:
if ($id !== null) {
$this->data['user'] = $this->user_m->get($id);
}
当然是可读的,否则你也可以这样做:
$id !== NULL && $this->data['user'] = $this->user_m->get($id);
甚至:
$this->data['user'] = $id !== NULL ? $this->user_m->get($id) : $this->data['user'];
基本的三元运算符是:
condition ? iftrue : iffalse
你的"variation"更像是一种"use"的逻辑运算,叫做短路求值,其实就是OR逻辑运算符仅当左手运算符为 FALSEY 时才计算右手运算符,因此:
$id == NULL || $this->data['user'] = $this->user_m->get($id);
$id == NULL
<-- 左手运算符
$this->data['user'] = $this->user_m->get($id)
<-- 右手运算符
采取我们上面所说的,如果 $id == NULL 是假的,(也就是说,如果 $id 不为空),那么执行右边的运算符,所以将 $this->data['user'] 设置为 $this->user_m->get($id),否则什么都不做。