成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

php類庫到sublime完成-創(chuàng)新互聯(lián)

php類庫到sublime完成

站在用戶的角度思考問題,與客戶深入溝通,找到西工網(wǎng)站設計與西工網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設計、成都網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、國際域名空間、網(wǎng)絡空間、企業(yè)郵箱。業(yè)務覆蓋西工地區(qū)。

起因

前一篇寫了反射類生成php速查表。過年了在家也沒事,想完成自己想要實現(xiàn)的sublime自動完成文件生成。就是sublime里輸入關鍵字后按tab自動補全一個全的函數(shù)名和參數(shù)的,按tab可以切換一致到最后的。也是給別人的承諾,今年肯定會實現(xiàn)sublime的tp5插件的。

php類庫到sublime完成

地址在 https://github.com/yangweijie/SublimeThinkPHP5.0

思路

搞清sublime 完成的寫法

"HTML_FILE_SUFFIX",
        "TEMPLATE_NAME",
        { "trigger": "_ad", "contents": "protected function _after_delete(\\$data,\\$options) {\n   ${1:}\n}$0" },
        { "trigger": "_af", "contents": "protected function _after_find(&\\$result,\\$options) {\n  ${1:}\n}$0" },
        { "trigger": "_ai", "contents": "protected function _after_insert(\\$data,\\$options) {\n   ${1:}\n}$0" },
        { "trigger": "_as", "contents": "protected function _after_select(&\\$result,\\$options){\n ${1:foreach(\\$result as &\\$record)\\{\n       ${2:\\$this->_after_find(\\$record,\\$options);}\n  \\}}\n}$0" },
        { "trigger": "_au", "contents": "protected function _after_update(\\$data,\\$options) {\n   ${1:}\n}$0" },
        { "trigger": "_bi", "contents": "protected function _before_insert(&\\$data,\\$options) {\n ${1:}\n}$0" },
        { "trigger": "_bu", "contents": "protected function _before_update(&\\$data,\\$options) {\n ${1:}\n}$0" },
        { "trigger": "->_empty", "contents": "\\$this->_empty()$0" },
        { "trigger": "_get", "contents": "_get('${1:\\$name}')$0" },
        { "trigger": "_post", "contents": "_post('${1:\\$name}')$0" },
        { "trigger": "->_sql", "contents": "->_sql('${1:\\$name}')$0" },
        { "trigger": "->addAll", "contents": "->addAll(\\$${1:dataList},\\$${2:options},\\$${3:replace})$0" },

這個是寫在Sublime的ThinkPHP 插件里 php.sublime-completions 文件里的。

completion 和snippet的區(qū)別在于 snippet只能一個文件一個補全。命令面版里有提示。

字符串

json 里直接字符串

tab占位

$0 完成的最后光標

tab 選中光標 ${1:XX} 1自增下標,: 選中的內(nèi)容

trigger 觸發(fā)器

表示什么文本末按tab會觸發(fā)完成。

注意點

$ 換行之類的要轉(zhuǎn)義

php如何獲取

先上核心代碼:

<?php

namespace util;

class SnippetBuilder
{
    public $cme;

    public function __construct($classes)
    {
        // if (false == defined('THINK_VERSION')) {
        //     throw new \Exception('請在thinkphp應用中執(zhí)行本類', 1);
        // }
        $this->cme            = new ClassMethodExtractor();
        // $this->framework_type = version_compare(THINK_VERSION, '5') >= 0 ? 5 : 3;
        $this->classes        = $classes;
    }

    public function buildAll($path)
    {
        $consts    = $this->getConsts();
        $functions = $this->getFunctions();
        $classes = $this->classes;
        $this->ret = [];
        if ($consts) {
            $this->buildConsts($consts);
        }
        if ($functions) {
            $this->buildFunction($functions);
        }
        if ($classes) {
            foreach ($classes as $class) {
                $class2 = $this->cme->getClassAnnotation(new \ReflectionClass($class));
                $this->buildClass($class2);
            }
        }
        if ($this->ret) {
            file_put_contents($path, $this->parseAll($this->ret));
        } else {
            exit('沒有可生成的內(nèi)容');
        }
    }

