PHP7扩展开发之创建变量

简介: # 前言 在这篇博文中我们将演示如何在PHP扩展中创建一个变量。示例代码如下: ```php ``` 中间的三行我们将用PHP扩展来实现。 # 代码 ##基础代码 这个扩展,我们将在say扩展上增加 `define_var` 方法。say扩展相关代码大家请看这篇博文。[PHP7扩展开发之hello word](http://www.bo56.com/php7%E6%89%A9

前言

在这篇博文中我们将演示如何在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的变量名,使用此方法创建本地变量

更多函数说明请查看

目录
相关文章
|
26天前
|
存储 API PHP
ly~
|
2月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
78 6
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
61 4
|
11天前
|
XML JSON API
【PHP开发专栏】PHP RESTful API设计与开发
随着互联网技术的发展,前后端分离成为Web开发的主流模式。本文介绍RESTful API的基本概念、设计原则及在PHP中的实现方法。RESTful API是一种轻量级、无状态的接口设计风格,通过HTTP方法(GET、POST、PUT、DELETE)操作资源,使用JSON或XML格式传输数据。在PHP中,通过定义路由、创建控制器、处理HTTP请求和响应等步骤实现RESTful API,并强调了安全性的重要性。
19 2
|
15天前
|
XML 安全 PHP
PHP与SOAP Web服务开发:基础与进阶教程
本文介绍了PHP与SOAP Web服务的基础和进阶知识,涵盖SOAP的基本概念、PHP中的SoapServer和SoapClient类的使用方法,以及服务端和客户端的开发示例。此外,还探讨了安全性、性能优化等高级主题,帮助开发者掌握更高效的Web服务开发技巧。
|
25天前
|
NoSQL 安全 Linux
MongoDB PHP 扩展
10月更文挑战第19天
12 0
MongoDB PHP 扩展
|
1月前
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。
|
1月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
44 3
|
1月前
|
前端开发 JavaScript 小程序
前端uni开发后端用PHP的圈子系统该 如何做源码?
圈子系统系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP
|
4月前
|
安全 IDE 编译器
深入理解PHP 7的新特性及其对现代Web开发的影响
【7月更文挑战第30天】本文将深入探索PHP 7版本中引入的关键新特性,并分析这些改进如何优化现代Web开发实践。通过对比PHP 5和PHP 7的性能差异,我们将揭示PHP 7如何提升应用响应速度和资源利用效率。此外,本文还将讨论PHP 7对开发者工作流程的影响,包括新的语言特性、错误处理机制以及内置函数的增强,旨在为读者提供全面了解PHP 7所带来的变革性影响。