PHPCS PHP codeSnifferphp
下载:https://squizlabs.github.io/PHP_CodeSniffer/phpcs.pharhtml
https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar 这个是代码修复工具ios
PHPCS 负责检查代码风格错误git
PHPCBF 负责按照指定标准修复代码错误github
使用方式:数组
// 检查phpcs安装了哪些规范 phpcs -i // 检查指定代码规范 phpcs ./path/to/code --standard=PSR2 // phpcbf 修复指定代码 phpcbf ./path/to/code --standard
PHP-X https://wiki.swoole.com/wiki/page/p-extension.htmlswoole
PHP-X是一个C++ ZendAPI的Warpper 将相关ZendAPI进行封装,方便扩展的开发。使得ext开发者没必要全面的了解Zend工具
PHP-X的安装:性能
cmake make make install sudo ldconfig // MacOSX 系统能够使用 sudo update_dyld_shared_cache //更新系统依赖库 // cmake -DPHP_CONFIG_DIR=/opt/php/bin 指定PHP-CONFIG路径
能够看到PHP-X 对当前系统的PHPconfig是须要指定的,彷佛不太适合分发扩展 由于会报zend API 版本不一样ui
上一个ext的例子
#include "phpx.h" #include <iostream> #include <sys/time.h> using namespace php; using namespace std; PHPX_FUNCTION(cpp_ext_test) { for (int i = 0; i < args.count(); i++) { cout << args[i].type() << endl; } retval = 1234; } PHPX_FUNCTION(cpp_ext_test2) { for (int i = 0; i < args.count(); i++) { cout << args[i].type() << endl; } auto v1 = args[0]; Array arr(v1); arr.set(1, "efg"); retval = arr; //php::echo("argc=%d\n", args.count()); //php::error(E_WARNING, "extension warning."); } PHPX_FUNCTION(cpp_ext_test3) { struct timeval tv; gettimeofday(&tv,NULL); int start = 1435017600; retval = tv.tv_sec - start; } PHPX_METHOD(myClass, test) { cout << "myClass::test" << endl; retval = 1234.56; } PHPX_METHOD(myClass, pget) { String *str = _this.oGet<String>("resource", "ResourceString"); cout << "ResourceString: " << str->length() << endl; } PHPX_METHOD(myClass, pset) { _this.oSet("resource", "ResourceString", new String("hello world")); } void string_dtor(zend_resource *res) { String *s = static_cast<String *>(res->ptr); delete s; } PHPX_EXTENSION() { Extension *extension = new Extension("cpp_ext", "0.0.1"); extension->onStart = [extension]() noexcept { extension->registerConstant("CPP_EXT_VERSION", 1002); extension->registerConstant("WHEN_WE_START", 1435017600); Class *c = new Class("myClass"); c->addMethod(PHPX_ME(myClass, test), STATIC); c->addMethod(PHPX_ME(myClass, pget)); c->addMethod(PHPX_ME(myClass, pset)); extension->registerClass(c); extension->registerResource("ResourceString", string_dtor); }; // extension->onShutdown = [extension]() noexcept // { // cout << extension->name << "shutdown" << endl; // }; // // extension->onBeforeRequest = [extension]() noexcept // { // cout << extension->name << "beforeRequest" << endl; // }; // // extension->onAfterRequest = [extension]() noexcept // { // cout << extension->name << "afterRequest" << endl; // }; extension->registerFunction(PHPX_FN(cpp_ext_test)); extension->registerFunction(PHPX_FN(cpp_ext_test2)); extension->registerFunction(PHPX_FN(cpp_ext_test3)); extension->info( { "cpp_ext support", "enabled" }, { { "author", "GuoQingZhe" }, }); return extension; }
编译扩展:
// mac OSX 须要在Makefile中增长参数 -undefined dynamic_lookup make
而后就能够使用ext了!
PHP sth
password_hash -> password_verify
property_exists — 检查对象或类是否具备该属性
Isset是支持多不定参数的 因此 注意能够直接使用一个 isset($a, $b, $c)
array_intersect_key - 以key 做为凭据计算交集
method_exists(arr, method_name)方法是否存在
static方法会致使后期静态绑定 也就解释了为何性能提高了
array_flip - 将数组的key和v倒转
Convert 策略 能够看一下 是不是当前的类型,而后在转换
PHP 查看扩展信息 php --ri