摘要:但是你知道如何使用快速構(gòu)建一個(gè)命令行應(yīng)用程序工具嗎下面我將向您展示如何使用和一個(gè)著名的的擴(kuò)展包構(gòu)建一個(gè)命令行應(yīng)用。這個(gè)應(yīng)用程序?qū)?huì)有如下功能為我們提供一個(gè)多帶帶的問(wèn)候命令,我們將使用它來(lái)與應(yīng)用程序交互。
原文地址:How to build a Command Line Application using PHP?
如果你是一名Web開(kāi)發(fā)工程師,那么你一定使用PHP開(kāi)發(fā)過(guò)很多Web應(yīng)用程序。但是你知道如何使用PHP快速構(gòu)建一個(gè)命令行應(yīng)用程序(工具)嗎?下面我將向您展示如何使用PHP和一個(gè)著名的的Composer擴(kuò)展包--Symphony/Console構(gòu)建一個(gè)命令行應(yīng)用。
Symphony/Console是一個(gè)使用Composer管理的PHP擴(kuò)展包,它簡(jiǎn)化了創(chuàng)建一個(gè)漂亮的、可測(cè)試的PHP命令行應(yīng)用的過(guò)程,它提供了開(kāi)箱即用的諸如(可選/必選的)參數(shù)規(guī)范和選項(xiàng)規(guī)范(使用-符號(hào))等功能。那么,我們來(lái)一起開(kāi)始構(gòu)建我們的應(yīng)用。
按照慣例,我們將構(gòu)建一個(gè)“Hello World”的控制臺(tái)應(yīng)用程序,但是要稍微修改一下它,讓它支持自定義問(wèn)候語(yǔ)(代替Hello),并且可以隨意的去問(wèn)候一個(gè)人(代替world)。
這個(gè)Hello World應(yīng)用程序?qū)?huì)有如下功能:為我們提供一個(gè)多帶帶的greet(問(wèn)候)命令,我們將使用它來(lái)與應(yīng)用程序交互。
greet可以接受一個(gè)可選的參數(shù)(name)來(lái)打印出一個(gè)被問(wèn)候的人(默認(rèn)是World)。
greet可以接受一個(gè)選項(xiàng)(--say)來(lái)更改問(wèn)候語(yǔ)(默認(rèn)是Hello)。
如果我們么樣給定參數(shù)或者選項(xiàng),程序?qū)⒛J(rèn)輸出一個(gè)Hello World消息。
如何使用PHP構(gòu)建命令行應(yīng)用程序
為我們的項(xiàng)目創(chuàng)建新的目錄并cd進(jìn)入它:
mkdir hello-world-app && cd hello-world-app
使用Composer將控制臺(tái)組件引入我們項(xiàng)目
composer require symfony/console
然后為你的應(yīng)用程序創(chuàng)建一個(gè)入口點(diǎn),PHP擴(kuò)展不是必需的,因?yàn)槲覀円惯@個(gè)文件成為可執(zhí)行文件,并在文件本身中指定環(huán)境。
touch HelloWorld chmod +X HelloWorld
將下面的代碼添加到HelloWorld文件中(后面我將為每一行做注解),并在你的終端中執(zhí)行HelloWorld這個(gè)應(yīng)用程序.
#!/usr/bin/env php register("greet") ->addArgument("name", InputArgument::OPTIONAL, "Name of the person") ->addOption("say", null, InputOption::VALUE_REQUIRED, "Custom greeting") ->setCode(function (InputInterface $input, OutputInterface $output) { $name = $input->getArgument("name"); $greeting = $input->getOption("say"); if (!empty($name) && !empty($greeting)) { return $output->writeln("$greeting $name! "); } else if (!empty($name)) { return $output->writeln("Hello $name! "); } else if (!empty($greeting)) { return $output->writeln("$greeting World! "); } else { return $output->writeln("Hello World! "); } }) ->getApplication() ->run();
看,就這樣,你擁有了自己的HelloWorld控制臺(tái)程序
當(dāng)沒(méi)有指定命令時(shí),HelloWorld默認(rèn)輸出一屏信息提示
Symfony Console組件給我們提供的應(yīng)用程序有幾個(gè)開(kāi)箱可用的選項(xiàng)的和命令,比如help,list和--version
解釋這個(gè)神奇的文件內(nèi)容OK,讓我們來(lái)看看我們的HelloWorld文件中的代碼。
我們引入autoload.php以使用由composer提供的自動(dòng)加載以及控制臺(tái)組件提供的各功能。
InputInterface和OutputInterface將使應(yīng)用程序的輸入和輸出功能變得簡(jiǎn)單,InputArgument和InputOption將幫助我們處理傳遞給我們HelloWorld應(yīng)用程序的選項(xiàng)和參數(shù)。
require __DIR__."/vendor/autoload.php"; use SymfonyComponentConsoleApplication; use SymfonyComponentConsoleInputInputArgument; use SymfonyComponentConsoleInputInputInterface; use SymfonyComponentConsoleInputInputOption; use SymfonyComponentConsoleOutputOutputInterface;
symphony/console通過(guò)名稱(chēng)實(shí)例化一個(gè)新的應(yīng)用程序HelloWorld (v1.0.0) ,并注冊(cè)我們的greet命令。
(new Application("Hello World", "1.0.0")) ->register("greet")
我們添加一個(gè)可選的name參數(shù)(addArgument()),并提供參數(shù)的簡(jiǎn)短描述。然后,我們使用這個(gè)addOption()方法添加一個(gè)say選項(xiàng)。請(qǐng)注意,選項(xiàng)始終是可選的,但您可以指定要傳遞的值,也可以?xún)H僅將其用作指boolean標(biāo)識(shí)。
->addArgument("name", InputArgument::OPTIONAL, "Name of the person") ->addOption("say", null, InputOption::VALUE_REQUIRED, "Custom greeting")
setCode()方法中的代碼會(huì)包含我們應(yīng)用程序的主邏輯,它會(huì)根據(jù)傳遞的參數(shù)和選項(xiàng)打印一個(gè)問(wèn)候語(yǔ)到終端。我們監(jiān)聽(tīng)$input對(duì)象,使用getArgument()和getOption()輔助方法獲取傳遞給greet的選項(xiàng)和參數(shù),然后,我們只需要檢查傳遞了哪些參數(shù)或者選項(xiàng),并相應(yīng)的(使用$output對(duì)象)向控制臺(tái)輸出打印問(wèn)候語(yǔ)。這個(gè)writeln()方法可以根據(jù)標(biāo)簽格式化文本,比如輸出不同顏色的info,error和warning。
->setCode(function (InputInterface $input, OutputInterface $output) { $name = $input->getArgument("name"); $greeting = $input->getOption("say"); if (!empty($name) && !empty($greeting)) { return $output->writeln("$greeting $name! "); } else if (!empty($name)) { return $output->writeln("Hello $name! "); } else if (!empty($greeting)) { return $output->writeln("$greeting World! "); } else { return $output->writeln("Hello World! "); } })
最后我們引導(dǎo)應(yīng)用程序并調(diào)用他的方法,以便他做好隨時(shí)接收和處理greet命令。
->getApplication() ->run();現(xiàn)在讓我們?cè)趯?shí)例中看看我們HelloWorld程序
greet不傳遞任何參數(shù)和選項(xiàng)
greet有一個(gè)可選的name參數(shù)
greet使用say選項(xiàng)自定義問(wèn)候語(yǔ)
最后,greet自定義問(wèn)候語(yǔ)和問(wèn)候人
程序開(kāi)發(fā)人員,不拘泥于語(yǔ)言與技術(shù),目前主要從事PHP和前端開(kāi)發(fā),使用Laravel和VueJs。合適和夠用是永不停息的追求。個(gè)人網(wǎng)站:https://www.linganmin.cn
譯者注:本文中的部分鏈接和圖片地址已更換為國(guó)內(nèi)地址,如有翻譯錯(cuò)誤請(qǐng)多指正。
Happy Coding!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26222.html
摘要:今天,就為開(kāi)發(fā)者介紹個(gè)方便的工具。對(duì)開(kāi)發(fā)者來(lái)說(shuō),是一個(gè)非常有用的工具,它提供了超過(guò)個(gè)有用的函數(shù)。該工具檢查輸入源代碼和報(bào)告任何違反給定的標(biāo)準(zhǔn)??蚣苁且粋€(gè)開(kāi)發(fā)的工具。它側(cè)重于安全性和性能,絕對(duì)是最安全的開(kāi)發(fā)框架之一。 PHP是為Web開(kāi)發(fā)設(shè)計(jì)的服務(wù)器腳本語(yǔ)言,但也是一種通用的編程語(yǔ)言。超過(guò)2.4億個(gè)索引域使用PHP,包括很多重要的網(wǎng)站,例如Facebook、Digg和WordPress。...
摘要:原文地址為方法類(lèi)函數(shù)生成文檔已經(jīng)成為了程序員的習(xí)慣所以需要知道通過(guò)源代碼生成獨(dú)立的文檔本文中我會(huì)介紹一款新的文檔生成工具什么是是插入到類(lèi)接口方法屬性頂部的多行注釋為了闡明這個(gè)我們看下中的代碼片段開(kāi)始于結(jié)束于每行之間使用當(dāng)定義一個(gè)類(lèi)屬性或者 原文地址: Generating PHP Documentation with Sami 為方法, 類(lèi), 函數(shù)生成文檔已經(jīng)成為了程序員的習(xí)慣, 所以...
摘要:文章的第二部分涵蓋了內(nèi)存管理的概念,不久后將發(fā)布。的標(biāo)準(zhǔn)化工作是由國(guó)際組織負(fù)責(zé)的,相關(guān)規(guī)范被稱(chēng)為或者。隨著分析器和編譯器不斷地更改字節(jié)碼,的執(zhí)行性能逐漸提高。 原文地址:How Does JavaScript Really Work? (Part 1) 原文作者:Priyesh Patel 譯者:Chor showImg(https://segmentfault.com/img...
摘要:獨(dú)立的擴(kuò)展可以獨(dú)立于源碼之外進(jìn)行分發(fā)。定義一個(gè)新擴(kuò)展我們給示例擴(kuò)展命名為。對(duì)于一個(gè)獨(dú)立擴(kuò)展來(lái)說(shuō),你只需要做一些宏調(diào)用即可。通過(guò)以上的步驟,你已經(jīng)有了一個(gè)獨(dú)立的擴(kuò)展了。 本文翻譯自 PHP 源碼中的 README.SELF-CONTAINED-EXTENSIONS。文中標(biāo)記了 注 的內(nèi)容均為自己添加。內(nèi)容有點(diǎn)老,也挺啰嗦,沒(méi)講什么深入的內(nèi)容,但是可以作為入門(mén)學(xué)習(xí)參考。 獨(dú)立的 PHP 擴(kuò)...
摘要:入門(mén),第一個(gè)這是一門(mén)很新的語(yǔ)言,年前后正式公布,算起來(lái)是比較年輕的編程語(yǔ)言了,更重要的是它是面向程序員的函數(shù)式編程語(yǔ)言,它的代碼運(yùn)行在之上。它通過(guò)編輯類(lèi)工具,帶來(lái)了先進(jìn)的編輯體驗(yàn),增強(qiáng)了語(yǔ)言服務(wù)。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺(jué)已經(jīng)到來(lái)了,總結(jié)過(guò)去的 2017,相信小伙們一定有很多收獲...
閱讀 2922·2023-04-26 02:14
閱讀 3773·2019-08-30 15:55
閱讀 1862·2019-08-29 16:42
閱讀 2773·2019-08-26 11:55
閱讀 2859·2019-08-23 13:38
閱讀 500·2019-08-23 12:10
閱讀 1323·2019-08-23 11:44
閱讀 2829·2019-08-23 11:43