gpt4 book ai didi

php - 使用内存引用比较 PHP 数组

转载 作者:可可西里 更新时间:2023-11-01 13:02:41 24 4
gpt4 key购买 nike

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

最佳答案

其实这个是可以做到的。通过 php 扩展。

文件:config.m4

PHP_ARG_ENABLE(test, whether to enable test Extension support, [ --enable-test   Enable test ext support])if test "$PHP_TEST" = "yes"; then  AC_DEFINE(HAVE_TEST, 1, [Enable TEST Extension])  PHP_NEW_EXTENSION(test, test.c, $ext_shared)fi

文件:php_test.h

#ifndef PHP_TEST_H#define PHP_TEST_H 1#define PHP_TEST_EXT_VERSION "1.0"#define PHP_TEST_EXT_EXTNAME "test"PHP_FUNCTION(getaddress4);PHP_FUNCTION(getaddress);extern zend_module_entry test_module_entry;#define phpext_test_ptr &test_module_entry#endif

文件:test.c

#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "php_test.h"ZEND_BEGIN_ARG_INFO_EX(func_args, 1, 0, 0)ZEND_END_ARG_INFO()static 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,#endif    PHP_TEST_EXT_EXTNAME,    test_functions,    NULL,    NULL,    NULL,    NULL,    NULL,#if ZEND_MODULE_API_NO >= 20010901    PHP_TEST_EXT_VERSION,#endif    STANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_TESTZEND_GET_MODULE(test)#endifPHP_FUNCTION(getaddress4){    zval *var1;    zval *var2;    zval *var3;    zval *var4;    char r[500];    if( zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aaaa", &var1, &var2, &var3, &var4) == FAILURE ) {      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(getaddress){    zval *var;    char 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、配置和制作。将“extension=/path/to/so/file/modules/test.so”添加到您的 php.ini 文件。最后,重新启动网络服务器,以防万一。

<?php  $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));?>

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

string '0x9efeb0 - 0x9effe0 - 0x9ef8c0 - 0x9efeb00x9efee0 - 0x9f0010 - 0x9ed790 - 0x9efee0' (length=84)string '0x9efee0' (length=8)string '0x9f0010' (length=8)string '0x9ed790' (length=8)string '0x9efee0' (length=8)

感谢 Artefacto 指出这一点,但我的原始代码是按值传递数组,因此会重新创建包含引用数组的数组,并给你错误的内存值。从那以后,我更改了代码以强制所有参数都通过引用传递。这将允许引用、数组和对象在不受 PHP 引擎干扰的情况下传递。 $w/$z 是同一件事,但 $w/$x/$y 不是。旧代码实际上显示了引用中断以及当所有变量都传入与多次调用同一函数时内存地址会更改或匹配的事实。这是因为 PHP 在进行多次调用时会重用相同的内存。比较原始函数的结果是没有用的。新代码应该可以解决这个问题。

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

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

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