## 入门

### hello.php

    <?php // 以 PHP 开放标签开头
    echo "Hello World\n";
    print("Hello quickref.me");
    ?>

PHP 运行命令

    $ php hello.php

### 变量 Variables

    $boolean1 = true;
    $boolean2 = True;
    $int = 12;
    $float = 3.1415926;
    unset($float);  // 删除变量
    $str1 = "How are you?";
    $str2 = 'Fine, thanks';

查看: Types

### 字符串 Strings

    $url = "quickref.me";
    echo "I'm learning PHP at $url";
    // 连接字符串
    echo "I'm learning PHP at " . $url;
    $hello = "Hello, ";
    $hello .= "World!";
    echo $hello;   # => Hello, World!

查看: Strings

### 数组 Arrays

    $num = [1, 3, 5, 7, 9];
    $num[5] = 11;
    unset($num[2]);    // 删除变量
    print_r($num);     # => 1 3 7 9 11
    echo count($num);  # => 5

查看: Arrays

### 运算符 Operators

    $x = 1;
    $y = 2;
    $sum = $x + $y;
    echo $sum;   # => 3

查看: Operators

### Include

#### vars.php

    <?php // 以 PHP 开放标签开头。
    $fruit = 'apple';
    echo "I was imported";
    return 'Anything you like.';
    ?>

#### test.php

    <?php
    include 'vars.php';
    echo $fruit . "\n";   # => apple
    /* 与 include 相同，
    如果不能包含则导致错误*/
    require 'vars.php';
    // 也有效
    include('vars.php');
    require('vars.php');
    // 通过 HTTP 包含
    include 'http://x.com/file.php';
    // 包含和返回语句
    $result = include 'vars.php';
    echo $result;  # => Anything you like.
    ?>

### 功能 Functions

    function add($num1, $num2 = 1) {
        return $num1 + $num2;
    }
    echo add(10);    # => 11
    echo add(10, 5); # => 15

查看: Functions

### 注释 Comments

    # 这是一个单行 shell 样式的注释
    // 这是一行 c++ 风格的注释
    /* 这是一个多行注释
        另一行注释 */

### 常数 Constants

    const MY_CONST = "hello";
    echo MY_CONST;   # => hello

    # => MY_CONST is: hello
    echo 'MY_CONST is: ' . MY_CONST;

### 类 Classes

    class Student {
      public function __construct($name) {
          $this->name = $name;
      }
    }
    $alex = new Student("Alex");

查看: Classes

## PHP 类型

### 布尔值 Boolean

    $boolean1 = true;
    $boolean2 = TRUE;
    $boolean3 = false;
    $boolean4 = FALSE;
    $boolean5 = (boolean) 1;   # => true
    $boolean6 = (boolean) 0;   # => false

布尔值不区分大小写

### 整数 Integer

    $int1 = 28;    # => 28
    $int2 = -32;   # => -32
    $int3 = 012;   # => 10 (octal)
    $int4 = 0x0F;  # => 15 (hex)
    $int5 = 0b101; # => 5  (binary)
    # => 2000100000 (decimal, PHP 7.4.0)
    $int6 = 2_000_100_000;

另见: Integers

### 字符串 Strings

    echo 'this is a simple string';

查看: Strings

### 数组 Arrays

    $arr = array("hello", "world", "!");

查看: Arrays

### 浮点数 Float (Double)

    $float1 = 1.234;
    $float2 = 1.2e7;
    $float3 = 7E-10;
    $float4 = 1_234.567;  // as of PHP 7.4.0
    var_dump($float4);    // float(1234.567)
    $float5 = 1 + "10.5";   # => 11.5
    $float6 = 1 + "-1.3e3"; # => -1299

### Null

    $a = null;
    $b = 'Hello php!';
    echo $a ?? 'a is unset'; # => a is unset
    echo $b ?? 'b is unset'; # => Hello php
    $a = array();
    $a == null    # => true
    $a === null   # => false
    is_null($a)   # => false

