白话PHP7扩展开发之创建对象

简介: 本篇文章主要将如何在扩展中创建一个对象。创建的对象的过程,其实和一个小孩出生,成长的过程有些类似。 ##第一步,办准生证 生孩子第一步,先办准生证。声明我要生孩子了。对象创建的时候,如何办准生证呢?只要定义一个zend_class_entry变量即可。代码如下: ```c zend_class_entry ce; ``` zend_class_entry 是啥?可以认为它使一个原型

本篇文章主要将如何在扩展中创建一个对象。创建的对象的过程,其实和一个小孩出生,成长的过程有些类似。

第一步,办准生证

生孩子第一步,先办准生证。声明我要生孩子了。对象创建的时候,如何办准生证呢?只要定义一个zend_class_entry变量即可。代码如下:

zend_class_entry ce;

zend_class_entry 是啥?可以认为它使一个原型,定义了一些对象应该有哪些东西组成。具体代码可以查看./Zend/zend.h文件。

第二步,取名字

孩子怎么得有个名字,对象也一样。如何给对象取名字呢?代码如下:

INIT_CLASS_ENTRY(ce, "children", children_methods);

其中,children就是我们给对象取的名字。那children_methods是啥?它是这个小孩应该具备的能力(对象所拥有的方法)。

第三步,上户口

孩子出生了,名字有了,下面就得上户口了。上户口的过程就是登记入册的过程。代码如下:

zend_class_entry *children_ce;
children_ce = zend_register_internal_class(&ce);

zend_register_internal_class方法会返回一个zend_class_entry指针。以后我们对这个对象的操作,可以使用这个指针。

培养(定义属性和方法)

孩子已经上户口了。接下来,我们就是认真的培养他。培养成对社会有用的人。那么如何培养呢?主要从两方面入手。第一方面是教授知识(定义属性),另一方面是培养其行为能力(定义方法)。
定义属性,我们使用zend_declare_property*系列方法。代码示例如下:

zend_declare_property_null(children_ce, "memory",         sizeof("memory") - 1, ZEND_ACC_PUBLIC);

上面的代码我们就声明了一个名称为memory的属性,并且设置访问类型为 public。

定义方法的过程更简单。还记得我们在上户口的时候,登记了children_methods。这个就是孩子行为的一个集合。这个行为集合如何产生的呢?代码如下:

ZEND_BEGIN_ARG_INFO_EX(arginfo_children_learn, 0, 0, 1)
    ZEND_ARG_INFO(0, love)
ZEND_END_ARG_INFO()

PHP_METHOD(children, learn);

const zend_function_entry children_functions[] = {
PHP_FE(learn,                        arginfo_children_learn)
PHP_FE_END
}

ZEND_BEGIN_ARG_INFO_EX的最后一个参数1,是传递的参数的个数。
ZEND_ARG_INFO的第一个参数0,表示是否传引用方式传递。一般默认为0即可。

完整代码

至此,我们已经定义了一个对象,拥有属性memory和方法learn。完整的代码如下:

zend_class_entry *children_ce;

ZEND_BEGIN_ARG_INFO_EX(arginfo_children_learn, 0, 0, 1)
    ZEND_ARG_INFO(0, love)
ZEND_END_ARG_INFO()

const zend_function_entry children_functions[] = {
PHP_ME(children, learn, arginfo_children_learn, ZEND_ACC_PUBLIC)
{NULL, NULL, NULL}
}

PHP_MINIT_FUNCTION(children) 
{
zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "children", children_methods);

children_ce = zend_register_internal_class(&ce);

zend_declare_property_null(children_ce, "memory",         sizeof("memory") - 1, ZEND_ACC_PUBLIC);
}

PHP_METHOD(children, learn)
{
char *love;
size_t love_len;

if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "s",&content, &content_len) == FAILURE) {
        return;
}

zend_update_property_string(children_ce,  getThis(), "memory", sizeof("memory") - 1, love);
}

PHP调用代码

<?php
$children = new children();
var_dump($children->memory);
$children->learn("love");
var_dump($children->memory);
?>

输出内容如下:

