9.16週記

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 

相關文章
相關標籤/搜索