我是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中发布关于正则表达式编程的教程链接,我将不胜感激。
答案 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;
}