目录
继承
接口定义
首页 后端开发 php教程 php扩展开发笔记(8)继承和实现接口

php扩展开发笔记(8)继承和实现接口

Aug 08, 2016 am 09:22 AM
class exception parent zend

继承

我们自定义一个Exception类,php的代码:

<code><span><span>class</span><span>TestException</span><span>extends</span><span>Exception</span> {</span>}</code>
登录后复制

代码实现:

<code><span>#include "Zend/zend_exceptions.h"</span>
zend_class_entry *test_exception_ce;
PHP_MINIT_FUNCTION(test)
{
    zend_class_entry tmp_ce;
    INIT_CLASS_ENTRY(tmp_ce, <span>"TestException"</span>, NULL);
    test_exception_ce = zend_register_internal_class_ex(&tmp_ce, zend_exception_get_default(TSRMLS_C), NULL TSRMLS_CC);

    <span>return</span> SUCCESS;
}</code>
登录后复制

这里面主要就是实现了一个没有方法的自定义Exception类,并且继承了Exception这个类。采用了zend_register_internal_class_ex 这个带有 _ex 后缀的宏,这个宏的第二个参数zend_exception_get_default(注意头文件)指定了父类,还可以通过类名的方式来指定父类,可以看zend_register_internal_class_ex 的定义

<code><span>/* If parent_ce is not NULL then it inherits from parent_ce
 * If parent_ce is NULL and parent_name isn't then it looks for the parent and inherits from it
 * If both parent_ce and parent_name are NULL it does a regular class registration
 * If parent_name is specified but not found NULL is returned
 */</span>
ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *class_entry, zend_class_entry *parent_ce, <span>char</span> *parent_name TSRMLS_DC) <span>/* {{{ */</span>
{
    zend_class_entry *register_class;

    <span>if</span> (!parent_ce && parent_name) {
        zend_class_entry **pce;
        <span>if</span> (zend_hash_find(CG(class_table), parent_name, <span>strlen</span>(parent_name)+<span>1</span>, (<span>void</span> **) &pce)==FAILURE) {
            <span>return</span> NULL;
        } <span>else</span> {
            parent_ce = *pce;
        }
    }

    register_class = zend_register_internal_class(class_entry TSRMLS_CC);

    <span>if</span> (parent_ce) {
        zend_do_inheritance(register_class, parent_ce TSRMLS_CC);
    }
    <span>return</span> register_class;
}
<span>/* }}} */</span></code>
登录后复制

这个方法里面parent_name 传进来的时候必须是小写的,否则在寻找类名(zend_hash_find)的时候就会失败返回NULL,例如:

<code>test_exception_ce = zend_register_internal_class_ex(&tmp_ce, NULL, <span>"exception"</span> TSRMLS_CC); <span>//如果是Exception就会继承失败</span></code>
登录后复制

接口定义

<code>zend_class_entry tmp_interface_ce;
INIT_CLASS_ENTRY(tmp_interface_ce, <span>"TestDataClass"</span>, test_data_interface_methodsd);
test_data_interface = zend_register_internal_class(&tmp_interface_ce TSRMLS_CC);

<span>/* TestDataClass implements Countable, ArrayAccess, IteratorAggregate */</span>
zend_class_implements(
    test_data_interface TSRMLS_CC, <span>3</span>, spl_ce_Countable, zend_ce_arrayaccess, zend_ce_aggregate
);

<span>return</span> SUCCESS;</code>
登录后复制

以上就介绍了php扩展开发笔记(8)继承和实现接口,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Python中的class类和method方法的使用方法 Python中的class类和method方法的使用方法 Apr 21, 2023 pm 02:28 PM

类和方法的概念和实例类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类的构造方法__init__():类有一个名为init()的特殊方法(构造方法),该方法在类实例化时会自动调用。实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用self修饰的变量。实例化:创建一个类的实例,类的具体对象。继承:即一个派生类(derivedclass)继承基类(baseclass)的

Java中的ConcurrentModificationException异常的产生原因和解决方法 Java中的ConcurrentModificationException异常的产生原因和解决方法 Jun 25, 2023 am 10:33 AM

在Java中,当多个线程同时操作一个集合对象时,有可能会发生ConcurrentModificationException异常,该异常通常发生在遍历集合时进行修改或者删除元素的操作,这会导致集合的状态出现不一致,从而抛出异常。本文将深入探讨该异常的产生原因和解决方法。一、异常产生原因通常情况下,ConcurrentModificationException异

python中class是什么意思 python中class是什么意思 May 21, 2019 pm 05:10 PM

class是python中的一个关键字,用来定义一个类,定义类的方法:class后面加一个空格然后加类名;类名规则:首字母大写,如果多个单词用驼峰命名法,如【class Dog()】。

使用jQuery替换元素的class名称 使用jQuery替换元素的class名称 Feb 24, 2024 pm 11:03 PM

jQuery是一种经典的JavaScript库,被广泛应用于网页开发中,它简化了在网页上处理事件、操作DOM元素和执行动画等操作。在使用jQuery时,经常会遇到需要替换元素的class名的情况,本文将介绍一些实用的方法,以及具体的代码示例。1.使用removeClass()和addClass()方法jQuery提供了removeClass()方法用于删除

PHP Class用法详解:让你的代码更清晰易读 PHP Class用法详解:让你的代码更清晰易读 Mar 10, 2024 pm 12:03 PM

在编写PHP代码时,使用类(Class)是一个非常常见的做法。通过使用类,我们可以将相关的功能和数据封装在一个单独的单元中,使代码更加清晰、易读和易维护。本文将详细介绍PHPClass的用法,并提供具体的代码示例,帮助读者更好地理解如何在实际项目中应用类来优化代码。1.创建和使用类在PHP中,可以使用关键字class来定义一个类,并在类中定义属性和方法。

PHP实现框架:Zend Framework入门教程 PHP实现框架:Zend Framework入门教程 Jun 19, 2023 am 08:09 AM

PHP实现框架:ZendFramework入门教程ZendFramework是PHP开发的一种开源网站框架,目前由ZendTechnologies维护,ZendFramework采用了MVC设计模式,提供了一系列可重用的代码库,服务于实现Web2.0应用程序和Web服务。ZendFramework深受PHP开发者的欢迎和推崇,拥有广泛

如何在Zend框架中使用ACL(Access Control List)进行权限控制 如何在Zend框架中使用ACL(Access Control List)进行权限控制 Jul 29, 2023 am 09:24 AM

如何在Zend框架中使用ACL(AccessControlList)进行权限控制导言:在一个Web应用程序中,权限控制是至关重要的一项功能。它可以确保用户只能访问其有权访问的页面和功能,并防止未经授权的访问。Zend框架提供了一种方便的方法来实现权限控制,即使用ACL(AccessControlList)组件。本文将介绍如何在Zend框架中使用ACL

Vue报错:无法正确使用v-bind绑定class和style,怎样解决? Vue报错:无法正确使用v-bind绑定class和style,怎样解决? Aug 26, 2023 pm 10:58 PM

Vue报错:无法正确使用v-bind绑定class和style,怎样解决?在Vue开发中,我们经常会用到v-bind指令来动态绑定class和style,但是有时候我们可能会遇到一些问题,如无法正确使用v-bind绑定class和style。在本篇文章中,我将为你解释这个问题的原因,并提供解决方案。首先,让我们先了解一下v-bind指令。v-bind用于将V

See all articles