如何在PHP中使用三元和比较运算符?

时间:2014-10-16 15:32:38

标签: php operators

我是Laravel框架的新手(即从Symfony库驱动的框架)。我正在查看Symfony的代码并遇到了一些我认为可以用来提高我编码能力的捷径。

我想了解这些运营商的行为? (?:等)

  1-  $this->history = $history ?: new History();

//这是否意味着创建History类的对象并存储在$ this-> history?

  2-  $this->maxRedirects = $maxRedirects < 0 ? -1 : $maxRedirects;

  3-   $this->followRedirects = -1 != $this->maxRedirects;

//不确定运算符的行为方式?我知道这与正则表达式有关但想知道逻辑。

如果有人能像上面那样在php中发布关于正则表达式编程的教程链接,我将不胜感激。

5 个答案:

答案 0 :(得分:2)

第一个和第二个使用三元运算符:

condition ? code_if_true : code_if_false

请注意,code_if_true或code_if_false可以为空。

第三个为变量分配测试结果:-1 != $this->maxRedirects

所以,无论是真是假。

1)$this->history = $history ?: new History();

如果$history的值等于false,则将历史属性设置为类History的新实例。如果$history的值等于true,则history属性设置为$history值。

2)$this->maxRedirects = $maxRedirects < 0 ? -1 : $maxRedirects;

如果$maxRedirects为负数,则maxRedirects属性设置为-1,否则设置为$maxRedirects

3)$this->followRedirects = -1 != $this->maxRedirects;

如果$this->maxRedirects-1不同,则$this->followRedirects设置为true,否则设为false

答案 1 :(得分:1)

1)和3)被称为三元。即。

echo $isFoo ? "Is foo" : "No foo for you!";

如果foo是真的并且“No foo for you!”将回应“Is foo”否则。

自PHP 5.3起,你可以省略中间:

echo $fooLabel ?: "Default foo label";

如果为真,则显示$ fooLabel,否则显示“Default foo label”。

最后3)

$this->followRedirects = -1 != $this->maxRedirects;

这只是评估-1 != $this->maxRedirects。如果maxRedirects不等于-1,则为真。然后将结果存储在$this->followRedirects

答案 2 :(得分:1)

理解它的最好方法是只查看一页:

http://php.net/manual/en/language.operators.comparison.php

我认为要与Symfony合作,您需要更有经验的开发人员。首先尝试学习PHP,然后你可以尝试学习如何使用PHP编写的框架。另外我认为在你开始学习框架之前,你应该阅读一些关于设计模式的书。

答案 3 :(得分:0)

if-else简写遵循以下格式:

 <condition> ? <condition is met> : <condition is not met>

此:

$age = 20;
echo $age >= 21 ? 'Have a beer' : 'Too young! No beer for you!';

与此相同:

   if($age >= 21){
      echo 'Have a beer';
   }else{
       echo 'Too Young! No beer for you!';
   }

您的示例#1,因为PHP 5.3,只是忽略了速记的第一个条件,并且仅当条件时才执行new History()

$this->history = $history ?: new History();

请注意,如果您愿意,也可以省略第二个条件。此外,如果满足简写的省略部分,则返回1,因为没有给出其他指令。

答案 4 :(得分:0)

我认为最好通过示例说明这些运算符的工作原理:

<强> 1)

$this->history = $history ?: new History();

等于

if ($history) {
  $this->history = $history;
} else {
  $this->history = new History();
}

<强> 2)

$this->maxRedirects = $maxRedirects < 0 ? -1 : $maxRedirects;

等于

if ($maxRedirects < 0) {
  $this->maxRedirects = -1;
} else {
  $this->maxRedirects = $maxRedirects;
}

第3)

$this->followRedirects = -1 != $this->maxRedirects;

等于

$this->followRedirects = (-1 != $this->maxRedirects);

等于

if (-1 != $this->maxRedirects) {
  $this->followRedirects = true;
} else {
  $this->followRedirects = false;
}