主机论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 304|回复: 14

有懂php代码的吗

[复制链接]

152

主题

283

回帖

1202

积分

金牌会员

Rank: 6Rank: 6

积分
1202
发表于 2024-12-24 11:04:16 | 显示全部楼层 |阅读模式
为啥php系统函数一个参数如果想判断多个常量, 可以加一个竖线 "|" 一次性写在一个参数里

比如判断ip是 ipv4 且 不是内网ip:
  1. filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)
  2. && filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)
复制代码


上面2句可以加一个竖线 "|" 直接写成一句, 不会有任何BUG:
  1. filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE)
复制代码
回复

使用道具 举报

152

主题

283

回帖

1202

积分

金牌会员

Rank: 6Rank: 6

积分
1202
 楼主| 发表于 2024-12-24 11:07:15 | 显示全部楼层
本帖最后由 wawos 于 2024-12-24 11:08 编辑

但是自己测试, 自己定义一个函数 和 2个常量

用这种加 "|" 同时传2个常量进去, 判断根本不行, 只能2句代码分别写单独判断才可以


有那种加 "|" 同时传2个常量进去, 写法解释的官方教程吗
回复

使用道具 举报

29

主题

968

回帖

2677

积分

金牌会员

Rank: 6Rank: 6

积分
2677
发表于 2024-12-24 17:11:00 | 显示全部楼层
&是 and
|是 or
回复

使用道具 举报

7

主题

115

回帖

321

积分

中级会员

Rank: 3Rank: 3

积分
321
发表于 2024-12-24 11:09:05 | 显示全部楼层
看不懂 有请下一位男嘉宾登场
回复

使用道具 举报

152

主题

283

回帖

1202

积分

金牌会员

Rank: 6Rank: 6

积分
1202
 楼主| 发表于 2024-12-24 11:43:00 | 显示全部楼层
本帖最后由 wawos 于 2024-12-24 11:14 编辑


别胡说好吗, 两个&&和||才是and和or, 单个一个&和|是 完全 完全不同的

竖线运算优先级, 它是要先运算了, 才会把这个结果数字(1个数) 传给函数啊,

函数怎么知道之前写的两个常量数是啥呢
回复

使用道具 举报

16

主题

568

回帖

1762

积分

金牌会员

Rank: 6Rank: 6

积分
1762
发表于 2024-12-24 11:09:28 | 显示全部楼层
google:位运算符



/**
* 大风起兮云飞扬,意大利炮轰他娘
*/
回复

使用道具 举报

152

主题

283

回帖

1202

积分

金牌会员

Rank: 6Rank: 6

积分
1202
 楼主| 发表于 2024-12-24 11:12:03 | 显示全部楼层

竖线运算付, 它是要先运算了, 才会把这个结果数字(1个数) 传给函数啊,

函数怎么知道之前写的两个常量数是啥呢
回复

使用道具 举报

0

主题

177

回帖

538

积分

高级会员

Rank: 4

积分
538
发表于 2024-12-24 11:09:00 | 显示全部楼层
上面瞎扯呢  这里的|是位运算。。
php || 才是 or   && 是 and
回复

使用道具 举报

14

主题

456

回帖

1344

积分

金牌会员

Rank: 6Rank: 6

积分
1344
发表于 2024-12-24 11:15:16 | 显示全部楼层
这个是对的,可以这样写
回复

使用道具 举报

30

主题

197

回帖

688

积分

高级会员

Rank: 4

积分
688
发表于 2024-12-24 11:15:48 | 显示全部楼层
问得很好,下次别问了。找gpt在 PHP 中,filter_var() 函数用于对变量进行过滤和验证,并且可以接受一个标志参数(flags),该参数的作用是控制验证的具体行为。

标志参数是通过位运算(bitwise operations)来组合的,因此可以使用竖线符号 (|) 将多个标志值组合到一起。这是因为每个标志值都表示一个不同的选项,它们的值是独立的,并且可以通过位运算“组合”成一个数值。

为什么可以使用 | (按位“或”运算符)?
在 PHP 中,标志(flags)是使用整数值表示的,每个标志有一个唯一的二进制位。举个例子,FILTER_FLAG_IPV4 和 FILTER_FLAG_NO_PRIV_RANGE 是不同的标志,它们的整数值如下:

FILTER_FLAG_IPV4 对应的值是 1(即 00000001)。
FILTER_FLAG_NO_PRIV_RANGE 对应的值是 4(即 00000100)。
当你用竖线符号(|)连接这两个标志时,相当于执行了按位“或”运算,这样会把两个标志合并成一个新的整数值。

1 | 4 = 5(即 00000101)。
因此,你可以将这两个标志值组合成一个整数 5,然后传递给 filter_var() 函数。PHP 会识别并理解这个值是组合了 FILTER_FLAG_IPV4 和 FILTER_FLAG_NO_PRIV_RANGE 两个标志的意思。

示例:
  1. $IP = '8.8.8.8';
  2. $result = filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE);
复制代码

在这个例子中,FILTER_FLAG_IPV4 和 FILTER_FLAG_NO_PRIV_RANGE 通过 | 操作符合并,传递给 filter_var(),这会使得函数验证 IP 地址是否为有效的 IPv4 地址,同时确保它不是私有地址。

关键点总结:
位运算: 每个标志有唯一的整数值,这些值的二进制表示是独立的,你可以通过 |(按位“或”运算符)将它们组合。
无需担心冲突: 由于每个标志有不同的二进制位,它们可以安全地组合在一起,不会冲突。
简洁和可读性: 使用 | 来组合标志能使代码简洁,避免了重复调用 filter_var() 函数。
结论:
你可以使用 | 来组合多个标志,达到同时满足多个条件的目的,而不会出现问题。这种做法基于位运算的原理,使得多个标志可以以一个值的形式传递给函数。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-1-12 10:39 , Processed in 0.074147 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表