### 可迭代对象 Iterables

    function bar(): iterable {
      return [1, 2, 3];
    }
    function gen(): iterable {
      yield 1;
      yield 2;
      yield 3;
    }
    foreach (bar() as $value) {
      echo $value;   # => 123
    }

## PHP 字符串

### 字符串 String

    # => '$String'
    $sgl_quotes = '$String';
    # => 'This is a $String.'
    $dbl_quotes = "This is a $sgl_quotes.";
    # => a    tab character.
    $escaped   = "a \t tab character.";
    # => a slash and a t: \t
    $unescaped = 'a slash and a t: \t';

### 多行 Multi-line

    $str = "foo";
    // 未插值的多行
    $nowdoc = <<<'END'
    Multi line string
    $str
    END;
    // 将执行字符串插值
    $heredoc = <<<END
    Multi line
    $str
    END;

### 操作 Manipulation

    $s = "Hello Phper";
    echo strlen($s);       # => 11
    echo substr($s, 0, 3); # => Hel
    echo substr($s, 1);    # => ello Phper
    echo substr($s, -4, 3);# => hpe
    echo strtoupper($s);   # => HELLO PHPER
    echo strtolower($s);   # => hello phper
    echo strpos($s, "l");      # => 2
    var_dump(strpos($s, "L")); # => false

另见: 字符串函数

## PHP 数组

### 定义

    $a1 = ["hello", "world", "!"]
    $a2 = array("hello", "world", "!");
    $a3 = explode(",", "apple,pear,peach");

#### 混合 int 和 string 键

    $array = array(
        "foo" => "bar",
        "bar" => "foo",
        100   => -100,
        -100  => 100,
    );
    var_dump($array);

#### 短数组语法

    $array = [
        "foo" => "bar",
        "bar" => "foo",
    ];

### 多阵列

    $multiArray = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
    ];
    print_r($multiArray[0][0]) # => 1
    print_r($multiArray[0][1]) # => 2
    print_r($multiArray[0][2]) # => 3

### 多类型

    $array = array(
        "foo" => "bar",
        42    => 24,
        "multi" => array(
             "dim" => array(
                 "a" => "foo"
             )
        )
    );
    # => string(3) "bar"
    var_dump($array["foo"]);
    # => int(24)
    var_dump($array[42]);
    # =>  string(3) "foo"
    var_dump($array["multi"]["dim"]["a"]);

### 操作

    $arr = array(5 => 1, 12 => 2);
    $arr[] = 56;      // 附加
    $arr["x"] = 42;   // 用键添加
    sort($arr);       // 排序
    unset($arr[5]);   // 消除
    unset($arr);      // 移除所有

查看: 数组函数

### 索引迭代

    $array = array('a', 'b', 'c');
    $count = count($array);
    for ($i = 0; $i < $count; $i++) {
        echo "i:{$i}, v:{$array[$i]}\n";
    }

### 价值迭代

    $colors = array('red', 'blue', 'green');
    foreach ($colors as $color) {
        echo "Do you like $color?\n";
    }

### 关键迭代

    $arr = ["foo" => "bar", "bar" => "foo"];
    foreach ( $arr as $key => $value )
    {
        echo "key: " . $key . "\n";
        echo "val: {$arr[$key]}\n";
    }

### 串联阵列

    $a = [1, 2];
    $b = [3, 4];
    // PHP 7.4 以后
    # => [1, 2, 3, 4]
    $result = [...$a, ...$b];

### Into 函数

    $array = [1, 2];
    function foo(int $a, int $b) {
      echo $a; # => 1
        echo $b; # => 2
    }
    foo(...$array);

### Splat运算符

    function foo($first, ...$other) {
      var_dump($first); # => a
        var_dump($other); # => ['b', 'c']
    }
    foo('a', 'b', 'c' /*, ...*/ );
    // 或
    function foo($first, string ...$other){}

## PHP 运算符

### 算术

:- | -
--- | ---
`+` | 添加
`-` | 减法
`*` | 乘法
`/` | 分配
`%` | 取模
`**` | 求幂

### 分配

:- | -
--- | ---
`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` | 或者
`xor` | 独家或
`!` | 不是
`&&` | 和
`||` | 或者

