PHP7擴充套件開發之建立變數
阿新 • • 發佈:2019-01-22
前言
在這篇博文中我們將演示如何在PHP擴充套件中建立一個變數。示例程式碼如下:
<?php
class demo {}
$lng = 2;
$str = "abc";
$arr = array(1,'a' => 'b');
$obj = new demo();
var_dump($str);
var_dump($arr);
var_dump($obj);
?>
中間的三行我們將用PHP擴充套件來實現。
程式碼
基礎程式碼
這個擴充套件,我們將在say擴充套件上增加 define_var
方法。say擴充套件相關程式碼大家請看這篇博文。PHP7擴充套件開發之hello word
實現define_var方法
define_var方法的PHP擴充套件原始碼:
PHP_FUNCTION(define_var)
{
zval var_value; //變數的值
zend_string *var_name = NULL; //變數名稱
//建立整型變數
ZVAL_LONG(&var_value, 2);
zend_set_local_var_str("lng", 3 , &var_value, 0); //設定本地變數
ZVAL_NULL(&var_value);
//建立字串變數
zend_string *str = NULL;
char content[4] = "abc";
var_name = zend_string_init("str", 3, 0); //設定變數名稱
str = zend_string_init(content, sizeof(content) - 1, 0);
ZVAL_STR(&var_value, str); //設定變數的值
zend_set_local_var(var_name, &var_value, 0); //設定本地變數
zend_string_release(var_name);
ZVAL_NULL(&var_value);
//建立陣列變數
var_name = zend_string_init("arr", 3, 0); //設定變數名稱
array_init(&var_value);
add_index_long(&var_value, 0, 1);
add_assoc_stringl_ex(&var_value, "a", 1, "b", 1);
zend_set_local_var(var_name, &var_value, 0); //設定本地變數
zend_string_release(var_name);
ZVAL_NULL(&var_value);
//建立物件變數
zend_class_entry *ce;
zend_string *class_name;
class_name = zend_string_init("demo", 4, 0);
ce = zend_fetch_class(class_name, ZEND_FETCH_CLASS_AUTO); //獲取類
zend_string_release(class_name);
object_init_ex(&var_value, ce);
zend_set_local_var_str("obj", 3, &var_value, 0); //設定本地變數
ZVAL_NULL(&var_value);
}
現在,我們在PHP程式碼中呼叫這個方法,看下效果。
<?php
class demo {}
define_var();
var_dump($str);
var_dump($arr);
var_dump($obj);
?>
執行效果如下:
$ php ./test.php
int(2)
string(3) "abc"
array(2) {
[0]=>
int(1)
["a"]=>
string(1) "b"
}
object(demo)#1 (0) {
}
程式碼解讀
注意,下面的內容,我們把PHP擴充套件中的zval結構成為變數,把PHP程式碼中的變數成為本地變數。
建立本地變數主要分兩步,建立變數和設定為本地變數。
建立變數
變數的型別有多種,在建立變數的方式也有所不同。
對於簡單的資料型別,建立變數很簡單。只需呼叫相應的巨集方法就可以。
這些方法在Zend/zend_types.h
檔案中,巨集方法以ZVAL_開頭。如:
ZVAL_NULL 設定為null
ZVAL_FALSE 設定為false。
ZVAL_TRUE 設定為true
ZVAL_BOOL 設定bool。
ZVAL_LONG 設定long。
ZVAL_DOUBLE 設定為double。
使用方法,可以參考上面程式碼中ZVAL_LONG的呼叫。
對於陣列,物件,字串等複雜資料型別。比較麻煩。可以參考上面的示例程式碼。
設定本地變數
設定本地變數Zend引擎為我們提供了兩個方法。兩個函式的使用,都在以上的程式碼中做了演示。這兩個方法的應用場景有所差別。
zend_set_local_var
如果已經存在型別為zend_string
的變數名,則使用這個方法建立本地變數
zend_set_local_var_str
如果沒有型別為zend_string
的變數名,使用此方法建立本地變數