题 参考 - 这个符号在PHP中意味着什么?


这是什么?

这是一系列关于PHP语法的问题。这也是社区Wiki,因此邀请每个人参与维护此列表。

为什么是这样?

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

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

我该怎么办?

如果您因为提出这样的问题而被某人指向此处,请在下面找到具体的语法。链接到的页面 PHP手册 连接问题可能会回答你的问题。如果是这样,我们鼓励您提出答案。此列表并不代替其他人提供的帮助。

列表

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


&  按位运算符 要么 参考


=&  参考


&=  按位运算符


&&  逻辑运算符


%  算术运算符


!!  逻辑运算符


@  错误控制操作符


?:  三元运算符


??  Null Coalesce Operator (自PHP 7起)


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


::  范围解析运算符


\  命名空间


->  类和对象


=>  数组


^  按位运算符


>>  按位运算符


<<  按位运算符


<<<  Heredoc或Nowdoc


=  分配运营商


==  比较运算符


===  比较运算符


!==  比较运算符


!=  比较运算符


<>  比较运算符


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


|  按位运算符


||  逻辑运算符


~  按位运算符


+  算术运算符数组运算符


+= 和 -=  分配运营商


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


.=  分配运营商


.  字符串运算符


,  函数参数

,  变量声明


$$  变量变量


`  执行运营商


<?=  短开标签


[]  数组 (PHP 5.4以来的短语法)


<?  打开和关闭标签


...  打开包装的论点 (自PHP 5.6起)


**   (自PHP 5.6起)


#  单行shell风格的评论



3793


起源


我知道这不是严格的PHP,但是包含一个链接呢 phpdoc.org 对于phpDocumentor注释语法,这是常用的,也无法搜索 /**? - Mike
我可以建议使用方括号和花括号吗? - ajreal
我也经常遇到这个问题(无法搜索特殊字符),这就是我制作的原因 SymbolHound,一个不会忽略特殊字符的搜索引擎。我也贴了它 StackApps。 - dncrane
好吧,从标题 为什么是这样?,我猜这是因为“主要想法是在Stack Overflow上链接现有问题,因此我们更容易引用它们”。 - Herbert
今天(11月20日/ 15日)提出了一个问题 stackoverflow.com/questions/33833259/what-is-rscat-in-php 问 “什么是PHP中的$ rsCat” (如果该问题仍然可见并且未删除)。奇怪的是,没有关于的参考 $ 变量,但是 $$ 仅变量变量。我认为应该在某处修改。 - Funk Forty Niner


答案:


递增/递减运算符

++ 增量运算符

-- 递减算子

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字符(a-z和A-Z)。


Stack Overflow帖子:


950



差异不仅仅是速度......考虑$ x = 0; $ y = $ x ++;与$ x = 0相比; $ y = ++ $ x;和每种情况下的$ y的值 - Mark Baker
注释的+1表示减法者不对字符起作用,仅对数字起作用 - Mark Baker
为了每个人的利益,请删除有关预先递增无限小的粗体信息。这是过早优化的绝对最糟糕的例子,如果他们刚开始学习PHP,这种信息不应该在人们的头脑中。 - Lotus Notes
@Lotus - 我认为这很有趣。如果你是PHP或C ++等的初学者,那么++ i和i ++的不同就足以让它以不同的速度工作了。我发现它很吸引人。 - Peter Ajtai
@Peter Ajtai是的,这很有意思,但是从你构建帖子的方式来看,你认为它似乎是PHP的主要事实之一,对于使用该语言来说绝对至关重要。 - Lotus Notes


按位运算符

有点什么?位是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。


361



如果$ a的值大于255,该怎么办? - Aycan Yaşıt
有一个按位在线计算器: bitwiseoperatorcalculator.com - jonprasetyo
@AycanYaşıt大多数操作系统都使用32位和64位系统,这意味着限制远远超过255(8位)。 - AlbertSamuel
@AycanYaşıt实际上,这里使用一个字节长度的表示甚至不正确,因为即使是最小的整数在现代64位平台的内存中仍然是64位(8字节)。 - Kaii


_  gettext()的别名 

下划线字符'_'如 _() 是别的 gettext() 功能。


225





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
a . b     Concatenation    Concatenate two strings: "Hi" . "Ha"

210





魔术常数:虽然这些不仅仅是符号,而是这个象征家族的重要组成部分。有八个魔法常数会根据它们的使用位置而改变。

__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__ 也适用于特质。当用于特征方法时, __CLASS__ 是使用特征的类的名称。

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

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

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

资源


194





<=> 宇宙飞船运营商

在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;
});

189



不确定如何 $a <=> $b 与...不同 $a - $b - rev
@AcidShout $a - $b 适用于数字,但不适用于字符串,对象或数组。 - mcrumley
@mcrumley不,比这更糟糕。一般来说 $a - $b 甚至不适用于数字;它只适用于 整数。它不适用于非整数,因为 usort 将比较器函数的返回值强制转换为 int,这意味着0.5被转换为0,这意味着两个差值小于1的数字,例如4和4.6,可能(取决于哪一个作为比较器函数的第一个参数传递)错误地比较为相等。 - Mark Amery
@MarkAmery迁移指南不是运营商记录的行为。为此,您需要查看本手册的语言操作员部分 php.net/language.operators.comparison 这背后的实际行为依赖于API的各种比较函数,比如当你为字符串执行strcmp时,你不能保证在每种情况下都有实际的返回值。当然,它几乎总是1,0或-1,但对于你不能保证它包装libc的strcmp的情况,你提供与底层规范相同的定义行为是安全的 - Sherif
@MarkAmery这里的观点是不允许人们依赖未定义的行为。对于某些人获得的值不完全是1,0或-1的情况,你会得到一个提交错误报告的人认为该语言有问题。这就是为什么我们记录所有我们可以保证的价值 少于, 比...更棒, 要么 等于 0,不一定是1,0和-1。 - Sherif


类型操作符

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)

121



以上也适用于'接口'。这对于检查特定接口是否可用非常有用。 - Ryan Vincent