### 算术

    // 算术
    $sum        = 1 + 1; // 2
    $difference = 2 - 1; // 1
    $product    = 2 * 2; // 4
    $quotient   = 2 / 1; // 2
    // 速记算术
    $num = 0;
    $num += 1;       // 将 $num 增加 1
    echo $num++;     // 打印 1（评估后的增量）
    echo ++$num;     // 打印 3（评估前的增量）
    $num /= $float;  // 将商除并分配给 $num

### 按位

:- | -
--- | ---
`&` | 和
` | `
`^` | 异或（异或）
`~` | 不是
`<<` | 左移
`>>` | 右移

## PHP 条件

### If elseif else

    $a = 10;
    $b = 20;
    if ($a > $b) {
        echo "a is bigger than b";
    } elseif ($a == $b) {
        echo "a is equal to b";
    } else {
        echo "a is smaller than b";
    }

### Switch

    $x = 0;
    switch ($x) {
        case '0':
            print "it's zero";
            break;
        case 'two':
        case 'three':
            // do something
            break;
        default:
            // do something
    }

### 三元运算符

    # => Does
    print (false ? 'Not' : 'Does');
    $x = false;
    # => Does
    print($x ?: 'Does');
    $a = null;
    $b = 'Does print';
    # => a is unsert
    echo $a ?? 'a is unset';
    # => print
    echo $b ?? 'b is unset';

### 匹配

    $statusCode = 500;
    $message = match($statusCode) {
      200, 300 => null,
      400 => '未找到',
      500 => '服务器错误',
      default => '已知状态码',
    };
    echo $message; # => 服务器错误

查看: Match

### 匹配表达式

    $age = 23;
    $result = match (true) {
        $age >= 65 => 'senior',
        $age >= 25 => 'adult',
        $age >= 18 => 'young adult',
        default => 'kid',
    };
    echo $result; # => young adult

## PHP 循环

### while 循环

    $i = 1;
    # => 12345
    while ($i <= 5) {
        echo $i++;
    }

### do while 循环

    $i = 1;
    # => 12345
    do {
        echo $i++;
    } while ($i <= 5);

### for i 循环

    # => 12345
    for ($i = 1; $i <= 5; $i++) {
        echo $i;
    }

### break 跳出循环

    # => 123
    for ($i = 1; $i <= 5; $i++) {
        if ($i === 4) {
            break;
        }
        echo $i;
    }

### continue 继续

    # => 1235
    for ($i = 1; $i <= 5; $i++) {
        if ($i === 4) {
            continue;
        }
        echo $i;
    }

### foreach 循环

    $a = ['foo' => 1, 'bar' => 2];
    # => 12
    foreach ($a as $k) {
        echo $k;
    }

查看: Array iteration

## PHP 函数

### 返回值

    function square($x)
    {
        return $x * $x;
    }
    echo square(4);  # => 16

### 返回类型

    // 基本返回类型声明
    function sum($a, $b): float {/*...*/}
    function get_item(): string {/*...*/}
    class C {}
    // 返回一个对象
    function getC(): C { return new C; }

### 可空返回类型

    // 在 PHP 7.1 中可用
    function nullOrString(int $v) : ?string
    {
        return $v % 2 ? "odd" : null;
    }
    echo nullOrString(3);       # => odd
    var_dump(nullOrString(4));  # => NULL

查看: Nullable types

### 无效函数

    // 在 PHP 7.1 中可用
    function voidFunction(): void
    {
      echo 'Hello';
      return;
    }
    voidFunction();  # => Hello

### 变量函数

    function bar($arg = '')
    {
        echo "In bar(); arg: '$arg'.\n";
    }
    $func = 'bar';
    $func('test'); # => In bar(); arg: test

### 匿名函数

    $greet = function($name)
    {
        printf("Hello %s\r\n", $name);
    };
    $greet('World'); # => Hello World
    $greet('PHP');   # => Hello PHP

### 递归函数

    function recursion($x)
    {
        if ($x < 5) {
            echo "$x";
            recursion($x + 1);
        }
    }
    recursion(1);  # => 1234

