我一直在关注一个关于PHP框架的视频系列,我遇到了一个奇怪的结构。我只是想知道它叫什么,这样我就可以多读一些了。在视频中,扬声器给出了这个代码
public function edit($id = NULL)
{
$id == NULL || $this->data['user'] = $this->user_m->get($id);
...
}
他说,如果调用者没有传递id,那么$id将设置为null,如果传递了$id,则用户将从数据库中检索并保存在数据数组中。
问题是,这是一个条件语句,但它不在if或while之类的语句中。我以前从未见过。我搜索过内联或循环/if语句外的条件语法,但没有成功。正如我所说,我想了解更多关于它的信息,并了解它是一个通用的PHP特性还是特定于框架的特性。
谢谢。
sytnax被称为"短路评估",是大多数编程语言中使用的优化技术。只有当左表达式为false时,才会对||
的右表达式求值,因为否则,结果不取决于右表达式的值(因为只有当左公式为true时,才会评估&&
的右表达式(。
您可以将您的示例重写为($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
您的"变体"是一种逻辑运算的"使用",称为短路评估,事实上,OR逻辑运算符仅在左手运算符不正确时评估右手运算符,因此:
$id == NULL || $this->data['user'] = $this->user_m->get($id);
$id == NULL
<--左手操作员
$this->data['user'] = $this->user_m->get($id)
<--右侧操作员
如上所述,如果$id==NULL为false(也就是说,如果$id不为NULL(,则执行右手运算符,因此将$this->data['user']设置为$this->user_m->get($id(,否则什么都不做。