参考-这个符号在PHP中是什么意思?


4475

这是什么?

这是有关PHP语法的不时出现的问题的集合。这也是一个社区Wiki,因此邀请所有人参与维护此列表。

为什么是这样?

过去通常很难找到有关运算符和其他语法标记
的问题。¹ 主要思想是在Stack Overflow上具有指向现有问题的链接,因此我们更容易引用它们,而不必从PHP手册中复制内容。

注意:自2013年1月起,Stack Overflow 确实支持特殊字符。只需将搜索词用引号引起来,例如[php] "==" vs "==="

我应该在这里做什么?

如果有人因提出这样的问题而将您指向此处,请在下面找到特定的语法。PHP手册的链接页面以及链接的问题可能会回答您的问题。如果是这样,建议您增加答案。此列表不能代替其他人提供的帮助。

名单

如果您的特定令牌未在下面列出,则可以在解析器令牌列表中找到它。


& 按位运算符引用


=& 参考文献


&= 按位运算符


&& 逻辑运算符


% 算术运算符


!! 逻辑运算符


@ 错误控制运算符


?: 三元运算符


?? 空合并运算符(自PHP 7起)


?string ?int ?array ?bool ?float 可空的返回类型声明(自PHP 7.1起)


: 控制结构的替代语法三元运算符


:: 范围解析运算符


\ 命名空间


-> 类和对象


=> 数组


^ 按位运算符


>> 按位运算符


<< 按位运算符


<<< Heredoc或Nowdoc


= 赋值运算符


== 比较运算符


=== 比较运算符


!== 比较运算符


!= 比较运算符


<> 比较运算符


<=> 比较运算符(自PHP 7.0起)


| 按位运算符


|| 逻辑运算符


~ 按位运算符


+ 算术运算符数组运算符


+=-= 分配运算符


++-- 递增/递减运算符


.= 赋值运算符


. 字符串运算符


, 功能参数

, 变量声明


$$ 可变变量


