• 9.16周记


    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
    ", 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 

     

     

     

  • 相关阅读:
    网络流模型之二分图匹配问题
    省选测试8
    省选测试9
    省选测试7
    省选测试6
    网络流最大流、最小割学习笔记
    kruskal重构树学习笔记
    省选测试5
    Python 打包成exe 方式
    JQuery
  • 原文地址:https://www.cnblogs.com/xiaoerli520/p/9656766.html
Copyright © 2020-2023  润新知