zoukankan      html  css  js  c++  java
  • PHP语法总结

    以下内容总结自http://php.net/manual/zh/

    • 基本语法
      • 从HTML中分离:
        • 大多数情况下 PHP 都是嵌入在 HTML 文档中的
        • 高级分离技术:

    PHP遇到?>结束符号后会直接打印下面的内容

    <?php

    if ($expression) {

        ?>

        <strong>This is true.</strong>

        <?php

    } else {

        ?>

        <strong>This is false.</strong>

        <?php

    }

    ?>

    • 指令分隔符:用分号
    • 注释:/*……*/  或//
    • 类型
      • 支持的类型
        • boolean、integer、float、string四种标准型,array、object两种复合型,还有Resource、NULL、callable三种特殊类型
        • 在调试时使用var_dump查看关于变量的所有信息,(会将对象全部属性展开打印出来)和他相同的还有print_r() 显示关于一个变量的易于理解的信息。
      • 类型转换
        • $foo = (int)$bar;
        • 或settype($foo, "integer");
      • 判断是否是某个类型
        • 使用is_int( )、is_string()等
        • if (is_int($an_int)){…..}
        • 得到类型:gettype()
      • 基本变量的一些参考
        • PHP_INT_SIZE表示int的字长
        • PHP_INT_MAX表示int的最大值
        • 当从浮点数转换成整数时,将向零取整。
      • 字符串
        • unicode编码:使用 utf8_encode()和 utf8_decode()
        • 单引号:所有的字符原样输出,单引号本身用\转义
        • 双引号:支持转义字符,双引号中间的变量会被替换成值,可用花括号明确表明界限

    "He drank some {$beer}s"

    • heredoc结构:像一个没用引号括起来的双引号字符串,用<<<+标签名表示开头,用标签结束。结束标签必须在一行的开头例如:

    $str = <<<EOD

    Example of string

    spanning multiple lines

    using heredoc syntax.

    EOD;

    标签可用双引号括起来以示和Nowdoc的区别

    • Nowdoc结构:不进行任何转义操作。标签用单引号括起来。

    $str = <<<'EOD'

    Example of string

    spanning multiple lines

    using nowdoc syntax.

    EOD;

    • 字符串中的变量名可以直接由其他字符串解析生成

    <?php

    $a = "foo";

    $foo = "this is foo";

    echo "{${$a}}";

    ?>

    • 读写字符
      • $str[2] = 'a';
      • strlen:取字符串长度
      • substr(string $string , int $start [, int $length ] )取一个子串。
    • 其他操作
      • 连接:用点.直接连接,不能用加号。
      • 若和数字相加,则转化成数值如"10 pigs"+3=3
    • 数组
      • 概述:PHP的数组是一个把value映射到key的有序映射,key还可以是数组,因此可以表示很多数据结构。
      • 定义数组:

    array(  key =>  value
         , ...
         )
    // 键(key) 可是是一个 整数(integer) 或 字符串(string),不能用数组和对象作为键(key)。省略键名则键名自动变为整数。$firstquarter  = array(1 => 'January', 'February', 'March');将自动累加
    // 值(value) 可以是任意类型的值

    • 访问:使用方括号访问

    $arr[key] = value;

    $arr[] = value;//新建元素

    • 删除键:unset($arr[5]);

    unset($arr);//全部删除

    • 遍历数组:foreach($arry as $i)
    • 对象
      • 使用new建立。详见后面的讨论

    <?php

    class foo

    {

        function do_foo()

        {

            echo "Doing foo."; 

        }

    }

    $bar = new foo;

    $bar->do_foo();

    ?>

    • 资源类型:
      • 保存打开文件、数据库连接、图形画布区域等的特殊句柄。
    • NULL类型:
      • 空类型
    • Callbacks类型
      • 回调函数

    function my_callback_function() {

      

     echo 'hello world!';

    }

    call_user_func('my_callback_function');

    • 伪类型
      • $... 表示等等的意思。
    • 变量
      • 基础
        • 变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。
        • $this是一个特殊的变量,它不能被赋值。
        • 变量默认总是传值赋值。
        • 引用赋值:(同C++)

    $foo = 'Bob';              // 将 'Bob' 赋给 $foo

    $bar = &$foo;  

    • 预定义变量
      • 见预定义变量章节
    • 变量范围
      • 和C语言不同,PHP 中全局变量在函数中使用时必须申明为global。以下代码将不会产生任何输出:

    <?php

    $a = 1; /* global scope */

    function Test()

    {

        echo $a; /* reference to local scope variable */

    }

    Test();

    ?>

    • 声明全局变量例子:

    <?php

    $a = 1;

    $b = 2;

    function Sum()

    {

        global $a, $b;

        $b = $a + $b;

    }

    Sum();

    echo $b;

    ?>

    • 全局变量的使用还可以通过超全局变量数组$GLOBALS

    <?php

    $a = 1;

    $b = 2;

    function Sum()

    {

        $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];

    }

    Sum();

    echo $b;

    ?>

    • 静态变量:仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
    • 可变变量:

    一个变量的变量名可以动态的设置和使用。

    <?php

    $a = "foo";

    $$a = "this is foo";

    echo $foo;

    ?>

    • 来自PHP外的变量
      • 有_GET、_POST等
    • 常量
      • 常量的范围是全局的。不应该在常量前面加上 $ 符号
      • 定义
        • 用define("FOO",     "something");定义。
        • 用const定义:const CONSTANT = 'Hello World';
      • 魔术常量
        • 多由他们所在代码位置决定。常用 的见下表:

    名称

    说明

    __LINE__

    文件中的当前行号。

    __FILE__

    文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

    __DIR__

    文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =

    __FUNCTION__

    函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

    __CLASS__

    类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

    __METHOD__

    类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

    __NAMESPACE__

    当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

    几个 PHP 的“魔术常量”

    • 表达式
      • 定义:任何有值的东西。
      • 和C语言一样,赋值,比较等表达式有值,支持 ++ += 和$first ? $second : $third
    • 运算符
      • 优先级:

    运算符优先级

    结合方向

    运算符

    附加信息

    非结合

    clone new

    clone 和 new

    [

    array()

    非结合

    ++ --

    递增/递减运算符

    非结合

    ~ - (int) (float) (string) (array) (object) (bool) @

    类型

    非结合

    instanceof

    类型

    右结合

    !

    逻辑操作符

    * / %

    算术运算符

    + - .

    算术运算符 和 字符串运算符

    << >>

    位运算符

    非结合

    < <= > >= <>

    比较运算符

    非结合

    == != === !==

    比较运算符

    &

    位运算符 和 引用

    ^

    位运算符

    |

    位运算符

    &&

    逻辑运算符

    ||

    逻辑运算符

    ? :

    三元运算符

    = += -= *= /= .= %= &= |= ^= <<= >>=

    赋值运算符

    and

    逻辑运算符

    xor

    逻辑运算符

    or

    逻辑运算符

    ,

    多处用到

    • 算数运算符

    例子

    名称

    结果

    -$a

    取反

    $a 的负值。

    $a + $b

    加法

    $a 和 $b 的和。

    $a - $b

    减法

    $a 和 $b 的差。

    $a * $b

    乘法

    $a 和 $b 的积。

    $a / $b

    除法

    $a 除以 $b 的商。

    $a % $b

    取模

    $a 除以 $b 的余数。$a<0时也<0

    • 位运算

    例子

    名称

    结果

    $a & $b

    And(按位与)

    将把 $a 和 $b 中都为 1 的位设为 1。

    $a | $b

    Or(按位或)

    将把 $a 或者 $b 中为 1 的位设为 1。

    $a ^ $b

    Xor(按位异或)

    将把 $a 和 $b 中不同的位设为 1。

    ~ $a

    Not(按位非)

    将 $a 中为 0 的位设为 1,反之亦然。

    $a << $b

    Shift left(左移)

    将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。

    $a >> $b

    Shift right(右移)

    将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

    • 比较运算符

    例子

    名称

    结果

    $a == $b

    等于

    TRUE,如果 $a 等于 $b。

    $a === $b

    全等

    TRUE,如果 $a 等于 $b,并且它们的类型也相同。(PHP 4 引进)

    $a != $b

    不等

    TRUE,如果 $a 不等于 $b。

    $a <> $b

    不等

    TRUE,如果 $a 不等于 $b。

    $a !== $b

    非全等

    TRUE,如果 $a 不等于 $b,或者它们的类型不同。(PHP 4 引进)

    $a < $b

    小与

    TRUE,如果 $a 严格小于 $b。

    $a > $b

    大于

    TRUE,如果 $a 严格 $b。

    $a <= $b

    小于等于

    TRUE,如果 $a 小于或者等于 $b。

    $a >= $b

    大于等于

    TRUE,如果 $a 大于或者等于 $b。

    • 错误控制运算符

    @。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。但是不能把它放在函数或类的定义 ,if 和 foreach 不能用。

    • 执行运算符

    反引号`……`(数字1左边那个键),PHP 将尝试将反引号中的内容作为外壳命令来执行,h和shell_exec()一样。

    <?php

    $output = `ls -al`;

    echo "<pre>$output</pre>";

    ?>

    • 自增自减运算符:同C
    • 逻辑运算符

    例子

    名称

    结果

    $a and $b

    And(逻辑与)

    TRUE,如果 $a 与 $b 都为 TRUE。

    $a or $b

    Or(逻辑或)

    TRUE,如果 $a 或 $b 任一为 TRUE。

    $a xor $b

    Xor(逻辑异或)

    TRUE,如果 $a 或 $b 任一为 TRUE,但不同时是。

    ! $a

    Not(逻辑非)

    TRUE,如果 $a 不为 TRUE。

    $a && $b

    And(逻辑与)

    TRUE,如果 $a 与 $b 都为 TRUE。

    $a || $b

    Or(逻辑或)

    TRUE,如果 $a 或 $b 任一为 TRUE。

    • 字符串运算符:.和.=
    • 数组运算符

    例子

    名称

    结果

    $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。

    • 类型运算符instanceof

    用于确定一个 PHP 变量是否属于某一类 class 或接口 Interface的实例。

    <?php

    class MyClass

    {

    }

    $a = new MyClass;//输出bool(true)

    var_dump($a instanceof MyClass);

    ?>

    • 控制结构
      • If
        • If(expr){

    }elseif{//就比C多了个elseif

    }elseif{

    }else{

    }

    • 流程控制的替换结构:
      • 常用于和html交叉的时候,如果只有花括号,则看不清楚。规则是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。

    <?php if ($a == 5): ?>

    A is equal to 5

    <?php endif; ?>

    • while,do-while:同C
    • 一种奇葩的do-while写法,用于解决分支判断。

    <?php

    do {

        if ($i < 5) {

            echo "i is not big enough";

            break;

        }

        $i *= $factor;

        if ($i < $minimum_limit) {

            break;

        }

        echo "i is ok";

        /* process i */

    } while(0);

    ?>

    • for:同C
    • foreach

    foreach (array_expression as $value)
        statement
    foreach (array_expression as $key => $value)
        statement

    • 每次循环中,当前单元的值被赋给 $value,键名也会在每次循环中被赋给变量 $key
    • foreach 不支持用“@”来抑制错误信息的能力。
    • 修改数组值的方法:
      • 使用引用

    foreach ($arr as &$value) {

        $value = $value * 2;

    }

    • break,continue
      • break 可以接受一个可选的数字参数来决定跳出几重循环。
      • continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。
    • switch-case
      • 同C,但是可接受字符串做case的内容
    • require 和include
      • require 语句包含并运行指定文件。require 和 include 几乎完全一样,除了处理失败的方式不同之外。 include 产生一个Warning而 require 则导致一个 Fatal Error。
    • Require_once和include_once
      • 只包含一次
    • goto
    • 函数
      • PHP 中的所有函数和类都具有全局作用域,可以在内部定义外部调用,反之亦然。
      • PHP 不支持函数重载,也不可能取消定义或者重定义已声明的函数。
      • PHP 可以再函数中定义函数,但是里面的函数必须等到外面函数执行后才有定义

    function foo()

    {

      function bar()

      {

        echo "I don't exist until foo() is called.\n";

      }

    }

    • PHP 支持可变数量的参数和默认参数。具体请参考: func_num_args(), func_get_arg(),以及 func_get_args()
    • 参数:
      • 一般是值传递,引用传递需加&。
      • 支持默认参数,默认值需为常数,任何默认参数必须放在任何非默认参数的右侧
    • 返回引用
      • 需在函数声明和使用时同时使用&符号

    <?php

    function &returns_reference()

    {

        return $someref;

    }

    $newref =& returns_reference();

    ?>

    • 可变函数
      • 如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。

    <?php

    function foo() {

        echo "In foo()<br />\n";

    }

    $func = 'foo';

    $func();        // This calls foo()

    ?>

    • 用function_exists检查这个函数是否存在,用call_user_func调用(和可变函数等价)
    • 匿名函数
      • (Anonymous functions),也叫闭包函数(closures)允许 临时创建一个没有指定名称的函数。最经常用作回调函数(callback)的参数
      • 匿名函数目前是通过 Closure类来实现的。目前还不稳定,不适用于正式开发。
    • 类与对象
      • 基本概念
        • $this 是一个到调用对象的引用。
        • 声明实例

    <?php

    class SimpleClass

    {

        // 成员声明

        public $var = 'a default value';

        // 方法声明

        public function displayVar() {

            echo $this->var;

        }

    }

    ?>

    • 成员初始化应该用常量,不能用表达式,即使表达式是常量。
    • 对象复制默认采用引用的形式

    <?php

    $instance = new SimpleClass();

    $assigned   =  $instance;

    ?>

    assigned是instance的一个引用

    • 继承
      • 使用extends
      • 不能多继承
      • 可以通过 parent:: 来访问被覆盖的方法或成员。
    • 属性
      • 访问控制类型:public, protected, 和 private
      • 访问方式(有点像指针):$this->property(property是属性名字),不加$
      • 静态属性:self::$property,self指该类
      • nowdocs可以在声明时使用,可以初始化任何静态数据。heredocs不行。

    public $var8 = <<<'EOD'

    hello world

    EOD;

    正确

    • public $var2 = <<<EOD

    hello world

    EOD;

    错误

    • 自动加载对象
      • 使用__autoload函数

    <?php

    function __autoload($class_name) {

        require_once $class_name . '.php';

    }

    $obj  = new MyClass1();

    $obj2 = new MyClass2();

    ?>

    在调用new时,自动加载其文件

    • 构造函数和析构函数
      • 子类构造函数、析构函数不会自动调用父类构造函数,若需调用需显示声明parent::__construct()parent::__destruct()
      • 尽量不要使用和类名相同的函数,防止和以前版本冲突
      • 析构函数即使在使用 exit()终止脚本运行时也会被调用。
    • 访问控制
      • 没有定义访问控制的,默认设置为 public。
    • 范围解析操作符(::)
      • 用于访问静态成员、方法和常量
      • self 和 parent 用于在类的内部对静态成员或方法进行访问
    • Static关键字
      • 不能通过一个对象来访问其中的静态成员(静态方法除外)
      • 伪变量$this在静态方法中不可用
      • 静态属性不可以由对象通过->操作符来访问。
    • 抽象类
      • 抽象类不能直接实例化
      • 子类必须重写所有的抽象方法

    abstract class AbstractClass

    {

     // 强制要求子类定义这些方法

        abstract protected function getValue();

        abstract protected function prefixValue($prefix);

        // 普通方法(非抽象方法)

        public function printOut() {

            print $this->getValue() . "\n";

        }

    }

    • 接口
      • 用interface定义,用implements实现。
      • 一个接口可以继承另一个接口,用extends继承,继承则不用实现。
      • 接口都是public
      • 例:

    interface a

    {

        public function foo();

    }

    interface b extends a

    {

        public function baz(Baz $baz);

    }

    // 正确写法

    class c implements b

    {

        public function foo()

        {

        }

        public function baz(Baz $baz)

        {

        }

    }

    • traits
      • 用于解决无法多重继承的问题
      • 使用关键字traits声明一个traits,在子类里用use关键字引入(可加入多个)。覆盖的优先级是:子类覆盖traits覆盖父类。
      • 若多个traits之间有冲突,通过insteadof和as来消解冲突。as还可改变可见性

    <?php

    trait A {

        public function smallTalk() {

            echo 'a';

        }

        public function bigTalk() {

            echo 'A';

        }

    }

    trait B {

        public function smallTalk() {

            echo 'b';

        }

        public function bigTalk() {

            echo 'B';

        }

    }

    class Talker {

        use A, B {

            B::smallTalk insteadof A;

            A::bigTalk insteadof B;

        }

    }

    class Aliased_Talker {

        use A, B {

            B::smallTalk insteadof A;

            A::bigTalk insteadof B;

            B::bigTalk as talk;

        }

    }

    ?>

    • 重载
      • 和C++完全不一样
      • 重载指调用一个不存在的对象或方法时,将调用指定的魔法函数。
      • 属性重载

    public void __set ( string $name , mixed $value )

    public mixed __get ( string $name )

    public bool __isset ( string $name )

    public void __unset ( string $name )

    在给未定义的变量赋值时,__set() 会被调用。

    读取未定义的变量的值时,__get() 会被调用。

    当对未定义的变量调用 isset() 或 empty()时,__isset() 会被调用。

    当对未定义的变量调用 unset()时,__unset() 会被调用。

    参数$name是指要操作的变量名称。__set() 方法的$value 参数指定了$name变量的值。

    • 方法重载

    public mixed __call ( string $name , array $arguments )

    public static mixed __callStatic ( string $name , array $arguments )

    当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。

    当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。

    $name 参数是要调用的方法名称。$arguments 参数是一个数组,包含着要传递给方法$name 的参数。

    • 对象迭代
      • 就像使用数组那样,可以通过foreach 来遍历对象中的属性。
      • 可以继承系统预定义的接口Iterator,然后重写里面的方法,可自定义迭代的方式。
    • 两个PHP常用的设计模式
      • 工厂模式:
        • 工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是 你要生成的对象对应的类名称。

    <?php

    class Example

    {

        // The parameterized factory method

        public static function factory($type)

        {

            if (include_once 'Drivers/' . $type . '.php') {

                $classname = 'Driver_' . $type;

                return new $classname;

            } else {

                throw new Exception ('Driver not found');

            }

        }

    }

    // Load a MySQL Driver

    $mysql = Example::factory('MySQL');

    // Load a SQLite Driver

    $sqlite = Example::factory('SQLite');

    ?>

    • 单例模式
      • 单例模式(Singleton)用于为一个类生成一个唯一的对象。最常用的地方是数据库连接。 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
      • 通过将构造函数声明成private,禁止生成,重载__clone()方法。
      • 注意PHP5的对象使用引用复制的方式

    <?php

    class Example

    {

        // 保存类实例在此属性中

        private static $instance;

       

           // 构造方法声明为private,防止直接创建对象

        private function __construct()

        {

            echo 'I am constructed';

        }

        // singleton 方法

        public static function singleton()

        {

            if (!isset(self::$instance)) {

                $c = __CLASS__;

                self::$instance = new $c;

            }

            return self::$instance;

        }

       

        // Example类中的普通方法

        public function bark()

        {

            echo 'Woof!';

        }

        // 阻止用户复制对象实例

        public function __clone()

        {

            trigger_error('Clone is not allowed.', E_USER_ERROR);

        }

    }

    ?>

    <?php

    // 这个写法会出错,因为构造方法被声明为private

    $test = new Example;

    // 下面将得到Example类的单例对象

    $test = Example::singleton();

    $test->bark();

    // 复制对象将导致一个E_USER_ERROR.

    $test_clone = clone $test;

    ?>

    • 魔术方法
      • 在类或对象完成一些操作时,会调用魔术方法,如构造和析构就是通过重载的魔术方法来实现。见上面重载小节。
    • final关键字
      • 如果父类中的方法被声明为final,则子类无法覆盖该方法; 如果一个类被声明为final,则不能被继承。
    • 复制对象
      • 因为一般对象复制都是引用复制的形式,因此,想要完全复制,需使用clone关键字
      • $copy_of_object = clone $object;
      • 魔术方法__clone():当复制完成时, 如果定义了__clone()方法, 则新创建的对象(复制生成的对象)中的__clone()方法会被调用
    • 对象比较
      • ==:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等。
      • ===:必须指向同一实例
    • 指定函数参数类型
      • 在PHP中,可以通过在函数参数上加类型来强制指定参数类型。
    • 后期静态绑定
      • static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。
    • 对象序列化
      • 使用函数 serialize()来返回一个包含字节流的字符串来表示。
    • 命名空间
      • 定义命名空间
        • 用namespace关键字来定义,必须放在所有其他代码之前
        • 命名空间可以拆开放在多个文件里面。
      • 子命名空间
        • 命名空间可以分层定义namespace MyProject\Sub\Level;表示是某个命名空间的子命名空间。
      • 在一个文件中定义多个命名空间

    <?php

    namespace MyProject {

    const CONNECT_OK = 1;

    class Connection { /* ... */ }

    function connect() { /* ... */  }

    }

    namespace { // global code

    session_start();

    $a = MyProject\connect();

    echo MyProject\Connection::start();

    }

    ?>

    建议最好用大括号括起来。

    • 使用方式
      • \Foo\Bar\foo::staticmethod();像文件路径一样。
      • 在命名空间内部访问全局类、函数和常量$b = \INI_ALL; // 访问全局常量 INI_ALL
    • 魔法常量__NAMESPACE__
      • 包含当前命名空间名称的字符串。
    • namespace关键字
      •  可用来显式访问当前命名空间或子命名空间中的元素。

    namespace MyProject;

    namespace\blah\mine(); // calls function MyProject\blah\mine()

    • 使用别名导入
      • 使用use  as
      • use My\Full\Classname as Another
    • 全局空间
      • 名称前加上前缀 \ 表示该名称是全局空间中的名称
      • $b = new \Exception('hi'); // $b 是类 Exception 的一个对象
    • 异常处理
      • 同C++
      • class MyException extends Exception继承异常处理
    • Generator
      • 一个函数,使用 yield返回一个generate

    <?php

    function gen_one_to_three() {

        for ($i = 1; $i <= 3; $i++) {

            // Note that $i is preserved between yields.

            yield $i;

        }

    }

    $generator = gen_one_to_three();

    foreach ($generator as $value) {

        echo "$value\n";

    }

    ?>

    每次调用哪个generater都会返回一个值

    • generator只能向前不能向后
    • 引用
      • 同C++
      • 返回引用时 return不要加括号!否则是返回一个表达式的值
      • 取消引用unset()
    • 预定义变量

    超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量

    $GLOBALS — 引用全局作用域中可用的全部变量

    $_SERVER — 服务器和执行环境信息

    $_GET — HTTP GET 变量

    $_POST — HTTP POST 变量

    $_FILES — HTTP 文件上传变量

    $_REQUEST — HTTP Request 变量

    $_SESSION — Session 变量

    $_ENV — 环境变量

    $_COOKIE — HTTP Cookies

    $php_errormsg — 前一个错误信息

    $HTTP_RAW_POST_DATA — 原生POST数据

    $http_response_header — HTTP 响应头

    $argc — 传递给脚本的参数数目

    $argv — 传递给脚本的参数数组

    • 超全局变量
      • 在任何地方都可以使用,包括

    $GLOBALS

    $_SERVER

    $_GET

    $_POST

    $_FILES

    $_COOKIE

    $_SESSION

    $_REQUEST

    $_ENV

  • 相关阅读:
    DotnetCore 单文件发布
    Parallel.ForEach 之 MaxDegreeOfParallelism
    Quartznet速记
    C# SendAysnc 超时
    微耕门禁跨网段搜索代理
    服务守护DOS脚本
    Flutter速记
    ShowDoc速记
    Docker运行dotnetcore
    Redis速记
  • 原文地址:https://www.cnblogs.com/maplewizard/p/2942113.html
Copyright © 2011-2022 走看看