34

我已经用 PHP 编程多年了,但我从来没有学会如何使用任何简写。我不时在代码中遇到它并且很难阅读它,所以我想学习该语言存在的不同速记,以便我可以阅读它并开始通过使用它来节省时间/行,但是我似乎无法找到所有速记的全面概述。

谷歌搜索几乎完全显示了 if/else 语句的简写,但我知道肯定不止这些。

简而言之,我说的是这样的东西:

($var) ? true : false;
4

9 回答 9

68

以下是 PHP 中使用的一些速记运算符。

//If $y > 10, $x will say 'foo', else it'll say 'bar'
$x = ($y > 10) ? 'foo' : 'bar';

//Short way of saying <? print $foo;?>, useful in HTML templates
<?=$foo?>

//Shorthand way of doing the for loop, useful in html templates
for ($x=1; $x < 100; $x++):
   //Do something
end for;

//Shorthand way of the foreach loop
foreach ($array as $key=>$value):
   //Do something;
endforeach;

//Another way of If/else:
if ($x > 10):
    doX();
    doY();
    doZ();
else:
    doA();
    doB();
endif;

//You can also do an if statement without any brackets or colons if you only need to
//execute one statement after your if:

if ($x = 100)
   doX();
$x = 1000;

// PHP 5.4 introduced an array shorthand

$a = [1, 2, 3, 4];
$b = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
于 2010-12-31T00:52:52.037 回答
22

PHP 5.3 引入:

$foo = $bar ?: $baz;

它将值分配$bar$fooif$bar评估为true(else $baz)。

您还可以嵌套三元运算符(正确使用括号)。

除此之外,没有太多关于它的东西。您可能想阅读文档

于 2010-12-31T00:37:37.907 回答
16

我在 PHP 中最喜欢的“技巧”之一是在处理诸如采用参数数组的函数、使用默认值等情况时使用数组联合运算符。

例如,考虑以下函数,它接受一个数组作为参数,并且需要知道键'color''shape'和 ' size' 已设置。但也许用户并不总是知道这些会是什么,所以你想为他们提供一些默认值。

在第一次尝试时,人们可能会尝试这样的事情:

function get_thing(array $thing)
{
    if (!isset($thing['color'])) {
        $thing['color'] = 'red';
    }
    if (!isset($thing['shape'])) {
        $thing['shape'] = 'circle';
    }
    if (!isset($thing['size'])) {
        $thing['size'] = 'big';
    }
    echo "Here you go, one {$thing['size']} {$thing['color']} {$thing['shape']}";
}

但是,使用数组联合运算符可以是一个很好的“速记”,可以使这个更清晰。考虑以下函数。它具有与第一个完全相同的行为,但更清楚:

function get_thing_2(array $thing)
{
    $defaults = array(
        'color' => 'red',
        'shape' => 'circle',
        'size'  => 'big',
    );
    $thing += $defaults;
    echo "Here you go, one {$thing['size']} {$thing['color']} {$thing['shape']}";
}    

另一个有趣的事情是匿名函数,(和闭包,在 PHP 5.3 中引入)。例如,要将数组的每个元素乘以 2,您只需执行以下操作:

array_walk($array, function($v) { return $v * 2; });
于 2010-12-31T00:56:13.737 回答
4

没人提??

// Example usage for: Null Coalesce Operator
$action = $_POST['action'] ?? 'default';

// The above is identical to this if/else statement
if (isset($_POST['action'])) {
    $action = $_POST['action'];
} else {
    $action = 'default';
}
于 2017-04-19T13:01:21.263 回答
3

这称为三元运算符,一个具有三个操作数的布尔运算符:

第一个是要评估的布尔表达式。

第二个是当布尔表达式计算为 TRUE 时要执行的表达式。

第三个是布尔表达式计算结果为 FALSE 时要执行的表达式。

于 2010-12-31T00:32:20.597 回答
2

PHP7 中还新增了 spaceship 运算符。主要用于回调之类的东西usort()

前:

usort($list, function ($a, $b) {
    if ($a == $b) return 0;
    return $a < $b;
});

后:

usort($list, function ($a, $b) { return $a <=> $b; });

基本上,它根据左侧与右侧的比较返回负整数、0 或正整数。

于 2017-09-13T04:16:13.437 回答
1

因此,Jacob Relkin 绝对正确,因为您提到的“速记”确实被称为“三元”运算符,并且正如 Sam Dufel 所补充的,它在其他语言中非常普遍。根据语言的实现方式,服务器甚至可能更快地解释逻辑,并让您更快地阅读它。

因此,有时当您学习新的逻辑或新的运算符(例如这个)时,帮助您考虑英语(或任何您的母语)来适应它。用一句话来形容。让我们通过你的例子来谈谈:

($var) ? true : false;

这应该是这样的:

$var 是真的吗? 如果 $var 是,则返回值 true。如果 $var 为 false,则返回值 false

问号有助于提醒您所问的问题决定了输出。

三元运算符更常见的用例是当您检查不一定是布尔值的东西时,但您可以使用布尔逻辑来描述它。以 object 为例Car,它有一个名为 的属性color,它是一个类似字符串的变量(在 PHP 中)。你不能问一个字符串是真还是假,因为那没有意义,但你可以问不同的问题:

$output = $car->color == "blue" ? "Wheee this car is blue!" : "This car isn't blue at all.";

echo $output;

所以这一行如下:

汽车的颜色和字符串“blue”一样吗?
如果是,则返回字符串“Whee this car is blue!” ,否则返回字符串“这辆车根本不是蓝色的。”

无论三元运算符返回什么,都将在带有 $output 的赋值语句的右侧使用,然后打印该字符串。

于 2011-01-15T03:42:53.230 回答
1
<?php
class Bob {

    public function isDebug(){
        return true;
    }

    public function debug(){
        echo 'yes dice!!!';
    }
}


$bob = new Bob(); 

($bob->isDebug()) && $bob->debug(); 

这是另一个版本的速记。希望这可以帮助某人

于 2014-05-28T21:17:49.253 回答
1

从 5.4 开始,您还拥有数组文字,因此您不再需要编写:

$myArray = array('some', 'list', 'of', 'stuff');

你可以写:

$myArray = ['some', 'list', 'of', 'stuff'];

差别不大,但相当不错。

于 2018-01-05T04:43:06.557 回答