PHP-CPP开发扩展(六)
PHP-CPP是一个用于开发PHP扩展的C++库。本节讲解在C++中PHP异常、变量、常量的实现相关知识。
异常
PHP和C++都支持异常,而PHP-CPP库这两种语言之间的异常处理是完全透明的。你在C++中抛出的异常会自动传递给PHP脚本,并且你的C++代码可以捕获PHP脚本抛出的异常,就像它是普通的C++异常一样。
遗憾的是,PHP-CPP目前仅支持PHP标准异常Exception
,还不支持自定义异常。
抛出异常
示例:
#include <phpcpp.h>
Php::Value myDiv(Php::Parameters ¶ms)
{
if (params[1] == 0) throw Php::Exception("Division by zero");
return params[0] / params[1];
}
extern "C" {
PHPCPP_EXPORT void *get_module() {
static Php::Extension extension("helloworld", "1.0.0");
extension.add<myDiv>("myDiv", {
Php::ByVal("a", Php::Type::Numeric, true),
Php::ByVal("b", Php::Type::Numeric, true)
});
return extension;
}
}
测试:
echo myDiv(3,2);
echo myDiv(3,0);
捕获异常
void myDivTest(){
try{
Php::call("myDiv", 3,2);
Php::call("myDiv", 3,0);
}catch(Php::Exception &e){
Php::out << "Division by zero" << std::endl;
}
}
和PHP里的捕获异常很类似。但是目前还不知道怎么打印输出e
里面的内容。
变量
Php :: Value类是对PHP变量zval的封装,使用的时候可以无缝在C++变量与PHP变量里自动转换。
下面还列出一些特殊的PHP变量:
Php::Value 申明数组
Php::Object 申明对象
Php::GLOBALS PHP全局变量
示例:
// create a regular array
Php::Value array;
array[0] = "apple";
array[1] = "banana";
array[2] = "tomato";
// create empty object of type stdClass
Php::Object object;
object = Php::Object("DateTime", "now");
// methods can be called with the call() method
Php::out << object.call("format", "Y-m-d H:i:s") << std::endl;
// set a global PHP variable
Php::GLOBALS["a"] = 12345;
// global variables can be of any type
Php::GLOBALS["b"] = Php::Array({1,2,3,4});
常量
定义常量很简单:
#include <phpcpp.h>
extern "C" {
PHPCPP_EXPORT void *get_module() {
static Php::Extension myExtension("helloworld", "1.0");
// add integer constants
myExtension.add(Php::Constant("MY_CONSTANT_1", 1));
myExtension.add(Php::Constant("MY_CONSTANT_2", 2));
// floating point constants
myExtension.add(Php::Constant("MY_CONSTANT_3", 3.1415927));
myExtension.add(Php::Constant("MY_CONSTANT_4", 4.932843));
// string constants
myExtension.add(Php::Constant("MY_CONSTANT_5", "This is a constant value"));
myExtension.add(Php::Constant("MY_CONSTANT_6", "Another constant value"));
// null constants
myExtension.add(Php::Constant("MY_CONSTANT_7", nullptr));
// return the extension
return myExtension;
}
}
在PHP脚本中使用常量同样简单:
<?php
echo(MY_CONSTANT_1."\n");
echo(MY_CONSTANT_2."\n");
echo(MY_CONSTANT_3."\n");
echo(MY_CONSTANT_4."\n");
echo(MY_CONSTANT_5."\n");
echo(MY_CONSTANT_6."\n");
echo(MY_CONSTANT_7."\n");
类常量
#include <phpcpp.h>
class Dummy : public Php::Base
{
};
extern "C" {
PHPCPP_EXPORT void *get_module() {
static Php::Extension myExtension("helloworld", "1.0");
// create a class objects
Php::Class<Dummy> dummy("Dummy");
// 有很多种方式添加类常量,但实现效果一样
dummy.property("MY_CONSTANT_1", 1, Php::Const);
dummy.property("MY_CONSTANT_2", "abcd", Php::Const);
dummy.constant("MY_CONSTANT_3", "xyz");
dummy.constant("MY_CONSTANT_4", 3.1415);
dummy.add(Php::Constant("MY_CONSTANT_5", "constant string"));
dummy.add(Php::Constant("MY_CONSTANT_5", true));
// add the class to the extension
myExtension.add(std::move(dummy));
// return the extension
return myExtension;
}
}
运行时常量
如果要在运行时从C++代码中找出用户空间常量的值,或者想要知道是否定义了常量,可以简单地使用Php::constant()
或Php::defined()
函数。
要在运行时定义常量,请使用Php::define()
。
#include <phpcpp.h>
void example_function()
{
// check if a certain user space constant is defined
if (Php::defined("USER_SPACE_CONSTANT"))
{
// retrieve the value of a constant
Php::Value constant = Php::constant("ANOTHER_CONSTANT");
// define other constants at runtime
Php::define("DYNAMIC_CONSTANT", 12345);
}
}
extern "C" {
PHPCPP_EXPORT void *get_module() {
static Php::Extension myExtension("helloworld", "1.0");
// add a function to the extension
extension.add("example_function", example_function);
// return the extension
return myExtension;
}
}
(未完待续~fhyblog)
PHP-CPP开发扩展(六)的更多相关文章
- PHP-CPP开发扩展(一)
PHP-CPP是一个用于开发PHP扩展的C++库.PHP-CPP提供了一系列完善的文档.易于使用和扩展的类,让你可以相对快速的创建PHP的原生扩展. 为什么使用PHP-CPP 很快 用C++编写的代码 ...
- Qt移动应用开发(六):QML与C++互动
Qt移动应用开发(六):QML与C++互动 上一篇文章讲到了在Qt Quick中实现场景切换的一种可能的方法,场景切换是诸如游戏等应用在内必需要面临的技术难点,所以场景切换并没有通行的方法,依据自己的 ...
- Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)
最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...
- EditPlus 配置 Java & C/CPP 开发环境
0.1安装EditPlus 0.2安装Java 0.3安装MinGW 0.4配置Java和MinGW环境变量 1.配置Java开发环境 1.1 Tool-->Preferences 1.2 Ja ...
- XMPPFrameWork IOS 开发(六)聊天室
原始地址:XMPPFrameWork IOS 开发(六)聊天室 聊天室 //初始化聊天室 XMPPJID *roomJID = [XMPPJID jidWithString:ROOM_JID]; xm ...
- ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性
原文:ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性 深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开 ...
- 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
- 公众号第三方平台开发 教程六 代公众号使用JS SDK说明
公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...
- Django开发笔记六
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.登录功能完善 登录成功应该是重定向到首页,而不是转发 ...
- ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序
关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...
随机推荐
- SpringMVC 使用验证框架 Bean Validation(上)
SpringMVC 使用验证框架 Bean Validation(上) 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证. ...
- Swift 模型属性
1 . // 定义模型属性时,一般定义为可选的,可以简化代码,不需要写 init 方法 // 如果是基本数据类型,不能设置为可选的,而且要设置初始值 var name: String? pri ...
- powershell获取windows子文件夹的大小
$startFolder = "E:\Migration\" $colItems = (Get-ChildItem $startFolder | Where-Object {$_. ...
- django by example 第四章 dashboard处html无法渲染问题
描述: 实现django by example 代码时,第四章 dashboard处html无法渲染问题. 此时报错,NoReverseMatch at /account/login/, Error ...
- poj1860
刚上来一堆英文着实有点蒙逼,仔细分析是一个Bellman的变形,只要能找出一个无限增大的环这个题就好解决了,我这里用的SPFA,用邻接链表进行储存,直接套用的模板,部分变量名字没有改的很好 #incl ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第5周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 第六章 接口与实现. 何谓接口 接口:书上没有明确地给出接口的定义,我理解的接口就是一 ...
- 如何解决XMLHttpRequest cannot load file:~~~~~~~~~~~. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-res
原因:Chrome不支持本地Ajax请求. 解决: 右击Chrome浏览器快捷方式,选择“属性”,在“目标”中加上"--allow-file-access-from-files", ...
- 顺序栈的基本操作(C语言)
由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址 但是这种用法好像C并不 ...
- modbus转乐鑫物联网平台上传工具
乐鑫平台推荐个人用户使用 界面比较简洁
- 第二周Access课总结
一.问;这节课你学到了什么知识? 答:回忆上周主要学了关于Access的基础知识和基本操作,一转眼,这周也学到了很多,主要学Access的数据类型的表的建立和管理相关的操作! 收获多少在于学了多少,正 ...