    // 獲取常量數(shù)組
    public function getConsts()
    {
        $all_consts = get_defined_constants(true);
        return array_keys($all_consts['user']);
    }

    // 生成常量完成
    public function buildConsts($consts)
    {
        foreach ($consts as $key => &$const) {
            $this->ret[] = $const;
        }
    }

    // 生成類的完成
    public function buildClass($classes)
    {

    }

    // 獲取定義的函數(shù)
    public function getFunctions()
    {
        $arr = get_defined_functions();
        $ret = [];
        foreach ($arr['user'] as $key => $name) {
            $foo         = [];
            $refFunc     = new \ReflectionFunction($name);
            $foo['args'] = $refFunc->getParameters();
            $ret[$name]  = $foo;
        }
        return $ret;
    }

    // 生成函數(shù)
    public function buildFunction($functions)
    {

    }

}

常量

// 獲取常量數(shù)組
public function getConsts()
{
        $all_consts = get_defined_constants(true);
        return array_keys($all_consts['user']);
}

php有函數(shù),且會區(qū)分core user 和擴展的。我們只需要user定義,也就是tp框架定義的。

函數(shù)

// 獲取定義的函數(shù)
public function getFunctions()
{
        $arr = get_defined_functions();
        $ret = [];
        foreach ($arr['user'] as $key => $name) {
                $foo         = [];
                $refFunc     = new \ReflectionFunction($name);
                $foo['args'] = $refFunc->getParameters();
                $ret[$name]  = $foo;
        }
        return $ret;
}

php也有個獲取全部函數(shù)名的方法。同樣只拿user

然后新的函數(shù)反射類 new \ReflectionFunction($name);

獲取它的參數(shù) $refFunc->getParameters();

$all_class = get_declared_classes();

這回沒有user好事了,不過可以反射類isInternal區(qū)分。

// 獲取全部用戶定義的類
    public function getAllUserClasses(){
        $all_class = get_declared_classes();
        $ret = [];
        foreach ($all_class as $class) {
            $rf = new \ReflectionClass($class);
            if(false == $rf->isInternal()){
                if('app\index\controller\Index' == $class){
                    continue;
                }
                $ret[] = $class;
            }
        }
        return $ret;
    }
  if ($classes) {
                foreach ($classes as $class) {
                    $class2 = $this->cme->getClassAnnotation(new \ReflectionClass($class));
                        $this->buildClass($class2);
                }
            }

用cme類提取出類和對應方法及參數(shù)。

生成

我寫了 SublimeSnippetBuilder來繼承我之前的 SnippetBuilder,因為我想做的是所有文本編輯器的完成生成。先架構好結構,以后慢慢填坑。

先整體代碼:

<?php

namespace util;

class SublimeSnippetBuilder extends SnippetBuilder
{
    // 生成函數(shù)
    public function buildFunction($functions)
    {
        foreach ($functions as $name => $fun) {
            $args_arr = [$name, '(', ')'];
            if ($fun['args']) {
                $args_arr = [$name, '('];
                $index    = 1;
                foreach ($fun['args'] as $key => $arg) {
                    $p = new \ReflectionParameter($name, $key);
                    if ($p->isPassedByReference()) {
                        $arg_str_new = '\&\\$' . $p->getName();
                    } else {
                        $arg_str_new = '\\$' . $p->getName();
                    }

                    if ($p->isOptional() && $p->isDefaultValueAvailable()) {
                        // 獲取某些內(nèi)部類的參數(shù)會拋異常,且異常時$class會變化不是我們想知道的哪個類方法一場了
                        try {
                            $defaul = $p->getDefaultValue();
                            $arg_str_new .= is_array($defaul) ? ' = []' : ' = ' . var_export($defaul, 1);
                        } catch (\Exception $e) {
                            trace($p->isVariadic());
                            trace($name . '_' . $key);
                        }
                    }
                    if ($index == 1) {
                        $p_str = sprintf('${%d:%s}', $index, $arg_str_new);
                    } else {
                        $p_str = sprintf('${%d: ,%s}', $index, $arg_str_new);
                    }

                    $args_arr[] = $p_str;
                    $index++;
                }
                $args_arr[] = ')';
            }
            $contens = implode('', $args_arr) . '$0';
            $foo     = [
                'trigger'  => $name,
                'contents' => $contens,
            ];
            $this->ret[] = $foo;
        }
    }

