PHP-CPP是一个用于开发PHP扩展的C++库。本节讲解一些杂项。php
从php.ini文件中读取设置就像从常规PHP脚本中获取这些设置同样简单。在PHP脚本中,咱们能够使用内置的ini_get()
函数从php.ini文件中读取设置,在C++扩展中使用Php::ini_get()
函数。html
void myFunction() { // 读取 output_buffering 变量 int output_buffering = Php::ini_get("output_buffering"); // 读取 variables_order 变量 std::string variables_order = Php::ini_get("variables_order"); }
若是须要动态注册配置,必须先使用Php::Ini
进行注册:sql
extension.add(Php::Ini("my_extension.var1", "default-value")); extension.add(Php::Ini("my_extension.var2", 12345));
而后才能调用Php::ini_get()
来检索当前值。segmentfault
添加命名空间很简单,在C++看来,命名空间只不过是类或函数前缀。若是但愿类或函数出如今特定的命名空间中,则只需在类或函数名称中添加前缀便可。函数
#include <phpcpp.h> void myFunction() { } extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension extension("my_extension", "1.0"); // 添加方法到命名空间 myNamespace extension.add<myFunction>("myNamespace\\myFunction"); return extension; } }
也能够在get_module()
使用Php::Namespace
来注册类和函数:spa
// 建立一个命名空间 Php::Namespace myNamespace("myNamespace"); // 添加方法到命名空间 myNamespace.add<myFunction>("myFunction"); // 注册命名空间 extension.add(std::move(myNamespace));
在PHP代码里,咱们能够使用dl()
函数动态加载扩展:操作系统
// 加载一个扩展的例子,基于操做系统 if (!extension_loaded('sqlite')) { if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { dl('php_sqlite.dll'); } else { dl('sqlite.so'); } }
可是这个函数有使用限制,由于它的参数仅仅是要加载的扩展的文件名,这样就不能随意加载某个自定义目录上的扩展。借助php-cpp,咱们能够调用Php::dl()
函数,这个函数的原型是:.net
Php::dl(string pathname, bool persistent)
由于pathname能够自定义路径,那么就能够动态加载任何地方的扩展了。下面是个示例:rest
Php::Value enbale_dl(Php::Parameters ¶ms) { std::string pathname = params[0]; bool persistent = params.size() > 1 ? params[1].boolValue() : false; // load the extension return Php::dl(pathname, persistent); } extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension myExtension("load_extension", "1.0"); myExtension.add("enbale_dl", enbale_dl, { Php::ByVal("pathname", Php::Type::String), Php::ByVal("persistent", Php::Type::Bool, false) }); return myExtension; } }
使用示例:code
<?php if (!dl_unrestricted(__DIR__.'/MyExtension.so', true)) die("Extension could not be loaded"); $object = new ClassFromMyExtension(); $object->methodFromMyExtension(); ?>
系列笔记:
一、嘉心嘉软 - SegmentFault 思否
https://segmentfault.com/blog/jrtk
二、A C++ library for developing PHP extensions | PHP-CPP
http://www.php-cpp.com/documentation/introduction
三、PHP: dl - Manual
https://www.php.net/manual/zh/function.dl.php