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 &params)
{
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开发扩展(六)的更多相关文章

  1. PHP-CPP开发扩展(一)

    PHP-CPP是一个用于开发PHP扩展的C++库.PHP-CPP提供了一系列完善的文档.易于使用和扩展的类,让你可以相对快速的创建PHP的原生扩展. 为什么使用PHP-CPP 很快 用C++编写的代码 ...

  2. Qt移动应用开发(六):QML与C++互动

    Qt移动应用开发(六):QML与C++互动 上一篇文章讲到了在Qt Quick中实现场景切换的一种可能的方法,场景切换是诸如游戏等应用在内必需要面临的技术难点,所以场景切换并没有通行的方法,依据自己的 ...

  3. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  4. 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 ...

  5. XMPPFrameWork IOS 开发(六)聊天室

    原始地址:XMPPFrameWork IOS 开发(六)聊天室 聊天室 //初始化聊天室 XMPPJID *roomJID = [XMPPJID jidWithString:ROOM_JID]; xm ...

  6. ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性

    原文:ASP.NET2.0自定义控件组件开发 第六章 深入讲解控件的属性 深入讲解控件的属性持久化(一) 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开 ...

  7. 【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

  8. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  9. Django开发笔记六

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.登录功能完善 登录成功应该是重定向到首页,而不是转发 ...

  10. ----转载----【前端工具】Chrome 扩展程序的开发与发布 -- 手把手教你开发扩展程序

    关于 chrome 扩展的文章,很久之前也写过一篇.清除页面广告?身为前端,自己做一款简易的chrome扩展吧. 本篇文章重在分享一些制作扩展的过程中比较重要的知识及难点. 什么是 chrome 扩展 ...

随机推荐

  1. 47-java 排列组合

    import java.util.HashSet; public class Main1 { public static int ys = 0; public static int ys2 = 0; ...

  2. ES6 Generator 异步编程解决方案&&&promise

    Generator: 是比promise更高级的解决方案 next   yield function 后加* 状态机 generator语法糖 长轮询  接口常查询 ================= ...

  3. git 添加分支并与远程连接

    今天由于项目需要,要改版,为了不影响当前网站,所以用分支来管理 首先,在本地添加分支dev git checkout -b dev 提交远程,让同事拉取这个分支,我是直接push了,推到远程. 同事在 ...

  4. Nodejs初识随笔

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node.js 单线程运行,不 ...

  5. Spring Boot 整合mybatis 使用多数据源

    本人想要实现一个项目里面多个数据库源连接,所以就尝试写一个demo,不多说,先贴结构,再贴代码,可以根据以下的顺序,直接copy解决问题. 首先,dao和resource下的mappers可以用myb ...

  6. Git 在团队中的使用--如何正确使用Git Flow

    Git的优点 Git的优点很多,但是这里只列出我认为非常突出的几点. 由于是分布式,所有本地库包含了远程库的所有内容. 优秀的分支模型,打分支以及合并分支,机器方便. 快速,在这个时间就是金钱的时代, ...

  7. Python12/10--前端之display/overflow使用/清浮动的方式

    display: 1.inline 同行显示,当一行显示不下.多余的就会换行显示, 不支持的css样式:不支持宽高,不支持行高(行高会映射给父级) 不支持margin上下,content由 文本内容撑 ...

  8. 项目部署到服务器上之后request.getRemoteAddr()为什么获取的都是本地地址

    获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了.如 ...

  9. jquery print属性设置

    一,需求背景 项目中遇到打印功能,想实现完美的打印功能,对元素进行操作等,可以使用jquery print 插件. 二,依赖文件  git地址请戳这里 1,jquery 2,jquery.print- ...

  10. 2、JavaScript 基础二 (从零学习JavaScript)

     11.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数,手动将各种类型的值,转换成数字.字符串或者布尔值. 1>Number强制转换 参数为原始类型值的转换规 ...