php错误控制 参考-这个符号在PHP中意味着什么?




php错误控制 (14)

问题

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

所以上面的所有内容都是按位运算符和位的游戏。

其中一个有用的例子是简单的配置,如下面给出的,所以一个整数字段可以为你存储数千个组合。

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

示例你会爱

<?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

这是什么?

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

为什么是这样?

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

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

我该怎么办?

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

列表

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

& 按位运算符References

=& References

&= 按位运算符

&& 逻辑运算符

% 算术运算符

!! 逻辑运算符

@ 错误控制运算符

?: 三元运算符

?? Null Coalesce运算符 (自PHP 7起)

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

:: 范围解析运算符

\ Namespaces

-> 类和对象

=> Arrays

^ 按位运算符

>> 按位运算符

<< 按位运算符

<<< Heredoc或Nowdoc

= 分配运营商

== 比较运算符

===

!== 比较运算符

!= 比较运算符

<> 比较运算符

<=> (自PHP 7.0起)

  • 太空飞船(三路比较)操作员

| 按位运算符

|| 逻辑运算符

~ 按位运算符

+ 算术运算符数组运算符

+=-= 赋值运算符

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

.= 分配运营商

. 字符串运算符

, 函数参数

, 变量声明

$$ 变量变量

` 执行运营商

<?= 短开标签

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

<? 打开和关闭标签

... 参数解包 (自PHP 5.6起)

** Exponentiation (自PHP 5.6起)

# 单行shell风格的评论


按位运算符

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


<=>宇宙飞船运营商

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

Null Coalesce Operator php

对于需要与isset()一起使用三元数的常见情况,已将空合并运算符(??)添加到PHP7中。 它返回第一个操作数(如果存在)并且不为NULL,否则返回其第二个操作数,如下例所示:

$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; 

类型操作符

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

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

以上示例将输出:

bool(true)
bool(false)

原因:上面的示例$amclass一个对象,因此只使用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)

递增/递减运算符

++增量运算符

--递减运算符

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++;
}

一旦达到zaa就是下一个,依此类推。

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

帖子:


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"

题:

=>是什么意思?

回答:

=>我们人类决定使用的符号来分离关联数组中的"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 )。

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

  • 继承关联数组的声明,您不仅要包含要放入数组中的值,还要在后面的部分中调用数组时使用的索引值(称为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对之间的关​​联数组的关系。在数组内的值的启动期间


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

===用于检查变量值*和**数据类型的相等性

$a = 5

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

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

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

  4. if ($a === '5') - 将评估为false,因为value为5,但此值5不是整数。


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( null合并运算符 - 需要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减1,然后返回$ 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步的位移到右边(每一步意味着“除以2”)

字符串运算符:

  • $ 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 operator和or运算符的优先级低于赋值运算符=

这意味着$a = true and false; 相当于($a = true) and false

在大多数情况下,您可能希望使用&&|| ,其行为方式以C,Java或JavaScript等语言为基础。


宇宙飞船运营商<=> (在PHP 7中添加)

<=> Spaceship运算符的示例(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

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

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

空结合运算符(??)

在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';
?>





php-5.3