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];
【讨论】:
替代语法“速记”如何?如果有的话,那是速记。不过,如果不气馁并依赖简短的开放标签,我会同意<?=
。
$x = 'xxxx'; $x && $array['new'] = $x
。这是什么意思?
$x = 'xxxx'; if($x AND ($array['news'] = $x)) // nothing
$x = 'xxxx'; if('xxxx' AND 'xxxx') // nothing
@deceze - 在 php=>5.4 <?=
不依赖于短打开标签,【参考方案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) => $a <=> $b);
这可能看起来有点混乱,但它只是意味着=>
的左边是函数签名,它的右边是主体,它只有一行并返回该行的结果(尽管 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速记概述的主要内容,如果未能解决你的问题,请参考以下文章