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的话,便要进行分离。 不幸的是,如果你编译上面的代码,使用的时候便会得到一个段错误。为了使它能够正常的工作,需要在源文件中加一些东西: 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;