1. 程式人生 > >9.16周記

9.16周記

iss amp cos iostream apple path 對象 ash ons

PHPCS PHP codeSniffer

下載:https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar

https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar 這個是代碼修復工具

PHPCS 負責檢查代碼風格錯誤

PHPCBF 負責按照指定標準修復代碼錯誤

使用方式:

// 檢查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.html

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 版本不同

上一個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

9.16周記