我们看一下如何通过其实现类型绑定,但这个特性只能在Zend Engine 2也就是PHP5中使用。 让我们再回顾一下ZE2's argument info结构。每一个arg info结构的声明都是通过ZEND_BEGIN_ARG_INFO()或者ZEND_BEGIN_ARG_INFO_EX()宏函数开始的,然后紧跟着几行ZEND_ARG_*INFO()宏函数,最终以ZEND_END_ARG_INFO()宏函数结束。如果我们想重写一下PHP语言中的count()函数,可以:
ZEND_FUNCTION(sample_count_array)
{
zval *arr;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a",&arr) == FAILURE)
{
RETURN_NULL();
}
RETURN_LONG(zend_hash_num_elements(Z_ARRVAL_P(arr)));
}
zend_parse_parameters()本身可以保证传递过来的参数是一个数组。但是如果我们通过zend_get_parameter()函数来接收参数的话就没这么幸运了,需要我们自己进行类型校对。如果想让内核自动完成类型校对,便需要arg_info上场了:
ZEND_BEGIN_ARG_INFO(php_sample_array_arginfo, 0)
ZEND_ARG_ARRAY_INFO(0, arr, 0)
ZEND_END_ARG_INFO()
....
PHP_FE(sample_count_array, php_sample_array_arginfo)
....
这样我们便把类型校对的工作交给了Zend Engine,是不是有种如释重负的感觉!You've also given your argument a name so that the generated error messages can be more meaningful to script writers attempting to use your API. 我们同样可以对参数中的对象进行校验,限制其是继承自某个类或者实现了某个接口等等。
ZEND_BEGIN_ARG_INFO(php_sample_class_arginfo, 0)
ZEND_ARG_OBJ_INFO(1, obj, stdClass, 0)
ZEND_END_ARG_INFO()
需要注意的是,此时第一个参数的值是数字1,代表着以引用的方式传递。其实这个参数对于对象来说几乎没用,因为ZE2中所有的对象在当作函数参数的时候都是默认以引用的形式传递的。但是我们又必须把这个参数设置为数字1,除非你不想让你的扩展与PHP4兼容。在PHP4中,对象是传递的一个完整Copy,而非通过引用。
<div class="tip-common">对于数组和对象参数,不要忘记最后的允许为NULL的参数。更多的信息请参考第6章最后一节的有关叙述。</code>
通过arg info的方式来实现类型绑定的功能只对ZE2有效,也就是PHP5+。如果你想在PHP4上实现相应的功能,那需要用 zend_get_parameters()函数来接收参数,然后通过Z_TYPE_P()宏函数来检测参数的类型或者通过convert_to_type()函数进行类型转换。
分享到:
相关推荐
6. **性能优化**:PHP Redis 扩展通常比其他基于 PHP 的 Redis 客户端(如 Predis)更快,因为它使用 C 语言编写,直接与 PHP 内核交互,减少了额外的性能开销。 7. **其他高级特性**:例如,支持 GEO(地理位置)...
文档编写在软件开发中占据着至关重要的地位,因为它不仅是向用户传达如何使用程序的关键途径,也是确保未来程序维护和扩展时能够理解开发者的思考过程和设计决策的重要手段。良好的文档可以帮助开发者在回顾项目时...
- **跨语言通信**:如果项目中有PHP和JavaScript混合编写的部分,可以使用此扩展实现两者之间的数据传递。 总结,`php-js-ext 0.1.2`扩展为PHP 5.3.3环境提供了便捷的PHP与JavaScript交互功能,简化了开发者的工作...
2. **创建PHP扩展**: 使用PHP的内核API编写一个PHP扩展,定义该扩展的结构并注册`my_function`。这通常包括一个`php_my_extension_module_entry`结构体,以及在`init_module`函数中注册函数的过程。 3. **编译为....
描述 "go-php" 是一个项目,旨在创建一个PHP到Go的绑定,允许PHP代码调用Go编写的函数和库。这为开发者提供了一种方式,让他们能够利用Go的高性能特性,如CSP(Communicating Sequential Processes)并发模型,以及...
预编译的语句可以通过`oci_bind_by_name()`绑定参数,然后`oci_execute()`执行。 在实际项目中,理解并熟练掌握这些函数的使用是至关重要的,它们能帮助你高效地处理Oracle数据库中的数据,构建稳定、高效的PHP应用...
"ext-php-rs"项目便是这样一种尝试,它提供了一种用Rust编写PHP扩展的新方式。 一、Rust与PHP的联姻 Rust,由Mozilla研发,是一种系统级编程语言,以其内存安全和高性能而闻名。它的设计目标是消除数据竞争和其他...
PHP OCI8扩展不仅提供了对Oracle数据库的基本连接和查询功能,还支持高级特性,如游标、绑定变量、LOB(大型对象)操作、PL/SQL块执行以及事务管理。通过这个扩展,开发者可以编写出高效且可维护的代码,与Oracle...
当需要将这两种语言结合使用时,PHP-Go库提供了一种解决方案,它允许PHP代码调用Golang编写的函数,实现两者的无缝对接。本文将深入探讨如何利用“php-go-master”库来构建这样的桥接,并理解其工作原理。 一、...
9. **新函数和扩展**:添加了一些新的内置函数,如`array_column`,`strtr`等,同时更新和优化了一些扩展,如MySQLi和PDO。 在实际开发中,PHP 5.3.5的这些特性让开发者能够构建更加复杂和健壮的应用程序。例如,...
在PHP5.3中,可以在函数定义时为参数设置默认值,这使得函数更加灵活,不传递参数时会自动使用默认值。 7. **简化的类名导入(Class Aliasing)** 使用`class_alias()`函数,可以为已存在的类创建别名,简化了...
3. **闭包(Closures)和匿名函数**:PHP 5.3 添加了对匿名函数的支持,使得编写回调函数和处理器更为简洁。 4. **__DIR__ 和 __FILE__**:这两个魔术常量分别返回当前运行脚本的目录和完整路径,方便了文件操作和...
标题中的"up_308177_phpext_kr3q7.rar"是一个压缩包文件,其中包含有关PHP扩展程序开发的信息。描述指出,`phpext`是基于`ext`构建的一个PHP扩展,它的主要功能是处理PHP的前端渲染。这表明这个扩展可能涉及到PHP与...
1. **PHP扩展开发**:如何使用C语言编写PHP扩展,理解PHP的ZEND引擎和内部数据结构,以及如何与PHP的运行时环境交互。 2. **前端渲染**:理解服务器端渲染的概念,以及如何通过PHP扩展实现它,可能涉及模板引擎、...
PHP,全称Hypertext Preprocessor,是一种广泛使用的开源脚本语言,尤其在Web开发领域。...随着版本的升级,PHP不仅扩展了其功能集,也提升了开发者的体验,使得编写更加高效、可维护的代码变得更加容易。
1. 引入了类型声明,可以指定函数参数和返回值的类型,提高了代码的类型安全性。 2. NULL值:PHP5中,NULL成为了一个独立的类型,可以用于表示变量没有值或者值为空。 3. 资源类型:专门用来存储外部资源,如数据库...
4. ** Closure 函数绑定(Closure function binding)**:提供了`use`关键字,允许闭包函数捕获并使用外部变量,同时可以设置为`static`,以便在多次调用时保持状态。 5. ** 更强的类型提示(Type Hinting)**:...
4. **函数参数类型声明(Type Hinting for Arrays and Callable)**:开发者可以指定函数参数必须是数组或可调用类型,增加了代码的健壮性。 5. **__DIR__常量**:提供了当前文件所在的目录,方便开发者获取文件...