标签: php-internals

在PHP中破坏对象的顺序是什么?

对象解构的确切顺序是什么?

从测试开始,我有一个想法:当前范围的FIFO.

class test1
{
    public function __destruct()
    {
        echo "test1\n";
    }
}

class test2
{
    public function __destruct()
    {
        echo "test2\n";
    }
}

$a = new test1();
$b = new test2();
Run Code Online (Sandbox Code Playgroud)

它会一次又一次地产生相同的结果:

test1
test2
Run Code Online (Sandbox Code Playgroud)

PHP手册是模糊的(重点煤矿突出不确定度):"为有特定对象的任何其它引用的析构函数方法将被立即调用,或者在关断期间,任何顺序 ".

解构的确切顺序是什么?任何人都可以详细描述PHP使用的销毁顺序的实现吗?而且,如果这个顺序在任何和所有PHP版本之间不一致,那么任何人都可以查明这个订单改变的PHP版本吗?

php php-internals

25
推荐指数
2
解决办法
3518
查看次数

在运行时动态获取PHP操作码

我想构建一个PHP扩展,可以动态检查从PHP文件生成的每个操作码并对其进行一些检查.

我遇到了几个网站,发现了一些功能zend_set_user_opcode_handler,但我不明白这个功能如何用来获得完整的操作码ASSIGN !0, 50.

我知道一个命令php -d vld.active=1 -d vld.execute=0 -f [filename].php,我可以使用它来生成PHP操作码,但据我所知,你只能在PHP程序终止后访问操作码.

我想从扩展中得到的是一个操作码,它是在函数执行时逐个(动态地)获得的.

有人可以帮我解决这个问题吗?

php zend-framework php-extension php-internals

25
推荐指数
1
解决办法
856
查看次数

如何在PHP中实现关联数组?

有人可以解释PHP如何实现关联数组吗?PHP使用什么底层数据结构?PHP散列密钥并将其存储在某种哈希映射中吗?我很好奇,因为我想知道在插入和搜索键时关联数组的性能.

php arrays php-internals

24
推荐指数
3
解决办法
8344
查看次数

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

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

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

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

php php-internals

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

使用zend(多维数组)交换数据

我在我的应用程序中嵌入PHP(在Delphi 2010中编写),使用PHP4Delphi组件与php5ts.dll连接.我想我的程序充当PHP(sapi模块?)的扩展,因为它注册了一些可以在PHP脚本中使用的函数和常量......无论如何,在使用简单数据类型时效果很好,但是当我尝试使用多维数组时作为返回值我得到错误

Access violation at address 01CD3C35 in module 'php5ts.dll'. Read of address 0231E608.
堆栈列表
(000A2C35){php5ts.dll} [01CD3C35] destroy_op_array + $35
(004C4D61){myApp.exe } [008C5D61] php4delphi.TPHPEngine.ShutdownEngine (Line 1497, "php4delphi.pas" + 17) + $7

php4delphi.pas中的第1497行是调用的 tsrm_shutdown();

对我来说,它看起来像垃圾收集器在脚本结束时崩溃,所以我怀疑我没有正确地将数据发送回引擎...因此我的问题是如何将多维数组发送回PHP?
我正在使用的模式是

var subArray: pzval;  
_array_init(return_value, nil, 0);  
for x := 0 to Data.Count-1 do begin  
   subArray := MAKE_STD_ZVAL;  
   _array_init(subArray, nil, 0);  
   // populate subarray with data, including other subarrays
   ...
   // add subarray to the main array
   add_index_zval(return_value, x, subArray);
end;
Run Code Online (Sandbox Code Playgroud)

我是否必须"注册"我创建的子阵列?我必须增加或减少refcount或设置is_ref?IOW,如何设置子数组的return_value和zvals? …

delphi php-extension delphi-2010 php-internals php4delphi

22
推荐指数
1
解决办法
1156
查看次数

PHP内存实际上是如何工作的

我总是听到并搜索新的PHP"良好的写作练习",例如:检查数组键是否存在比搜索数组更好(性能),但对内存来说似乎也更好:

假设我们有:

$array = array
(
    'one'   => 1,
    'two'   => 2,
    'three' => 3,
    'four'  => 4,
);
Run Code Online (Sandbox Code Playgroud)

这会分配1040个字节的内存,

$array = array
(
    1 => 'one',
    2 => 'two',
    3 => 'three',
    4 => 'four',
);
Run Code Online (Sandbox Code Playgroud)