    public function buildClass($class)
    {
        if($class['methods']){
            foreach ($class['methods'] as $name => $fun) {
                switch ($fun['type']) {
                    case 'public_static':
                    case 'private_static':
                        $trigger_name = "::{$name}";
                        break;
                    case 'public_public':
                    case 'private_public':
                        $trigger_name = "->{$name}";
                        break;
                    default:
                        $trigger_name = '';
                        break;
                }
                $args_arr = [$trigger_name, '(', ')'];
                if (empty($fun['args']) == false) {
                    $args_arr = [$trigger_name, '('];
                    $index    = 1;
                    foreach ($fun['args'] as $key => $p) {
                        if ($p->isPassedByReference()) {
                            $arg_str_new = '\&\\$' . $p->getName();
                        } else {
                            $arg_str_new = '\\$' . $p->getName();
                        }

                        if ($p->isOptional() && $p->isDefaultValueAvailable()) {
                            // 獲取某些內(nèi)部類的參數(shù)會拋異常,且異常時$class會變化不是我們想知道的哪個類方法一場了
                            try {
                                $defaul = $p->getDefaultValue();
                                $arg_str_new .= is_array($defaul) ? ' = []' : ' = ' . var_export($defaul, 1);
                            } catch (\Exception $e) {
                                trace($p->isVariadic());
                                trace($name . '_' . $key);
                            }
                        }
                        if ($index == 1) {
                            $p_str = sprintf('${%d:%s}', $index, $arg_str_new);
                        } else {
                            $p_str = sprintf('${%d: ,%s}', $index, $arg_str_new);
                        }

                        $args_arr[] = $p_str;
                        $index++;
                    }
                    $args_arr[] = ')';
                }
                $contens = implode('', $args_arr) . '$0';
                $foo     = [
                    'trigger'  => $trigger_name,
                    'contents' => $contens,
                ];
                $this->ret[] = $foo;
            }
        }
    }

    public function parseAll($ret)
    {
        // dump($ret);
        $ret = [
            "scope"       => "source.php - variable.other.php",
            "completions" => $ret,
        ];
        return json_encode($ret, JSON_PRETTY_PRINT);
    }
}

其實 就是生成對應的多維數(shù)組,數(shù)字索引為常量,函數(shù)方法為多維數(shù)組。

函數(shù)的trigger就是函數(shù)名,類無非::、-&gt;后跟方法名

然后區(qū)分代參不帶參,帶參再遍歷參數(shù),區(qū)分引用和默認值的情況。用了sprintf 方法拼接${index:content} 這種格式。

最終生成json,用了JSON_PRETTY_PRINT 格式化輸出后寫文件。

整體思路還是很清晰的。

其他語言的可以借鑒。

php類庫到sublime完成

效果:
php類庫到sublime完成

一下子兩千行,手寫得累死。

其實,大家只需擴展getAllUserClasses 就可以生成其他類的,比如swoole的。

題外話,新插件提交wbond 開始用branch 結果不推薦了要tag。我折騰了幾次才通過ci。人家不高興了。不給我過,有能力的直接git clone吧。視圖那沒找到規(guī)律先手寫的。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

新聞名稱:php類庫到sublime完成-創(chuàng)新互聯(lián)
標題來源:http://jinyejixie.com/article40/gjhho.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、定制網(wǎng)站、網(wǎng)站設計、網(wǎng)站建設、App開發(fā)網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
金阳县| 柏乡县| 宝应县| 垫江县| 藁城市| 梧州市| 庆云县| 瓦房店市| 平远县| 宜兰县| 裕民县| 龙井市| 台东市| 永吉县| 桃园市| 巧家县| 河东区| 林西县| 昔阳县| 耒阳市| 柏乡县| 盐亭县| 宁津县| 武山县| 稻城县| 二连浩特市| 巩义市| 德钦县| 婺源县| 灌阳县| 车险| 双峰县| 桐乡市| 安图县| 富阳市| 泸溪县| 九江县| 许昌市| 莱芜市| 辽源市| 庆城县|