【问题标题】:PHP Weird Syntax - What is it called?PHP 奇怪的语法 - 它叫什么?
【发布时间】:2015-07-04 08:38:12
【问题描述】:

我一直在关注一个关于 PHP 框架的视频系列,我遇到了一个奇怪的结构。我只是想知道它叫什么,这样我就可以多读一些了。在视频中,演讲者给出了这个代码

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

他说,如果调用者没有传递id,那么$id就会被设置为null,如果传递了一个$id,就会从数据库中取出用户并保存在数据数组中。

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

谢谢。

【问题讨论】:

  • 这是一个三元运算符。仅此而已,右手评测虽然不是那么受欢迎,但我个人不喜欢它。据我所知,它与:$id !== NULL && $this->data['user'] = $this->user_m->get($id); 完全相同,或者更易读:$this->data['user'] = $id == NULL ? $this->user_m->get($id) : $this->data['user']; 简而言之,它基本上说“如果 id 不为空(或者更准确地说,如果 $id == null 是b>falsey),然后将 this->data['user'] 设置为 this->user_m->get($id),否则保持 $id 为空并继续。
  • @b0s3:不,只是猜测,我已经习惯了这些,唯一困扰我的是传递给函数的参数,我假设它是 $id = null 而不是 id == null , 否则它甚至不应该编译,对吧?
  • 贴出的源码中没有使用三元运算符...
  • 不,现在不涉及三元运算符... OR 显然是二元运算符。
  • @briosheje:一元 = 单个参数,二元 = 两个参数,三元 = 三个参数...我的陈述没有任何矛盾。

标签: php syntax content-management-system conditional


【解决方案1】:

sytnax 被称为“短路评估”,是大多数编程语言中使用的一种优化技术。 || 的右表达式仅在左表达式为假时计算,因为 - 否则 - 结果不依赖于右表达式的值(因为 && 的右表达式仅在左表达式一个是真的)。​​

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

但是,这行代码是难以维护的代码的完美示例,因为您需要花费大量时间思考它的作用...... :)

【讨论】:

  • 那么,它实际上几乎就像三元运算符的简写?我同意你关于很难维持的观点。我能理解它的作用,只是我不知道它可以那样做。
【解决方案2】:

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

public function edit($id == NULL)

应该是:

public function edit($id = NULL)

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

也就是说,其余的,正如 cmets 中所说,只是一个 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 逻辑运算符仅在 LEFT 时才评估右手运算符HAND ONE 是 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-> data['user'] 到 $this->user_m->get($id),否则什么都不做。

【讨论】:

  • 不是三元运算符。它是布尔值or
  • 我已经提供了许多对同一件事的解释,但是好吧,好吧,假设它只是一个布尔值或,让我们看看是否更清楚地说它是一个布尔值或只是一个可以解释为一种简写 if。我认为最好指出 $id == NULL 作为参数将永远编译而不是那样。
  • 当然,您可以重写代码以说其他内容……但是,这改变了问题。问题中原始代码的语义是我回答的,没有涉及一个三元运算符。
  • @Seb:您是否阅读了我的答案或者只是出于三元运算符的目的而对其进行了否决?此外,以您想要的任何方式解释它,但它仍然是完全相同的东西,OP 需要了解它是什么,我已经提供了关于它是什么、可能是什么以及真正含义是什么的完整解释,指出最重要的一点是你真的不能按原样编译他的代码,因为它有一个解析错误。此外,值得一提的是,并非每种语言都支持右手操作符的直接求值,这使得它无论如何都是三元的。
  • 我阅读了您的回答,如果您想理解这个概念,我认为它具有误导性并且没有帮助。我同意存在语法错误,但它与问题无关,OP 可以轻松修复它。
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
相关资源
最近更新 更多