` 执行运算符


<?= 短开放标签


[] 数组(自PHP 5.4起的简短语法)


<? 开启和关闭标签


... 参数解压缩(自PHP 5.6起)


** (自PHP 5.6起)


# 单行外壳式注释


:? 可空的返回类型



36
我知道这不是严格意义上的PHP,但是包括指向phpdoc.org的phpDocumentor注释语法的链接又/**如何呢?
麦克,

8
我可以建议使用方括号和花括号吗?
2011年

124
我也遇到了很多问题(无法搜索特殊字符),这就是为什么我制作了SymbolHound,这是一个不会忽略特殊字符的搜索引擎的原因。我也将其发布在StackApps上
dncrane 2011年

1
那么,从标题为什么?,我猜这是因为“主要思想是在Stack Overflow上拥有到现有问题的链接,因此我们更容易引用它们”。
赫伯特

3
今天(11月20/15日)提出了一个问题stackoverflow.com/questions/33833259/what-is-rscat-in-php询问“什么是php中的$ rsCat”(该问题仍应显示而不删除) 。奇怪的是,这里没有关于$变量的参考,而只是关于$$变量的参考。我认为应该在某处进行修改。
Funk 40 Niner,2015年

Answers:


1169

递增/递减运算符

++ 增量算子

-- 递减运算符

Example    Name              Effect
---------------------------------------------------------------------
++$a       Pre-increment     Increments $a by one, then returns $a.
$a++       Post-increment    Returns $a, then increments $a by one.
--$a       Pre-decrement     Decrements $a by one, then returns $a.
$a--       Post-decrement    Returns $a, then decrements $a by one.

这些可以在变量之前或之后。

如果变量之前说,该递增/递减操作完成的变量第一,然后返回结果。如果将变量放在变量之后,则首先返回该变量,然后执行递增/递减操作。

例如:

$apples = 10;
for ($i = 0; $i < 10; ++$i) {
    echo 'I have ' . $apples-- . " apples. I just ate one.\n";
}

现场例子

在上面的情况下++$i,因为它更快。$i++会有相同的结果。

预增量要快一点,因为它实际上是递增变量,然后“返回”结果。后增量创建一个特殊变量,在其中复制第一个变量的值,只有在使用第一个变量之后,才将其值替换为第二个变量。

但是,您必须使用$apples--,因为首先要显示当前的苹果数,然后再从中减去一个。

您还可以在PHP中递增字母:

$i = "a";
while ($i < "c") {
    echo $i++;
}

下一次z到达aa一次,依此类推。

请注意,字符变量可以递增但不能递减,即使如此,仅支持纯ASCII字符(az和AZ)。


堆栈溢出帖子:


9
+1表示递减器不能对字符起作用,而只能对数字起作用
Mark Ba​​ker

162
为了大家的缘故,请删除粗体的信息,以了解预递增的速度无限快。这是过早优化的绝对最糟糕的例子,如果人们刚刚开始学习PHP,则此类信息不应该成为人们的头脑。
Lotus Notes 2010年

14
@Lotus-我认为这是一个有趣的事实。如果您是PHP或C ++等的初学者,那么++ i和i ++的不同之处足以使其以不同的速度工作,这似乎很古怪。我觉得很有趣。
彼得·阿杰泰

12
@Peter Ajtai是的,这很有趣,但是从您构造帖子的方式来看,它看起来像PHP的主要事实之一,这对于使用该语言至关重要。
Lotus Notes 2010年

4
不知道是不是我,但是苹果的例子似乎有点误导。'我有10个苹果。我只吃了一个让我相信您有11个苹果,但现在您有10个苹果,因为您只说了一个就吃了一个,而不是吃了一个,因此使您有了9个,这就是代码的含义。
さりげない告白

440

按位运算符

有什么?位表示1或0。基本上是OFF(0)和ON(1)

什么是字节?一个字节由8位组成,一个字节的最大值是255,这意味着每个位都被置位。我们将查看为什么一个字节的最大值为255。

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------

此表示为1字节

1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255(1字节)

一些例子,以更好地理解

“ AND”运算符: &

$a =  9;
$b = 10;
echo $a & $b;

这将输出数字8。为什么?好吧,让我们看一下我们的表格示例。

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------
|      $a    |   0|  0|  0|  0| 1| 0| 0| 1|    
-------------------------------------------
|      $b    |   0|  0|  0|  0| 1| 0| 1| 0|
------------------------------------------- 
|      &     |   0|  0|  0|  0| 1| 0| 0| 0|
------------------------------------------- 

因此,您可以从表中看到它们共享的唯一位是8位。

第二个例子

$a =  36;
$b = 103;
echo $a & $b; // This would output the number 36.
$a = 00100100
$b = 01100111

两个共享位是32和4,将它们加在一起返回36。

“或”运算符: |

$a =  9;
$b = 10;
echo $a | $b;

这将输出数字11。为什么?

-------------------------------------------
|      1 Byte ( 8 bits )                  |
-------------------------------------------
|Place Value | 128| 64| 32| 16| 8| 4| 2| 1|     
-------------------------------------------
|      $a    |   0|  0|  0|  0| 1| 0| 0| 1|    
-------------------------------------------
|      $b    |   0|  0|  0|  0| 1| 0| 1| 0|
------------------------------------------- 
|      |     |   0|  0|  0|  0| 1| 0| 1| 1|
-------------------------------------------

您会注意到,在8、2和1列中设置了3位。加起来:8 + 2 + 1 = 11。


6
如果$ a的值大于255怎么办?
AycanYaşıt2013年

@AycanYaşıt大多数操作系统使用32位和64位系统,这意味着限制远远超过255(8位)。
AlbertSamuel '16

@AycanYaşıt实际上,这里的一个字节长度的表示甚至都不正确,因为即使最小的整数在现代64位平台上的内存中仍然是64位(8字节)。
Kaii

为什么and &0 0 0 0 1 0 0 0or |0 0 0 0 1 0 1 1
Vir19年

285

<=> 飞船操作员

在PHP 7中添加

飞船操作 <=>是在PHP 7增加了最新的运营商相比,它是一种非关联二元运算符具有相同优先级的平等运算符(==!====!==)。此运算符允许在左侧和右侧操作数之间进行更简单的三向比较。

运算符的整数表达式为:

  • 0 当两个操作数相等时
  • 小于0当左侧操作数小于右侧操作数时
  • 大于0当左侧操作数大于右侧操作数时

例如

1 <=> 1; // 0
1 <=> 2; // -1
2 <=> 1; // 1

使用此运算符的一个很好的实际应用是比较类型的回调,该回调基于两个值之间的三向比较,期望返回零,负或正整数。传递给的比较函数usort就是这样一个例子。

在PHP 7之前,您需要编写...

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    if ($a < $b) {
        return -1;
    } elseif ($a > $b) {
        return 1;
    } else {
        return 0;
    }
});

从PHP 7开始,您可以编写...

$arr = [4,2,1,3];

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

21
不知道如何$a <=> $b为不同的到$a - $b

38
@AcidShout $a - $b适用于数字,但不适用于字符串,对象或数组。
mcrumley

44
@mcrumley不,这比那更糟。通常$a - $b,数字甚至都不适用;它仅适用于整数。它不适用于非整数,因为usort将比较器函数的返回值强制转换为int,这意味着将0.5 强制转换为0,这意味着两个差值小于1的数字(例如4和4.6)(取决于并将其作为第一个参数传递给比较器函数)不正确地进行相等比较。
Mark Amery 2015年

5
@MarkAmery迁移指南不是操作员的书面行为。为此,您需要查看php.net/language.operators.comparison手册的“语言运算符”部分,其背后的实际行为依赖于API的各种比较功能,例如在对字符串进行strcmp时,其中您不能保证每种情况下的实际返回值。当然,它几乎总是1、0或-1,但是对于无法保证像包装libc的strcmp那样的情况,您可以提供与基本规范相同的定义行为,以确保安全
Sherif

9
@MarkAmery这里的重点是不允许人们依赖未定义的行为。对于某人获得的值不完全为1、0或-1的情况,您会得到某人提交错误报告,认为该语言有问题。这就是为什么我们证明,我们可以保证的是,值将小于大于等于 0,而不必为1、0和-1。
谢里夫


273
Syntax    Name             Description

x == y    Equality         True if x and y have the same key/value pairs
x != y    Inequality       True if x is not equal to y
x === y   Identity         True if x and y have the same key/value pairs
                            in the same order and of the same types
x !== y   Non-identity     True if x is not identical to y
++ x      Pre-increment    Increments x by one, then returns x
x ++      Post-increment   Returns x, then increments x by one
-- x      Pre-decrement    Decrements x by one, then returns x
x --      Post-decrement   Returns x, then decrements x by one
x and y   And              True if both x and y are true x=6 y=3
                           (x < 10 and y > 1) returns true 
x && y    And              True if both x and y are true x=6 y=3
                           (x < 10 && y > 1) returns true
x or y     Or              True if any of x or y are true x=6 y=3
                           (x < 10 or y > 10) returns true 
x || y     Or              True if any of x or y are true x=6 y=3
                           (x < 3 || y > 1) returns true
a . b     Concatenation    Concatenate two strings: "Hi" . "Ha"

239

魔术常数:尽管这些不仅是符号,而且是此令牌系列的重要组成部分。有八个神奇常数会根据使用的位置而变化。

__LINE__:文件的当前行号。

__FILE__:文件的完整路径和文件名。如果在include中使用,则返回包含文件的名称。从PHP 4.0.2开始,__FILE__始终包含已解析符号链接的绝对路径,而在旧版本中,在某些情况下,它包含相对路径。

__DIR__:文件目录。如果在include中使用,则返回包含文件的目录。这相当于dirname(__FILE__)。除非它是根目录,否则此目录名称不带斜杠。(在PHP 5.3.0中添加。)

__FUNCTION__:函数名称。(在PHP 4.3.0中添加)从PHP 5开始,此常量返回声明的函数名称(区分大小写)。在PHP 4中,其值始终为小写。

__CLASS__:类名称。(在PHP 4.3.0中添加)从PHP 5开始,此常量返回声明的类名(区分大小写)。在PHP 4中,其值始终为小写。类名包括在其中声明的名称空间(例如Foo\Bar)。请注意,从PHP 5.4开始__CLASS__,特质也可以使用。在trait方法中使用时,__CLASS__是使用trait 的类的名称。

__TRAIT__:特征名称。(在PHP 5.4.0中添加)从PHP 5.4开始,此常量返回声明的特征(区分大小写)。特征名称包括在其中声明的名称空间(例如Foo\Bar)。

__METHOD__:类方法名称。(在PHP 5.0.0中添加)方法名称被声明时返回(区分大小写)。

__NAMESPACE__:当前名称空间的名称(区分大小写)。该常量在编译时定义(在PHP 5.3.0中添加)。

资源


150

类型运算符

instanceof 用于确定PHP变量是否是某个类的实例化对象。

<?php
class mclass { }
class sclass { }
$a = new mclass;
var_dump($a instanceof mclass);
var_dump($a instanceof sclass);

上面的示例将输出:

bool(true)
bool(false)

原因:上面的示例$a是对象,mclass因此仅使用mclass数据而不使用的实例sclass

继承的例子

<?php 
class pclass { } 
class childclass extends pclass { } 
$a = new childclass; 
var_dump($a instanceof childclass); 
var_dump($a instanceof pclass);

上面的示例将输出:

bool(true)
bool(true)

克隆示例

<?php 
class cloneable { } 
$a = new cloneable;
$b = clone $a; 
var_dump($a instanceof cloneable); 
var_dump($b instanceof cloneable);

上面的示例将输出:

bool(true)
bool(true)

7
以上也适用于“接口”。这对于检查特定接口是否可用很有用。
Ryan Vincent

132

PHP运算符概述:


逻辑运算符:

  • $ a && $ b:如果$ a和$ b都为TRUE,则为TRUE。
  • $ a || $ b:如果$ a或$ b为TRUE,则为TRUE。
  • $ a xor $ b:如果$ a或$ b中的一个为TRUE,则为TRUE,但不能同时为两个。
  • !$ a:如果$ a不为TRUE,则为TRUE。
  • $ a和$ b:如果$ a和$ b都为TRUE,则为TRUE。
  • $ a或$ b:如果$ a或$ b为TRUE,则为TRUE。

比较运算符:

  • $ a == $ b:如果类型变戏法后$ a等于$ b,则为TRUE。
  • $ a === $ b:如果$ a等于$ b,并且它们是同一类型,则为TRUE。
  • $ a!= $ b:如果类型变戏法后$ a不等于$ b,则为TRUE。
  • $ a <> $ b:如果类型变戏法后$ a不等于$ b,则为TRUE。
  • $ a!== $ b:如果$ a不等于$ b,或者它们不是同一类型,则为TRUE。
  • $ a <$ b:如果$ a严格小于$ b,则为TRUE。
  • $ a> $ b:如果$ a严格大于$ b,则为TRUE。
  • $ a <= $ b:如果$ a小于或等于$ b,则为TRUE。
  • $ a> = $ b:如果$ a大于或等于$ b,则为TRUE。
  • $ a <=> $ b:当$ a分别小于,等于或大于$ b时,小于,等于或大于零的整数。自PHP 7起可用。
  • $ a?$ b:$ c:如果$ a返回$ b否则返回$ c(三元运算符
  • $ a ?? $ c:与$ a相同?$ a:$ c(空合并运算符 -需要PHP> = 7)

算术运算符:

  • -$ a:与$ a相反。
  • $ a + $ b:$ a和$ b之和。
  • $ a-$ b:$ a和$ b之差。
  • $ a * $ b:$ a和$ b的乘积。
  • $ a / $ b:$ a和$ b的商。
  • $ a%$ b$ a的余数除以$ b。
  • $ a ** $ b:将$ a提高到第b次幂的结果(PHP 5.6中引入)

递增/递减运算符:

  • ++ $ a:将$ a加1,然后返回$ a。
  • $ a ++:返回$ a,然后将$ a加1。
  • -$ a:将$ a减一,然后返回$ a。
  • $ a--:返回$ a,然后将$ a减1。

按位运算符:

  • $ a&$ b:设置在$ a和$ b中设置的位。
  • $ a | $ b:设置在$ a或$ b中设置的位。
  • $ a ^ $ b:在$ a或$ b中设置的位,但未同时设置。
  • 〜$ a:未设置在$ a中设置的位,反之亦然。
  • $ a << $ b:将$ a $ b步骤的位向左移动(每个步骤表示“乘以2”)
  • $ a >> $ b:将$ a $ b步骤的位向右移动(每个步骤表示“除以二”)

字符串运算符:

  • $ a。$ b:$ a和$ b的串联。

数组运算符:

  • $ a + $ b:$ a和$ b的并集。
  • $ a == $ b:如果$ a和$ b具有相同的键/值对,则为TRUE。
  • $ a === $ b:如果$ a和$ b具有相同顺序的相同键/值对和相同类型,则为TRUE。
  • $ a!= $ b:如果$ a不等于$ b,则为TRUE。
  • $ a <> $ b:如果$ a不等于$ b,则为TRUE。
  • $ a!== $ b:如果$ a与$ b不同,则为TRUE。

分配运算符:

  • $ a = $ b$ b的值分配给$ a
  • $ a + = $ b:与$ a = $ a + $ b相同
  • $ a- = $ b:与$ a = $ a- $ b相同
  • $ a * = $ b:与$ a = $ a * $ b相同
  • $ a / = $ b:与$ a = $ a / $ b相同
  • $ a%= $ b:与$ a = $ a%$ b相同
  • $ a ** = $ b:与$ a = $ a ** $ b相同
  • $ a。= $ b:与$ a = $ a相同。$ b
  • $ a&= $ b:与$ a = $ a&$ b相同
  • $ a | = $ b:与$ a = $ a |相同 $ b
  • $ a ^ = $ b:与$ a = $ a ^ $ b相同
  • $ a << = $ b:与$ a = $ a << $ b相同
  • $ a >> = $ b:与$ a = $ a >> $ b相同

注意

and运算符和or运算符的优先级低于赋值运算符=

这意味着$a = true and false;等同于($a = true) and false

在大多数情况下,您可能希望使用&&||,它们的行为方式可以从C,Java或JavaScript等语言中得知。


1
中存在错误$a ?? $c,它表示与相同$a ? $a : $c,但三元运算符检查value是否为true,另一方面,空合并检查空值,因此,如果$ a为0,则将得到0(因为0为不为null),例如,如果您有:$a=0; $c=5;$a?$a:$c返回5,然后$a??$c返回
0。– stramin

104

飞船操作员 <=>(PHP 7中添加)

<=>太空飞船操作员的示例(PHP 7,来源:PHP手册):

整数,浮点数,字符串,数组和对象,用于变量的三向比较。

// Integers
echo 10 <=> 10; // 0
echo 10 <=> 20; // -1
echo 20 <=> 10; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
// Comparison is case-sensitive
echo "B" <=> "a"; // -1

echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1

// Arrays
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1

// Objects
$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 0

$a = (object) ["a" => "b"]; 
$b = (object) ["a" => "c"]; 
echo $a <=> $b; // -1

$a = (object) ["a" => "c"]; 
$b = (object) ["a" => "b"]; 
echo $a <=> $b; // 1

// only values are compared
$a = (object) ["a" => "b"]; 
$b = (object) ["b" => "b"]; 
echo $a <=> $b; // 1


74

{} 大括号

还有关于最后一个帖子的一些话

$x[4] = 'd'; // it works
$x{4} = 'd'; // it works

$echo $x[4]; // it works
$echo $x{4}; // it works

$x[] = 'e'; // it works
$x{} = 'e'; // does not work

$x = [1, 2]; // it works
$x = {1, 2}; // does not work

echo "${x[4]}"; // it works
echo "${x{4}}"; // does not work

echo "{$x[4]}"; // it works
echo "{$x{4}}"; // it works

4
属性名称的{''}表示法。echo $ movies-> movie-> {'great-lines'}-> line; 可用于访问SimpleXMLElement中的数据。也许它也可以在其他情况下使用。php.net/manual/en/simplexml.examples-basic.php
Andrei

68

空合并运算符(??)

在PHP 7.0中已添加此运算符,以用于需要与结合使用三元运算符的常见情况isset()。如果它存在,则返回其第一个操作数;否则返回它的第一个操作数NULL。否则返回第二个操作数。

<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

64

PHP字串: PHP字符串可以通过四种方式指定,而不仅仅是两种方式:

1)单引号字符串:

$string = 'This is my string'; // print This is my string

2)双引号字符串:

$str = 'string';

$string = "This is my $str"; // print This is my string

3)Heredoc:

$string = <<<EOD
This is my string
EOD; // print This is my string

4)Nowdoc(自PHP 5.3.0起):

$string = <<<'END_OF_STRING'
    This is my string 
END_OF_STRING; // print This is my string

@ Rizier123:“ Heredocs不能用于初始化类属性。从PHP 5.3开始,此限制仅对包含变量的heredocs有效”是什么意思?
PHPFan

48

题:

什么=>意思


回答:

=>是我们人类决定用来分隔"Key" => "Value"关联数组中的对的符号。

精化:

要了解这一点,我们必须知道什么是关联数组。当常规程序员想到一个数组(用PHP编写)时,首先出现的事情类似于:

$myArray1 = array(2016, "hello", 33);//option 1

$myArray2 = [2016, "hello", 33];//option 2

$myArray3 = [];//option 3
$myArray3[] = 2016; 
$myArray3[] = "hello"; 
$myArray3[] = 33;

在哪里,如果我们想在代码的稍后部分调用该数组,则可以执行以下操作:

echo $myArray1[1];// output: hello
echo $myArray2[1];// output: hello
echo $myArray3[1];// output: hello

到目前为止,一切都很好。然而,作为人类,我们可能会发现很难记住,指数[0]数组是值一年 2016年,指数[1]的阵列是一个问候,和索引[2]数组是一个简单的整数值。然后,我们将拥有的替代方法是使用所谓的关联数组。关联数组与顺序数组有一些区别 (这是以前的情况,因为它们通过为每个后续值加1来增加预定序列中使用的索引,)。

差异(顺序数组和关联数组之间):

  • 在声明关联数组的过程中,不仅要包含value要放入数组中的内容,而且还要key在以后的数组中调用要使用的索引值(称为)。码。声明时使用以下语法:"key" => "value"

  • 使用关联数组时, key值将被放置在数组的索引内以检索所需的value

例如:

    $myArray1 = array( 
        "Year" => 2016, 
        "Greetings" => "hello", 
        "Integer_value" => 33);//option 1

    $myArray2 = [ 
        "Year" =>  2016, 
        "Greetings" => "hello", 
        "Integer_value" => 33];//option 2

    $myArray3 = [];//option 3
    $myArray3["Year"] = 2016; 
    $myArray3["Greetings"] = "hello"; 
    $myArray3["Integer_value"] = 33;

现在,要接收与以前相同的输出,key将在数组索引中使用该值:

echo $myArray1["Greetings"];// output: hello
echo $myArray2["Greetings"];// output: hello
echo $myArray3["Greetings"];// output: hello

最后一点:

因此,从上面的示例可以很容易地看出,在数组中的值初始化期间,该=>符号用于表示数组中的keyvalue对之间的关联数组的关系。


36

在PHP中,“&”是什么意思?

PHP“&”运算符

一旦习惯了,生活就会变得更加轻松。(请仔细检查下面的示例)

通常检查同时设置了$ a和$ b中设置的位。

您甚至没有注意到这些呼叫的工作方式?

   error_reporting(E_ERROR | E_WARNING | E_PARSE);
    error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);
    error_reporting(E_ALL & ~E_NOTICE);
    error_reporting(E_ALL);

因此,以上所有操作背后都是按位运算符和位的游戏。

其中一个有用的情况是简单的配置,例如下面的Give,因此单个整数字段可以为您存储数千个连击。

大多数人已经阅读过文档,但没有依赖这些按位运算符的实际用例。

例子,你会喜欢

<?php

class Config {

    // our constants must be 1,2,4,8,16,32,64 ....so on
    const TYPE_CAT=1;
    const TYPE_DOG=2;
    const TYPE_LION=4;
    const TYPE_RAT=8;
    const TYPE_BIRD=16;
    const TYPE_ALL=31;

    private $config;

    public function __construct($config){
        $this->config=$config;

        if($this->is(Config::TYPE_CAT)){
            echo 'cat ';
        }
        if($this->is(Config::TYPE_DOG)){
            echo 'dog ';
        }
        if($this->is(Config::TYPE_RAT)){
            echo 'rat ';
        }
        if($this->is(Config::TYPE_LION)){
            echo 'lion ';
        }
        if($this->is(Config::TYPE_BIRD)){
            echo 'bird ';
        }
        echo "\n";
    }

    private function is($value){
        return $this->config & $value;
    }
}

new Config(Config::TYPE_ALL);
// cat dog rat lion bird
new Config(Config::TYPE_BIRD);
//bird
new Config(Config::TYPE_BIRD | Config::TYPE_DOG);
//dog bird
new Config(Config::TYPE_ALL & ~Config::TYPE_DOG & ~Config::TYPE_CAT);
//rat lion bird

30

== 用于检查相等性而不考虑变量数据类型

===用于进行检查平等二者的可变数据类型

$a = 5

  1. if ($a == 5) -将评估为true

  2. if ($a == '5') -将评估为true,因为在比较这两个值时,PHP在内部将字符串值转换为整数,然后比较这两个值

  3. if ($a === 5) -将评估为true

  4. if ($a === '5') -将计算为false,因为值是5,但是该值5不是整数。


27

空合并运算符“ ??” (在PHP 7中添加)

不是操作员最常用的名称,但是PHP 7引入了非常方便的null合并,因此我想分享一个示例。

在PHP 5中,我们已经有一个三元运算符,该运算符将测试一个值,如果返回true,则返回第二个元素,否则返回第三个元素:

echo $count ? $count : 10; // outputs 10

还有一个简写,可以让您跳过第二个元素,如果它与第一个元素相同:echo $ count?:10; //也输出10

在PHP 7中,我们还获得了?? 运算符,而不是表示极端混乱,这是我通常将两个问号一起使用的方式,而是允许我们将一串值链接在一起。从左到右读取,存在且不为null的第一个值是将要返回的值。

// $a is not set
$b = 16;

echo $a ?? 2; // outputs 2
echo $a ?? $b ?? 7; // outputs 16

此结构可用于优先考虑可能来自用户输入或现有配置的一个或多个值,并在缺少该配置时安全地退回到给定的默认值。这是一个很小的功能,但是我知道一旦我的应用程序升级到PHP 7,我就会使用它。


12

可空的返回类型声明

PHP 7添加了对返回类型声明的支持。与参数类型声明类似,返回类型声明指定将从函数返回的值的类型。可用于返回类型声明的类型与用于参数类型声明的类型相同。

严格类型化也会对返回类型声明产生影响。在默认的弱模式下,如果返回的值还不是该类型,则将其强制为正确的类型。在强模式下,返回值必须是正确的类型,否则将引发TypeError。

从PHP 7.1.0开始,可以通过在类型名称前加上问号(?)来将返回值标记为可为空。这表示该函数返回指定的类型或NULL。

<?php
function get_item(): ?string {
    if (isset($_GET['item'])) {
        return $_GET['item'];
    } else {
        return null;
    }
}
?>

资源


7

三个DOTS作为Splat运算符(...)(自PHP 5.6起)

PHP有一个运算符“ ...”(三个点),称为Splat运算符。它用于在函数中传递任意数量的参数,这种类型的函数称为可变函数。让我们以使用“ ...”(三个点)为例。

范例1:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}

echo calculateNumbers(10, 20, 30, 40, 50);

//Output 150
?>

当使用“…”时,calculateNumbers()函数的每个参数都将$ params作为数组传递。

使用“…”运算符的方式有很多。下面是一些示例:

范例2:

<?php
function calculateNumbers($no1, $no2, $no3, $no4, $no5){
    $total = $no1 + $no2 + $no3 + $no4 + $no5;
    return $total;
}

$numbers = array(10, 20, 30, 40, 50);
echo calculateNumbers(...$numbers);

//Output 150
?>

范例3:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}
$no1 = 70;
$numbers = array(10, 20, 30, 40, 50);
echo calculateNumbers($no1, ...$numbers);

//Output 220
?>

范例4:

<?php
function calculateNumbers(...$params){
    $total = 0;
    foreach($params as $v){
        $total = $total + $v;
    }
    return $total;
}

$numbers1 = array(10, 20, 30, 40, 50);
$numbers2 = array(100, 200, 300, 400, 500);
echo calculateNumbers(...$numbers1, ...$numbers2);

//Output 1650

?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.