相关疑难解决方法(0)

检测PHP变量是否为引用/引用

在PHP中是否有办法确定给定变量是否是对另一个变量的引用和/或是否由另一个变量引用?我感谢可能无法将检测"引用"和"引用"分开,因为php.net上的注释设置$a=& $b意味着" $ a和$ b在这里完全相同.$ a不指向$ b或者反之亦然.$ a和$ b指向同一个地方. "

如果无法确定给定变量是否为引用/引用,是否有一种通用的方法来确定两个变量是否是彼此的引用?同样,对php.net 的评论提供了进行这种比较的函数 - 尽管它涉及编辑其中一个变量并查看其他变量是否同样受影响.如果可能的话,我宁愿避免这样做,因为我正在考虑的一些变量大量使用魔法吸气剂/设定器.

此实例中请求的背景是编写调试函数以帮助详细查看结构.

php php-internals

24
推荐指数
2
解决办法
4924
查看次数

意外的观察:数组的var_dump()标记引用的元素......从什么时候开始?

我刚刚对数组运行了一些简单的调试,并注意到当我执行数组的var_dump()时,输出会标记数组中由另一个变量引用的任何元素.作为一个简单的实验,我运行了以下代码:

$array = range(1,4);

var_dump($array);
echo '<br />';

foreach($array as &$value) {
}

var_dump($array);
echo '<br />';

$value2 = &$array[1];

var_dump($array);
echo '<br />';
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) } 
array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> ?(4) } 
array(4) { [0]=> int(1) [1]=> ?(2) [2]=> int(3) [3]=> ?(4) } 
Run Code Online (Sandbox Code Playgroud)

注意?元素3旁边的符号和随后的元素1.还请注意,这些条目不显示条目的数据类型.

经过一些实验,如果我使用var_dump标量类型,或者使用对象或资源,我都不会看到这个.如果数组包含字符串数据,则符号为&(并且它仍然显示数据类型),同样具有float,boolean和object条目.

这是针对PHP 5.2.8运行的

第一个问题:这种行为是什么时候开始的,或者是我之前没有注意到的事情?

第二个问题:如果引用元素可以通过var_dump()以这种方式标记,那么核心PHP中是否有任何函数可以识别数组元素是否被另一个变量引用; 或者将从_zval_struct返回refcount或ref标志?

php reference var-dump

7
推荐指数
1
解决办法
1681
查看次数

对字符串文字的所有引用是否都引用相同的实例?

我的一位同事发了一个帖子,上面写着这样的话:

在PHP中,如果有两个变量引用相同的值,则它们是同一个实例.

$a="Mary";
$b="Mary";
$c="lamb"
Run Code Online (Sandbox Code Playgroud)

他暗示$ a和$ b引用相同的实例(内存空间).我无法忍受这个.我知道这在java中有点真实,但我不认为它对于php,因为在php字符串中实际上并不是原则上不可变的,所以有一个实例是没有意义的

此外,他说,如果我们这样做unset($a),只删除$ a的引用而不是实际值.这是真的,但没有任何证据

我也尝试了以下代码并打印$ a和$ b.如果他们共享同一个实例,$ b的值也会发生变化.

$a[2]=3;
echo "<br/>\$a: $a<br/>"; //He3lo
echo "<br/>\$b: $b<br/>";//Hello
Run Code Online (Sandbox Code Playgroud)

我想检查变量的内存空间,但我不认为php允许这样做.有人可以澄清这是否属实

php string

6
推荐指数
1
解决办法
127
查看次数

PHP - 如何检查两个引用是否指向同一底层对象(内存地址)?

我有 Java 背景,对 PHP 有点陌生。

我想知道是否有一个 PHP 相当于 Java 的“==”操作,它基本上检查两个引用是否引用完全相同的底层对象。(PHP 的 == 和 === 更像 Java 的 equals 方法,它检查两个底层对象是否具有相同的值)

澄清:我的问题不是关于 PHP 中 == 和 === 之间的差异,也不是关于如何比较 PHP 中的值。我正在寻找一种方法来查看两个变量是否引用相同的对象/内存地址。相同的对象/内存地址意味着当我更新变量 $a 时,$b 也需要更新,反之亦然,因为 $a 和 $b 引用相同的东西。

php java reference object memory-address

4
推荐指数
1
解决办法
2155
查看次数

我怎样才能获得数组的地址?

我是来自C++/Python/Java的PHP的新用户.在PHP中,有一个内置的数组类型,如何在插入新对象或旧对象的副本后证明数组是相同的数组?在C++/Python/Java中,我可以使用对象地址,id()或hashcode来测试对象是否相同,如何在PHP中进行相同的测试?

<?php
    $a['0'] = "a";
    $a['1'] = 'b'; //here, $a is a new copied one or just a reference to the old?
?>
Run Code Online (Sandbox Code Playgroud)

好的,我更新了我的问题,实际上,没有具体的问题.我只是想知道在插入新值之前和之后数组对象是否保持相同.在Python中,我可以像这样进行测试:

a = [1]

print id(a)
a.append(2)
print id(a)
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这是Python中的id()函数手册.

id(...)
    id(object) -> integer

    Return the identity of an object.  This is guaranteed to be unique among
    simultaneously existing objects.  (Hint: it's the object's memory address.)
Run Code Online (Sandbox Code Playgroud)

代码更新:

 # -*- coding: utf-8 -*-

a = [1, 2, 3]
b = [1, 2, 3]

print id(a)
print id(b)  //the …
Run Code Online (Sandbox Code Playgroud)

php

0
推荐指数
1
解决办法
103
查看次数