需要1136个字节

据我所知,keyvalue肯定都会有不同的存储机制,但请你其实可以点我的原则,它是如何工作的?

示例2 (对于@teuneboon):

$array = array
(
    'one'   => '1',
    'two'   => '2',
    'three' => '3',
    'four'  => '4',
);
Run Code Online (Sandbox Code Playgroud)

1168个字节

$array = array
(
    '1' => 'one',
    '2' => 'two',
    '3' => 'three',
    '4' => …
Run Code Online (Sandbox Code Playgroud)

php arrays memory-management php-internals

22
推荐指数
1
解决办法
2484
查看次数

阅读Zend Engine API代码:##(双哈希)是什么意思?

出于好奇,我正在阅读Zend Engine API代码并在#define中遇到了相当多的##.例如,在/usr/lib/php5/Zend/zend_API.h:

#define ZEND_FN(name) zif_##name
#define ZEND_MN(name) zim_##name
Run Code Online (Sandbox Code Playgroud)

##(双哈希)符号在这两行中意味着什么?

c php-internals

21
推荐指数
2
解决办法
9305
查看次数

print_r()向DateTime对象添加属性

请考虑以下代码示例:

$m_oDate = new DateTime('2013-06-12 15:54:25');
print_r($m_oDate);
echo $m_oDate->date;
Run Code Online (Sandbox Code Playgroud)

从PHP 5.3开始,这会产生(类似)以下输出:

DateTime Object
(
    [date] => 2013-06-12 15:54:25
    [timezone_type] => 3
    [timezone] => Europe/Amsterdam
)
2013-06-12 15:54:25
Run Code Online (Sandbox Code Playgroud)

但是以下代码:

$m_oDate = new DateTime('2013-06-12 15:54:25');
echo $m_oDate->date;
Run Code Online (Sandbox Code Playgroud)

......只是发出一个错误:

Notice: Undefined property: DateTime::$date in ...
Run Code Online (Sandbox Code Playgroud)

为什么要print_r()"添加"这些属性到对象?请注意,它们未DateTime手册页上定义为类的一部分.

php debugging datetime php-internals

19
推荐指数
4
解决办法
2253
查看次数

与PHP 5.6相比,我在Php 7中面临更多的内存消耗

当我做基准测试时,我发现PHP 7使用的内存比PHP 5.6更多.

所以,我做了一个测试.我运行的脚本只包含:

  $a=10;
Run Code Online (Sandbox Code Playgroud)

以下是我在没有任何模块的情况下使用PHP CLI时使用的内存的结果(php -n)

php 5.6 = 222600 Bytes
php 7.0 = 350448 Bytes

* PHP 5.6.23 (cli) (built: Jun 22 2016 12:13:15)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies 

* PHP 7.0.9 (cli) (built: Jul 20 2016 10:47:41) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
Run Code Online (Sandbox Code Playgroud)

环境是

  • 操作系统:窗口10
  • 服务器:IIS(尽管我使用的是CLI,而不是服务器),具有快速cgi
  • 机器:64位
  • PHP-23年6月5日 - NTS-Win32的VC11-64
  • PHP-7.0.9-NTS-Win32的VCl 4-64

谁能解释为什么我得到这个结果?


额外的测试 …

php php-internals

19
推荐指数
3
解决办法
2万
查看次数

用'new'实例化时到底发生了什么?

我们考虑以下代码:

class a {
    public $var1;
    function disp(){
        echo $this->var1;
        }    
    }

$obj1 = new a;
echo '<br/>After instantiation into $obj1:<br/>';    
xdebug_debug_zval('obj1');  

$obj1->var1 = "Hello ";
echo '<br/><br/>After assigning "Hello" to  $obj->var1:<br/>';
$obj1->disp();

echo "<br/><br/>";  
xdebug_debug_zval('obj1');  
Run Code Online (Sandbox Code Playgroud)

输出:

实例化到$ obj1之后:
obj1:(refcount = 1,is_ref = 0)= class a {public $ var1 =(refcount = 2,is_ref = 0)= NULL}

将"Hello"分配给$ obj-> var1:
Hello

obj1:(refcount = 1,is_ref = 0)= class a {public $ var1 =(refcount = 1,is_ref = 0)='Hello'}

逐一:

实例化到$ obj1之后:
obj1:(refcount = 1,is_ref …

php reference new-operator php-internals

17
推荐指数
1
解决办法
452
查看次数