1. 程式人生 > >PHP7擴充套件開發之建立變數

PHP7擴充套件開發之建立變數

前言

在這篇博文中我們將演示如何在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的變數名,使用此方法建立本地變數

原始碼下載