是否可以查看两个数组变量是否指向相同的内存位置? (它们是相同的数组)

最佳答案

实际上,这是可以做到的。通过php扩展。

文件:config.m4

PHP_ARG_ENABLE(测试,是否启用测试扩展支持,[--enable-test启用测试扩展支持])

如果测试“$ PHP_TEST” ="is";然后
AC_DEFINE(H​​AVE_TEST,1,[启用测试扩展]
PHP_NEW_EXTENSION(测试,test.c,$ ext_shared)
科幻

文件:php_test.h

#ifndef PHP_TEST_H
#定义PHP_TEST_H 1

#定义PHP_TEST_EXT_VERSION“1.0”
#define PHP_TEST_EXT_EXTNAME“测试”

PHP_FUNCTION(getaddress4);
PHP_FUNCTION(getaddress);

extern zend_module_entry test_module_entry;
#define phpext_test_ptr&test_module_entry

#万一

文件:test.c

#ifdef HAVE_CONFIG_H
#include“config.h”
#万一

#include“php.h”
#include“php_test.h”

ZEND_BEGIN_ARG_INFO_EX(func_args,1,0,0)
ZEND_END_ARG_INFO()

静态function_entry test_functions [] = {
PHP_FE(getaddress4,func_args)
PHP_FE(getaddress,func_args)
{NULL,NULL,NULL}
};

zend_module_entry test_module_entry = {
#if ZEND_MODULE_API_NO> = 20010901
STANDARD_MODULE_HEADER,
#万一
PHP_TEST_EXT_EXTNAME,
test_functions,
无效的,
无效的,
无效的,
无效的,
无效的,
#if ZEND_MODULE_API_NO> = 20010901
PHP_TEST_EXT_VERSION,
#万一
STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_TEST
ZEND_GET_MODULE(测试)
#万一

PHP_FUNCTION(getaddress4)
{
zval * var1;
zval * var2;
zval * var3;
zval * var4;
字符r [500];
if(zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC,“aaaa”,&var1,&var2,&var3,&var4)==失败){
RETURN_NULL();
}
sprintf(r,“\n%p-%p-%p-%p\n%p-%p-%p-%p”,var1,var2,var3,var4,Z_ARRVAL_P(var1),Z_ARRVAL_P(var2) ,Z_ARRVAL_P(var3),Z_ARRVAL_P(var4));
RETURN_STRING(r,1);
}

PHP_FUNCTION(获取地址)
{
zval * var;
字符r [100];
if(zend_parse_parameters(ZEND_NUM_ARGS()TSRMLS_CC,“a”,&var)== FAILURE){
RETURN_NULL();
}
sprintf(r,“%p”,Z_ARRVAL_P(var));
RETURN_STRING(r,1);
}

然后,您要做的就是对其进行phpize,对其进行配置并进行制作。在您的php.ini文件中添加一个“扩展名=/path/to/so/file/modules/test.so”。最后,以防万一,重新启动Web服务器。

$ x = array(“123” =>“123”);
$ w = $ x;
$ y = $ x;
$ z =&$ x;
var_dump(getaddress4($ w,$ x,$ y,$ z));
var_dump(getaddress($ w));
var_dump(getaddress($ x));
var_dump(getaddress($ y));
var_dump(getaddress($ z));
?>

返回(至少对我来说,您的内存地址可能会有所不同)

字符串 '
0x9efeb0-0x9effe0-0x9ef8c0-0x9efeb0
0x9efee0-0x9f0010-0x9ed790-0x9efee0'(长度= 84)

字符串'0x9efee0'(长度= 8)

字符串'0x9f0010'(长度= 8)

字符串'0x9ed790'(长度= 8)

字符串'0x9efee0'(长度= 8)

感谢Artefacto指出这一点,但是我的原始代码是按值传递数组,因此要重新创建包括引用的1的数组,并为您提供不好的内存值。从那以后,我更改了代码,以强制所有参数都通过引用传递。这将允许php引擎毫无干扰地传递引用,数组和对象。 $ w/$ z是同一件事,但$ w/$ x/$ y不是。旧代码实际上显示了引用破损,并且事实是,与所有对同一函数的多次调用相比,当传入所有变量时,内存地址将发生更改或匹配。这是因为PHP在执行多个调用时会重用相同的内存。比较原始函数的结果将是无用的。新代码应解决此问题。

仅供引用-我使用的是PHP 5.3.2。

关于php - 使用内存引用比较PHP数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4110973/

10-13 02:22