PHP奇怪的语法 - 它叫什么?

时间:2015-07-04 08:38:13

标签: php syntax content-management-system conditional

我一直关注一个关于PHP框架的视频系列,我遇到了一个奇怪的构造。我只是想知道它叫什么,所以我可以再读一遍。在视频中,发言者提供此代码

public function edit($id = NULL)
{
   $id == NULL || $this->data['user'] = $this->user_m->get($id);
   ...
}

他说,如果调用者没有传递id,那么$ id将设置为null,如果传递了$ id,则将从数据库中检索用户并将其保存在数据数组中。

事情是,这是一个条件语句,但它不在if或while或类似的内容中。我以前从未见过这个。我搜索了内联或在循环/ if语句之外的条件,奇怪的语法没有成功。就像我说的,我想了解更多关于它的信息,并找出它是一般的PHP特性还是特定于框架的。

感谢。

2 个答案:

答案 0 :(得分:6)

sytnax被称为"短路评估"并且是大多数编程语言中使用的优化技术。只有当左表达式为假时,才会计算||的正确表达式,因为 - 否则 - 结果不依赖于右表达式的值(因为&&的正确表达式只是评估左边的是否为真。)

您可以将示例重写为($id == NULL) || ($this->data['user'] = $this->user_m->get($id));以使其更清晰。仅当$id不是NULL时,才会评估分配表达式。

但是,这行代码是一个很难维护的代码的完美示例,因为你需要花很多时间思考它的作用...... :)

答案 1 :(得分:1)

要为这个问题创建正确的答案,我们必须首先说可能(我可能会说,因为我仍然不能100%确定)函数语法中的错误:

public function edit($id == NULL)

应该是:

public function edit($id = NULL)

对于其余的代码,这是完全有意义的,因为如果没有设置它会将局部变量ID 设置为NULL,否则它将设置它。

那就是说,其余的,正如评论中所说,只是一个逻辑运算(很好,看到你想要的任何方式,我用它来解释它作为一个三元运算符,因为它&#39如果有人不知道它是如何工作的话,那就更容易了,我只是觉得我应该指出与许多其他语言不同,在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逻辑运算符仅在左手操作符号为FALSEY时评估右手操作符,因此:

$id == NULL || $this->data['user'] = $this->user_m->get($id);

$id == NULL< - 左手操作员

$this->data['user'] = $this->user_m->get($id)< - 右手操作员

按照我们上面所说的,如果$ id == NULL是假的,(也就是说,如果$ id不为null),则执行右手操作符,所以设置$ this-&gt ;数据['用户']到$ this-> user_m-> get($ id),否则什么都不做。