对象解构的确切顺序是什么?
从测试开始,我有一个想法:当前范围的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文件生成的每个操作码并对其进行一些检查.
我遇到了几个网站,发现了一些功能zend_set_user_opcode_handler,但我不明白这个功能如何用来获得完整的操作码ASSIGN !0, 50.
我知道一个命令php -d vld.active=1 -d vld.execute=0 -f [filename].php,我可以使用它来生成PHP操作码,但据我所知,你只能在PHP程序终止后访问操作码.
我想从扩展中得到的是一个操作码,它是在函数执行时逐个(动态地)获得的.
有人可以帮我解决这个问题吗?
有人可以解释PHP如何实现关联数组吗?PHP使用什么底层数据结构?PHP散列密钥并将其存储在某种哈希映射中吗?我很好奇,因为我想知道在插入和搜索键时关联数组的性能.
在PHP中是否有办法确定给定变量是否是对另一个变量的引用和/或是否由另一个变量引用?我感谢可能无法将检测"引用"和"引用"分开,因为php.net上的注释设置$a=& $b意味着" $ a和$ b在这里完全相同.$ a不指向$ b或者反之亦然.$ a和$ b指向同一个地方. "
如果无法确定给定变量是否为引用/引用,是否有一种通用的方法来确定两个变量是否是彼此的引用?同样,对php.net 的评论提供了进行这种比较的函数 - 尽管它涉及编辑其中一个变量并查看其他变量是否同样受影响.如果可能的话,我宁愿避免这样做,因为我正在考虑的一些变量大量使用魔法吸气剂/设定器.
此实例中请求的背景是编写调试函数以帮助详细查看结构.
我在我的应用程序中嵌入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? …
我总是听到并搜索新的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个字节
据我所知,key并value肯定都会有不同的存储机制,但请你其实可以点我的原则,它是如何工作的?
示例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) 出于好奇,我正在阅读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)
##(双哈希)符号在这两行中意味着什么?
请考虑以下代码示例:
$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 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)
环境是
谁能解释为什么我得到这个结果?
我们考虑以下代码:
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:
Helloobj1:(refcount = 1,is_ref = 0)= class a {public $ var1 =(refcount = 1,is_ref = 0)='Hello'}
逐一:
实例化到$ obj1之后:
obj1:(refcount = 1,is_ref …
php-internals ×10
php ×8
arrays ×2
c ×1
datetime ×1
debugging ×1
delphi ×1
delphi-2010 ×1
new-operator ×1
php4delphi ×1
reference ×1