程序员书籍笔记 程序员书籍笔记
  • JavaScript
  • HTML/CSS
  • PHP
  • Python
  • Go
  • 数据库
  • 容器
  • 微服务
  • 消息队列
  • 搜索引擎
  • 大数据
  • 鸟哥Linux私房菜
其他
  • 大数据
  • 深度学习
APP下载 (opens new window)
GitHub (opens new window)
  • JavaScript
  • HTML/CSS
  • PHP
  • Python
  • Go
  • 数据库
  • 容器
  • 微服务
  • 消息队列
  • 搜索引擎
  • 大数据
  • 鸟哥Linux私房菜
其他
  • 大数据
  • 深度学习
APP下载 (opens new window)
GitHub (opens new window)
  • PHP

    • 官方文档

      • 基本语法
      • 函数
      • 类与对象
      • 命名空间
      • 错误和异常
      • 生成器和注解
      • 引用和预定义
        • 引用介绍
          • 什么是引用
          • 引用做什么
        • 引用传递
        • 引用返回
        • 引用取消
        • 引用定位
          • global 引用
        • 预定义变量
        • 预定义异常
        • 预定义接口
      • 上下文与支持的协议
      • 安全和特点
  • Python

  • Go

  • 后端
  • PHP
  • 官方文档
小游
2021-04-26

引用和预定义

# 引用介绍

# 什么是引用

在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针:例如你不能对他们做指针运算,他们并不是实际的内存地址…… 查看引用不是什么 (opens new window)了解更多信息。 替代的是,引用是符号表别名。注意在PHP 中,变量名和变量内容是不一样的, 因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的硬链接

# 引用做什么

PHP 的引用允许用两个变量来指向同一个内容。意思是,当这样做时:

<?php $a =& $b; ?>
1

这意味着 $a 和 $b 指向了同一个变量。注意:$a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方。

引用是可以传递的

引用做的第二件事是用引用传递变量。这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的。例如:

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
?>
1
2
3
4
5
6
7
8
9

将使 $a 变成 6。这是因为在 foo 函数中变量 $var 指向了和 $a 指向的同一个内容。更多详细解释见引用传递 (opens new window)。

# 引用传递

可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。语法如下:

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a is 6 here
1
2
3
4
5
6
7
8
9

注意在函数调用时没有引用符号——只有函数定义中有。光是函数定义就足够使参数通过引用来正确传递了。

以下内容可以通过引用传递:

  • 变量,例如 foo($a)
  • 从函数中返回的引用,例如:
<?php
function foo(&$var)
{
    $var++;
}
function &bar()
{
    $a = 5;
    return $a;
}
foo(bar());
1
2
3
4
5
6
7
8
9
10
11

# 引用返回

引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。 不要用返回引用来增加性能,引擎足够聪明来自己进行优化。 仅在有合理的技术原因时才返回引用! 使用此语法返回引用:

<?php
class foo {
    public $value = 42;

    public function &getValue() {
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue;                // prints the new value of $obj->value, i.e. 2.
1
2
3
4
5
6
7
8
9
10
11
12
13

# 引用取消

当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

<?php
$a = 1;
$b =& $a;
unset($a);
?>
1
2
3
4
5

不会 unset $b,只是 $a。

再拿这个和 Unix 的 unlink 调用来类比一下可能有助于理解。

# 引用定位

许多 PHP 的语法结构是通过引用机制实现的,所以上述有关引用绑定的一切也都适用于这些结构。 一些结构,例如引用传递和返回,已经在上面提到了。 其它使用引用的结构有:

# global 引用

当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。 也就是说和这样做是相同的:

<?php
$var =& $GLOBALS["var"];
?>
1
2
3

这意味着,例如,unset $var 不会 unset 全局变量。

# 预定义变量

这里就直接贴链接了,自己看吧

  • 超全局变量 (opens new window) — 超全局变量是在全部作用域中始终可用的内置变量
  • $GLOBALS (opens new window) — 引用全局作用域中可用的全部变量
  • $_SERVER (opens new window) — 服务器和执行环境信息
  • $_GET (opens new window) — HTTP GET 变量
  • $_POST (opens new window) — HTTP POST 变量
  • $_FILES (opens new window) — HTTP 文件上传变量
  • $_REQUEST (opens new window) — HTTP Request 变量
  • $_SESSION (opens new window) — Session 变量
  • $_ENV (opens new window) — 环境变量
  • $_COOKIE (opens new window) — HTTP Cookies
  • $php_errormsg (opens new window) — 前一个错误信息
  • $http_response_header (opens new window) — HTTP 响应头
  • $argc (opens new window) — 传递给脚本的参数数目
  • $argv (opens new window) — 传递给脚本的参数数组

# 预定义异常

这里就是自己预先定义的一些异常

  • Exception (opens new window)
  • ErrorException (opens new window)
  • Error (opens new window)
  • ArgumentCountError (opens new window)
  • ArithmeticError (opens new window)
  • AssertionError (opens new window)
  • DivisionByZeroError (opens new window)
  • CompileError (opens new window)
  • ParseError (opens new window)
  • TypeError (opens new window)

# 预定义接口

  • 遍历 (opens new window)
  • 迭代器 (opens new window)
  • 聚合式迭代器 (opens new window)
  • 数组式访问 (opens new window)
  • 序列化 (opens new window)
  • Closure (opens new window)
  • 生成器 (opens new window)
编辑 (opens new window)
上次更新: 2021/05/08, 22:02:42
生成器和注解
上下文与支持的协议

← 生成器和注解 上下文与支持的协议→

Theme by Vdoing | Copyright © 2021-2021 小游
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式