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

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

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

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

($var) ? true : false;

【问题讨论】:

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

标签: php shorthand


【解决方案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';
}

【讨论】:

【解决方案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(); 
      

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

      【讨论】:

        猜你喜欢
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-04
        • 2015-04-04
        • 2020-01-14
        • 1970-01-01
        相关资源
        最近更新 更多