From ac622243c96b3f35f653af4ad3163949bb4c9c5e Mon Sep 17 00:00:00 2001 From: goodspb Date: Wed, 4 Nov 2015 16:32:04 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 7.1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7.1.md b/7.1.md index 4a237d4..69f128d 100644 --- a/7.1.md +++ b/7.1.md @@ -147,7 +147,7 @@ ZEND_FUNCTION(sample_hello_world) { ```` 如果你不传递第二个参数,则扩展函数会被认为默认而不去修改载体。所以,我们需要自己来预先设置有载体的值,它往往是是NULL,或者一个与函数逻辑有关的值。 -每个zval,包括IS_NULL型的zval,都需要占用一定的内存空间,并且需要cpu的计算资源来为它申请内存、初始化,并在它们完成工作后释放掉。但是很多代码都都没有意识到这一点。有很多代码都会把一个null型的值包裹成zval的IS_NULL类型,在扩展开发里这种操作是可以优化的,我们可以把参数接收城C语言里的NULL。我们就这一个问题看以下代码: +每个zval,包括IS_NULL型的zval,都需要占用一定的内存空间,并且需要cpu的计算资源来为它申请内存、初始化,并在它们完成工作后释放掉。但是很多代码都都没有意识到这一点。有很多代码都会把一个null型的值包裹成zval的IS_NULL类型,在扩展开发里这种操作是可以优化的,我们可以把参数接收成C语言里的NULL。我们就这一个问题看以下代码: ````c ZEND_FUNCTION(sample_arg_fullnull) { zval *val; From d528c44e00f8698a20a38d2f15d59cead08bc0bb Mon Sep 17 00:00:00 2001 From: goodspb Date: Wed, 4 Nov 2015 16:34:23 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 6.1.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/6.1.md b/6.1.md index aed1101..6c15232 100644 --- a/6.1.md +++ b/6.1.md @@ -183,9 +183,9 @@ $b = &return_by_ref(); $b = "php"; echo $a; //此时程序输出php - +```` 在上面的代码中,$b其实是$a的一个引用,当最后一行代码执行后,$a和$b都开始寻找‘bar’这个字符串对应的zval,让我们以内核的角度重新观察这一切: - +````c #if (PHP_MAJOR_VERSION > 5) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 0) ZEND_FUNCTION(return_by_ref) { @@ -222,7 +222,6 @@ ZEND_FUNCTION(return_by_ref) *return_value_ptr = a; } #endif /* PHP >= 5.1.0 */ - ```` return_value_ptr是定义zend internal function时的另外一个重要参数,他是一个zval**类型的指针,并且指向函数的返回值。我们调用zval_ptr_dtor()函数后,默认的return_value便被废弃了。这里的$a变量如果是与某个非引用形式的变量共用一个zval的话,便要进行分离。 不幸的是,如果你编译上面的代码,使用的时候便会得到一个段错误。为了使它能够正常的工作,需要在源文件中加一些东西: