php通常用来写服务器端程序,通过php渲染HTML代码并输出到客户端,或者用来写API接口,服务器端的php程序通常是通过http协议进行调用访问的。
其实php程序也可以通过命令行调用,我们在写程序的时候,为了验证某个功能是否正确,可以直接写一段调用代码,然后通过命令行运行,就可以得到验证结果了。
通过命令行运行php程序有如下的好处:
1 在开发程序的时候可以不用切换到浏览器进行测试,在phpstrom里直接通过终端窗口就可以执行验证程序了
2 通过命令行程序,可以快速建立最简单的单元测试代码,当然,如果要进行系统化、规范化的单元测试,最好还是选择phpunit 或者是 codeception等测试框架进行测试
3 通过命令行调用php程序,可以避免因为web服务器配置而引起的错误,导致程序调试时误导了开发者,我曾经在php的web端代码里调用curl功能,发现请求的目标服务器一直返回400错误,因为忽略了是web服务器的原因,一直在调试代码,最后才发现代码是正确的,只是因为web服务器配置的问题,导致调用curl功能出错了,如果切换到命令行程序下代码是正常运行的,这样其实工作的重点就变成跳转web服务器的配置,而不是在糊里糊涂的修改代码了。
下面我们就来看看怎么在命令行下执行php代码。
下面的代码是一个用php代码写的石头剪刀布游戏:
<?phpecho "****开始玩游戏****";$game=new Game();$isContinu=1;while ($isContinu){ echo "请选择你要出什么:1代表石头、2代表剪刀、3代表布、0代表退出游戏"; $input=intval(trim(fgets(STDIN))); switch ($input) { case 1: case 2: case 3: $computerSkill=$game->computerFight(); $result = $game->pk($input, $computerSkill); echo "你出:". $game->skills[$input].","; echo "电脑出:".$game->skills[$computerSkill].","; echo "你".$game->pkResult[$result].""; break; case 0: echo '您已经退出游戏'; $isContinu=0; break; default: echo "输入有误,只能输入0到3的数字,1代表石头、2代表剪刀、3代表布、0代表退出游戏"; $isContinu=1; }}class SkillNode{ public $previous=null; public $next=null; public $data=null;}class Game { public $skills=[1=>'石头',2=>'剪刀',3=>'布']; public $pkResult=['输了','赢了','平局']; public $skillNodeList=array(); public $roundCount=0; public $winCount=0; public $loseCount=0; public $tieCount=0; public function __construct() { for ($i = 1; $i < 4; $i++) { $skillNode=new SkillNode(); $skillNode->data=$i; if ($i == 1) { $skillNode->previous=3; $skillNode->next=$i+1; } elseif ($i == 3) { $skillNode->previous=$i-1; $skillNode->next=1; }else{ $skillNode->previous=$i-1; $skillNode->next=$i+1; } $this->skillNodeList[$i]=$skillNode; } } public function pk($skillMan,$skillComputer){ $this->roundCount+=1; if ($skillMan == $skillComputer) { $this->tieCount+=1; return 2; }else{ if (($this->skillNodeList[$skillMan])->next == $skillComputer) { $this->winCount+=1; return 1; }else{ $this->loseCount+=1; return 0; } } } public function computerFight() { return random_int(1, 3); }}?>
假设我们将上面的代码保存到d盘的rockgame.php文件上,这样我们在phpstorm的terminal窗口,用下面的代码就可以通过命令行调用该程序了:
因为rockgame.php文件保存在D盘根目录下,我用cd命令,跳转到D盘,然后执行下面的命令就可以了,当然,前提条件是:你的电脑已经安装了php并且将php的路径加入到了系统参数中了:
php rockgame.php
结果入下图:
![72f2bfc606e28a01f6917b4b8d58d84e.png](https://i-blog.csdnimg.cn/blog_migrate/fd7cc260075b8acc42290cf920bfcec7.jpeg)
石头、剪刀、布,只有三个游戏技能,最简单的方式用几个判断语句就可以了,但是,为了体现封装的效果,用了OOP的方式,建立了game类,将游戏的业务逻辑封装到了game类里。
同时,为了体现可扩展性和代码判断逻辑的统一,特意建立了skillNode类,并在游戏构造函数里进行了初始化,这样在pk方法里,就可以用统一的判断逻辑,假设游戏后来有更多的游戏技能加入,同时,游戏的pk逻辑不变化的话,就只要往技能列表里增加技能元素就好,不用修改其他代码了。