NULL
string(4) "love"
目录
相关文章
|
6天前
|
缓存 安全 PHP
【PHP开发专栏】Symfony框架核心组件解析
【4月更文挑战第30天】本文介绍了Symfony框架,一个模块化且高性能的PHP框架,以其可扩展性和灵活性备受开发者青睐。文章分为三部分,首先概述了Symfony的历史、特点和版本。接着,详细解析了HttpFoundation(处理HTTP请求和响应)、Routing(映射HTTP请求到控制器)、DependencyInjection(管理依赖关系)、EventDispatcher(实现事件驱动编程)以及Security(处理安全和认证)等核心组件。
|
4天前
|
关系型数据库 MySQL
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
web简易开发(二){html5+php实现文件上传及通过关键字搜索已上传图片)}
|
6天前
|
数据库连接 PHP 数据库
【PHP开发专栏】PHP错误处理与异常捕获
【4月更文挑战第30天】PHP是流行的服务器端脚本语言,广泛用于动态网站和应用开发。本文深入探讨PHP的错误处理和异常捕获机制,分为三部分:首先介绍PHP错误处理,包括错误级别(如E_NOTICE、E_WARNING、E_ERROR)和错误处理函数;其次,讲解异常捕获,利用try-catch处理程序错误,自定义异常类;最后,讨论两者在数据库操作、文件操作和网络请求等场景的应用及最佳实践。示例代码展示了如何自定义错误处理器和异常处理。
|
1天前
|
安全 测试技术 PHP
掌握现代Web开发:PHP 8的新特性与最佳实践
【5月更文挑战第5天】 在当今快速发展的网络世界中,PHP作为一种流行的服务器端脚本语言,持续地演化着。最新的PHP 8版本引入了一系列令人兴奋的新特性和性能改进,为开发者提供了更加强大和灵活的工具。本文将深入探讨PHP 8中的新特性,包括联合类型、名称参数、匹配表达式等,并分享一些最佳实践,帮助开发者提高代码质量,优化性能,并确保安全性。通过这些实用技巧和示例,您将能够构建更高效、更安全的PHP应用程序。
|
6天前
|
编译器 API PHP
深入PHP扩展开发:打造高效自定义模块
【4月更文挑战第30天】 在追求性能优化和特定功能实现的道路上,PHP提供了一种强大机制——扩展。本文将引导读者通过编写一个简单的PHP扩展来探索扩展开发的世界。我们将涉及从环境搭建到代码实现,再到扩展的编译与加载的完整流程,确保读者能够理解并实践如何创建高效的自定义PHP模块。
|
6天前
|
SQL 安全 PHP
【PHP开发专栏】PHP预处理语句与安全性
【4月更文挑战第30天】PHP预处理语句提升Web开发安全与性能。本文分三部分介绍原理、使用方法及安全性。预处理语句防止SQL注入,提高代码可维护性和性能。创建预处理语句对象,绑定参数,执行并释放资源。通过占位符增强代码可读性,减少数据库负担,实现高效查询。
|
6天前
|
安全 PHP
【PHP开发专栏】PHP文件上传与下载实现
【4月更文挑战第30天】本文介绍了在PHP中实现文件上传和下载的详细步骤。文件上传通过`$_FILES`全局数组处理,包括设置HTML表单、PHP脚本处理上传及安全性考虑。文件下载则可使用`readfile()`、`fpassthru()`或`file_get_contents()`函数,同时关注安全问题,如防止目录遍历漏洞。文中还提供了一个简单的图片分享网站案例,演示了上传和下载功能的集成。
|
6天前
|
PHP 数据安全/隐私保护
【PHP开发专栏】PHP魔术方法与对象操作
【4月更文挑战第30天】PHP 魔术方法是特殊方法,如`__construct`、`__get`等,在特定时刻自动调用,用于重写默认行为。本文分三部分介绍PHP魔术方法和对象操作:1) 魔术方法包括构造、析构、属性访问等,常用于控制访问权限、自动加载等;2) 对象操作涉及创建、访问属性和方法、克隆及序列化/反序列化;3) 案例展示如何在创建对象时设置默认值。
|
6天前
|
缓存 安全 PHP
【PHP开发专栏】Twig模板引擎在PHP中的应用
【4月更文挑战第30天】Twig是Fabien Potencier开发的PHP模板引擎,以其易读性、可扩展性、安全性和高性能著称。文章分三部分介绍:1) 通过Composer安装Twig;2) 学习基本语法,如变量、表达式、标签和过滤器;3) 在Symfony和Laravel框架及独立PHP项目中应用Twig。示例展示了如何渲染模板、使用for和if标签,以及在不同框架中整合Twig。