### 默认参数

    function coffee($type = "cappuccino")
    {
        return "Making a cup of $type.\n";
    }
    # => 制作一杯卡布奇诺
    echo coffee();
    # => 制作一杯
    echo coffee(null);
    # => 制作一杯浓缩咖啡
    echo coffee("espresso");

### 箭头函数

    $y = 1;

    $fn1 = fn($x) => $x + $y;
    // 相当于按值使用 $y：
    $fn2 = function ($x) use ($y) {
        return $x + $y;
    };
    echo $fn1(5);   # => 6
    echo $fn2(5);   # => 6

## PHP 类

### 构造函数 Constructor

    class Student {
        public function __construct($name) {
            $this->name = $name;
        }
        public function print() {
            echo "Name: " . $this->name;
        }
    }
    $alex = new Student("Alex");
    $alex->print();    # => Name: Alex

### 继承 Inheritance

    class ExtendClass extends SimpleClass
    {
        // 重新定义父方法
        function displayVar()
        {
            echo "Extending class\n";
            parent::displayVar();
        }
    }
    $extended = new ExtendClass();
    $extended->displayVar();

### 类变量 Classes variables

    class MyClass
    {
        const MY_CONST         = 'value';
        static $staticVar      = 'static';
        // 可见度
        public static $var1    = 'pubs';
        // 仅限类
        private static $var2   = 'pris';
        // 类和子类
        protected static $var3 = 'pros';
        // 类和子类
        protected $var6        = 'pro';
        // 仅限类
        private $var7          = 'pri';
    }

静态访问

    echo MyClass::MY_CONST;   # => value
    echo MyClass::$staticVar; # => static

### 魔术方法

    class MyClass
    {
        // 对象被视为字符串
        public function __toString()
        {
            return $property;
        }
        // 与 __construct() 相反
        public function __destruct()
        {
            print "Destroying";
        }
    }

### 接口

    interface Foo
    {
        public function doSomething();
    }
    interface Bar
    {
        public function doSomethingElse();
    }
    class Cls implements Foo, Bar
    {
        public function doSomething() {}
        public function doSomethingElse() {}
    }

## 各种各样的

### 基本错误处理

    try {
        // 做一点事
    } catch (Exception $e) {
        // 处理异常
    } finally {
        echo "Always print!";
    }

### PHP 8.0 中的异常

    $nullableValue = null;
    try {
      $value = $nullableValue ?? throw new InvalidArgumentException();
    } catch (InvalidArgumentException) { // 变量是可选的
        // 处理我的异常
        echo "print me!";
    }

### 自定义异常

    class MyException extends Exception {
        // 做一点事
    }

用法

    try {
        $condition = true;
        if ($condition) {
            throw new MyException('bala');
        }
    } catch (MyException $e) {
        // 处理我的异常
    }

### Nullsafe 运算符

    // 从 PHP 8.0.0 开始，这一行：
    $result = $repo?->getUser(5)?->name;
    // 相当于下面的代码：
    if (is_null($repo)) {
        $result = null;
    } else {
        $user = $repository->getUser(5);
        if (is_null($user)) {
            $result = null;
        } else {
            $result = $user->name;
        }
    }

另见: Nullsafe 运算符

### 常用表达

    $str = "Visit Quickref.me";
    echo preg_match("/qu/i", $str); # => 1

查看: PHP中的正则表达式

### fopen() 模式

:- | -
--- | ---
`r` | 读
`r+` | 读写，前置
`w` | 写入，截断
`w+` | 读写，截断
`a` | 写，追加
`a+` | 读写，追加

### 运行时定义的常量

    define("CURRENT_DATE", date('Y-m-d'));
    // 一种可能的表示
    echo CURRENT_DATE;   # => 2021-01-05
    # => CURRENT_DATE is: 2021-01-05
    echo 'CURRENT_DATE is: ' . CURRENT_DATE;

## 另见

- PHP 官方中文文档 (php.net)
- Learn X in Y minutes (learnxinyminutes.com)