PHP如何以Int的形式存储IP地址
以下是我的编写的IP转int的单例模式。
要求:PHP版本^7.1可以直接使用
低版本的应用,删除参数类型和返回值类型,也可以直接使用。
源码如下:
<?php
namespace App\Utils;
class IntIpUtils
{
private static $instance;
private function __construct()
{
}
/**
* @return IntIpUtils 返回当前的实例
*/
public static function getInstance(): IntIpUtils
{
if(!self::$instance){
self::$instance = new self();
}
return self::$instance;
}
/**
* @param string $ip 传入字符串ip信息
* @return int 返回转换成功的Int形式的ip信息
*/
public function ipToInt(string $ip): int
{
$ipArr = explode('.', $ip);
$resInt = 0;
// 172.185.255.233
foreach ($ipArr as $item) {
// 基础数据做移动8位
$resInt = $resInt << 8;
// 与当前数据进行按位或运算,目的是把后面的数字转换成二进制后,依次拼在后面
$resInt |= $item;
}
// 最后以int的形式输出当前二进制数字
return $resInt;
}
/**
* @param int $int 传入Int形式的ip
* @return string 返回目标ip
*/
public function intToIp(int $int): string
{
$ipStr = '';
for ($i = 3; $i >= 0; $i--) {
// 算数运算符的优先级高于位运算符
// 数字进行移位之后,再与二进制11111111数据,进行按位与运算,依次取出当前的IP字符串
$ipStr .= ($int >> $i * 8 & 0b11111111) . '.';
}
return rtrim($ipStr, '.');
}
}
测试代码如下:
use App\Utils\IntIpUtils;
$intIp = IntIpUtils::getInstance()->ipToInt("172.185.255.233");
// dd($intIp); // 2897870825
$ipStr = IntIpUtils::getInstance()->intToIp($intIp);
dd($ipStr); // 172.185.255.233
测试可用