PHP速记概述

Posted

技术标签:

【中文标题】PHP速记概述【英文标题】:Overview of PHP shorthand 【发布时间】:2011-06-01 19:46:37 【问题描述】:

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

Google 搜索几乎只显示 if/else 语句的简写,但我知道肯定不止这些。

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

($var) ? true : false;

【问题讨论】:

“速记”是什么意思? 这不是 Perl,PHP 中没有很多“速记”。做某些事情的更短更简洁的方法?可能。速记?没那么多。通过了解所有不同功能的功能并找到一个可以满足您需求的好功能,或者将其中的一些功能结合起来以达到预期的效果,您的代码大部分会变得更短。 现在在 PHP 5.4 中:print $var ?: 'foo' 如果您只是想检查该值是否真实或使用默认字符串“foo”。 【参考方案1】:

以下是 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];

【讨论】:

替代语法“速记”如何?如果有的话,那是速记。不过,如果不气馁并依赖简短的开放标签,我会同意&lt;?= $x = 'xxxx'; $x &amp;&amp; $array['new'] = $x 。这是什么意思? $x = 'xxxx'; if($x AND ($array['news'] = $x)) // nothing $x = 'xxxx'; if('xxxx' AND 'xxxx') // nothing @deceze - 在 php=>5.4 &lt;?= 不依赖于短打开标签,【参考方案2】:

PHP 5.3 引入:

$foo = $bar ?: $baz;

如果$bar 的计算结果为true(否则为$baz),则将$bar 的值分配给$foo

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

除此之外,没有什么其他的了。您可能想阅读documentation

【讨论】:

@Felix 这可以与 javascript 中的 || 运算符相比吗? @Jacob Relkin:我不能说它是否在每种情况下都一样,但总的来说它具有相同的效果(非常准确,JS 中的 || 在 PHP 中也是 || ; ) (它只返回 PHP 中的布尔值而不是值))。 @Felix 是的,这就是我的想法。 :) @Jacob:链接工作(例如,$foo = false ?: 0 ?: 42),所以我认为它与 JavaScript 的|| 一样工作。差异可能在于 PHP 认为是错误的(例如,'0')。 我没有对此投反对票,但可能是因为布尔语句 $foo = $bar 不是布尔值,而是一个赋值语句。另外,在 ?运算符,语句的“true”一侧没有值,如果您的布尔语句为 false,则仅返回 $baz。【参考方案3】:

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

例如,考虑以下函数,它接受一个数组作为参数,并且需要知道键 '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']";
    

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

array_walk($array, function($v)  return $v * 2; );

【讨论】:

array_map 也可以用来做和array_walk一样的事情吗? 它们很相似。 array_map 按值接受数组并返回一个新数组,而array_walk 修改数组本身。 +1 以平衡随机投票。那是一些合法的代码。我更喜欢array_merge($defaults, $thing),但工会也不错。 +1 array_merge()+ 是用于不同目的的不同功能。我在每个项目中都至少使用一次。【参考方案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';

【讨论】:

在 PHP 7 中引入,在提出问题大约 5 年后。确实是一个有用的运算符。更多关于???:的信息在这里:***.com/questions/34571330/…【参考方案5】:

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

第一个是要计算的布尔表达式。

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

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

【讨论】:

此外,这个运算符存在于大多数 C 风格的语言中,而不仅仅是 php。【参考方案6】:

在 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 或正整数。

【讨论】:

与这个例子有点相关,未来可能会有一个简写的匿名函数语法,所以这个例子可以进一步缩短为:usort($list, fn($a, $b) =&gt; $a &lt;=&gt; $b); 这可能看起来有点混乱,但它只是意味着=&gt; 的左边是函数签名,它的右边是主体,它只有一行并返回该行的结果(尽管 return 没有明确写入)。【参考方案7】:

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

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

($var) ? true : false;

这应该是这样的:

$var 为真吗?如果 $var 为真,返回值为真。如果 $var 为 false,返回 false

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

三元运算符更常见的用例是当您检查的东西不一定是布尔值,但您可以使用布尔逻辑来描述它。以对象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!”,否则返回字符串“This car is not blue.”

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

【讨论】:

【参考方案8】:

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

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

你可以写:

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

差别不大,但相当不错。

【讨论】:

【参考方案9】:
<?php
class Bob 

    public function isDebug()
        return true;
    

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



$bob = new Bob(); 

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

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

【讨论】:

以上是关于PHP速记概述的主要内容,如果未能解决你的问题,请参考以下文章

PHP速记三元运算符“?:”解析错误意外“:”

php基础速记

PHP 奇数和偶数类速记

PHP 将速记日期转换为长格式

php概述

PHP三元速记运算符中使用isset()时获取变量值