gpt4 book ai didi

php - PHP 编程语言中的 'identifier' 和 'reference' 概念有什么区别?

转载 作者:行者123 更新时间:2023-12-04 10:13:07 28 4
gpt4 key购买 nike

References in PHP are a means to access the same variable content by different names and they are not actual memory addresses. Instead, they are symbol table aliases. And, when an object is sent by argument, returned or assigned to another variable, the different variables are not aliases: they hold a copy of the identifier, which points to the same object.



另一方面,我知道,标识符是赋予实体的名称(而不是像 PHP 中的引用那样的内存位置)。在这种情况下,您能解释一下 PHP 中“标识符”和“引用”之间的区别吗?

最佳答案

让我们从您报价的最后一部分开始。

And, when an object is sent by argument, returned or assigned to another variable, the different variables are not aliases: they hold a copy of the identifier, which points to the same object.



对象标识符

通常,对象标识符是标识对象的整数值。让我们从一个裸类 A 创建一些对象.我们将使用 SPL 的 spl_object_id()var_dump()职能。

这两个函数都返回 对象句柄 对于给定的对象。 对象句柄不是内存地址 .
class A {}

$a = new A();
$b = $a;

var_dump($a) . PHP_EOL;
var_dump($b) . PHP_EOL;

// object(A)#1 (0) { Notice #1 - an identifier
// }

// object(A)#1 (0) { Notice #1 - an identifier
// }

echo spl_object_id($a) . PHP_EOL; // Outputs: 1 - an identifier
echo spl_object_id($b) . PHP_EOL; // Outputs: 1 - an identifier
$a$b持有标识符的副本,该副本指向同一个对象 (A)。

如果一个 PHP 脚本创建了 500 个对象,那么每个对象 ID 在对象的生命周期内都是唯一的。每个对象 id 都可以用作存储对象或标识对象的键,只要该对象没有被销毁/垃圾收集即可。一旦对象被销毁,它的 id 可能会被其他对象重用。

现在,让我们从您报价的第一部分开始。

References in PHP are a means to access the same variable content by different names and they are not actual memory addresses. Instead, they are symbol table aliases.



引用

在 PHP 中, 引用 有不同的含义。因此,它允许您访问具有不同变量名称的值。引用由 创建& PHP 中的运算符:
$a = 12;

// Notice the & (ampersand)
$b = & $a; // $b = 12;

$b = 20; // $a = 20; now

在这里我们可以访问值 20使用 $a$b .好的!我们现在需要知道当我们为变量 赋值时会发生什么。因为你引用了不同的变量名实际上不是内存地址 .让我们深入研究一下。

zval 容器

PHP 变量存储在名为 的容器中。 zval . zval 容器是在创建具有常量值的新变量时创建的,例如:
$a = "hello";

zval 容器存储有关变量的四种类型的信息:
  • 类型 - 变量的类型
  • 值 - 变量的值
  • is_ref - 一个 bool 值,表示变量是否是“引用集”的一部分
  • refcount - 保存有多少变量名(也称为符号)指向这个 zval 容器

  • 有一个名为 xdebug_debug_zval() 的函数当 Xdebug 时可用已安装;它可以帮助您深入了解带有值的变量如何驻留在 zval 容器中。
    $a = "hello";
    xdebug_debug_zval('a');

    这输出如下:
    a: (refcount=1, is_ref=0)='hello'

    或者,您可以将 zval 容器想象为以下图形:

    enter image description here

    符号表

    zval 容器不包含变量名称。这些存储在所谓的符号表中。在符号表中,我们“引用”部分的示例如下所示:
    symbol | value
    -------+------
    a, b | 20

    所以 ab符号在这里是别名。这仅适用于标量类型。

    PHP 中有四种类型的作用域 - 局部、全局、静态和函数参数。每个级别的范围都有一个符号表。与标量值相反, 数组 对象 将它们的属性存储在它们自己的符号表中。在符号表中,我们“对象标识符”部分的示例如下所示:
    $a = new A();
    $b = $a;

    symbol | value object | details
    -------+--------- -------------+--------
    a | object(A)#1 object(A)#1 | class A { ... }
    b | object(A)#1

    这里 ab符号不是别名。它们持有指向同一个对象的标识符的副本。

    引用:
  • https://www.php.net/manual/en/features.gc.refcounting-basics.php
  • http://www.levijackson.net/php-zvals-and-symbol-tables/
  • Objects and references in php 5
  • https://github.com/php/php-src/pull/2611
  • https://github.com/php/php-src/commit/5097e2ee13de12b4445b4123e1554c0733c6853c
  • 关于php - PHP 编程语言中的 'identifier' 和 'reference' 概念有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61228494/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com