当前位置: 首页 > news >正文

getopt() 冒号规则

getopt() 的前两个参数都支持一套关于选项获取的规则:

  • 单独的字符(不接受值)
  • 后面跟随冒号的字符(此选项需要值)
  • 后面跟随两个冒号的字符(此选项的值可选)

我们还是直接通过代码来看一下。

// 一
// php 如何获取PHP命令行参数.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd 
print_r(getopt('abcdef'));
// Array
// (
//     [b] => 
//     [c] => 
//     [d] => 
// )// 二
// php 如何获取PHP命令行参数.php -f
print_r(getopt('f::'));
// Array
// (
//     [f] => 
// )
print_r(getopt('f:'));
// Array
// (
// )// 三
// php 如何获取PHP命令行参数.php -f 22
print_r(getopt('f::'));
// Array
// (
//     [f] => 
// )
print_r(getopt('f:'));
// Array
// (
//     [f] => 22
// )// 四
// php 如何获取PHP命令行参数.php -f=22
print_r(getopt('f::'));
// Array
// (
//     [f] => 22
// )
print_r(getopt('f:'));
// Array
// (
//     [f] => 22
// )

这一段比较长,我们一块一块来看。首先是不带冒号的 abcdef 写法,返回的数组中都包含键,但没有值,对应上面的规则就是不接受这些参数选项的值,你传了这些参数选项也是只有键名而内容是空的。

第二段是定义了一个参数,但是不给值,这时,双冒号 :: 会有键名,而单冒号 : 则什么都没有。

第三段是空格形式的选项值,双冒号 :: 有键名但没有值,单冒号 : 键值正常。

第四段是等号 = 形式的选项值,单双冒号都正常接收到键值。

选项参数中断

上文中我们提到过参数中断的问题,就是在选项参数之后如果有一个非选项参数的参数出现,getopt() 就无法再获取到这个非选项参数后面的所有内容了。

// php 如何获取PHP命令行参数.php -f=22 aa -b=33
// 选项的解析会终止于找到的第一个非选项,之后的任何东西都会被丢弃。
// Array
// (
//     [f] => 22
// )

通过这个测试可以清晰的看出后面的 b 选项无法获取。这时,如果我们想知道选项参数在什么地方或者因为哪个参数而中断的话,就可以使用 getopt() 函数的第三个参数了。

// php 如何获取PHP命令行参数.php -f=22 aa -b=33
$optind = null;
getopt('f:b:', [], $optind);
echo $optind, PHP_EOL; // 返回中断位置的索引值,2
echo $argv[$optind], PHP_EOL; // 等同于 $argv 的索引顺序,aa

注释已经写得很清晰了,第三个参数会回调一个参数选项中断位置的索引,并且这个索引是和 $argv 的索引顺序位置一致的。

相关文章:

  • 【C语言】深入理解指针(4)回调函数
  • Apache Doris 2.0.4 版本正式发布
  • TensorFlow 的基本概念和使用场景
  • 【Java】SSM入门开发流程总结
  • C语言KR圣经笔记 6.1结构体基础 6.2结构体和函数
  • STM32 1-5
  • 物联网操作系统-Alios Things
  • 【LeetCode每日一题】56. 合并区间插入区间
  • PiflowX组件-FileWrite
  • Stable Diffusion插件Recolor实现黑白照片上色
  • BGP同步规则
  • 【c语言】详解操作符(上)
  • WSL—子系统安装及其相关配置和[诸多报错问题]-修改默认安装位置
  • 头歌C语言指针进阶
  • 爬虫基础-前端基础
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • dva中组件的懒加载
  • ES6 学习笔记(一)let,const和解构赋值
  • java2019面试题北京
  • JavaScript DOM 10 - 滚动
  • js
  • JS实现简单的MVC模式开发小游戏
  • js写一个简单的选项卡
  • Object.assign方法不能实现深复制
  • php ci框架整合银盛支付
  • Python学习笔记 字符串拼接
  • Swoft 源码剖析 - 代码自动更新机制
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 离散点最小(凸)包围边界查找
  • 理解在java “”i=i++;”所发生的事情
  • 免费小说阅读小程序
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 判断客户端类型,Android,iOS,PC
  • 深度解析利用ES6进行Promise封装总结
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 一个JAVA程序员成长之路分享
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (搬运以学习)flask 上下文的实现
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (四)linux文件内容查看
  • (小白学Java)Java简介和基本配置
  • (转)JAVA中的堆栈
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)shell调试方法
  • (转载)OpenStack Hacker养成指南
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net Stream篇(六)
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .net连接oracle数据库