Php 函数get_config_bytes()是如何工作的?

Php 函数get_config_bytes()是如何工作的?,php,Php,我正在使用一个关于图像上传的扩展,它使用下面提到的函数,这是一个常用函数,通常用于获取最大上传大小(以字节为单位),但我想知道它是如何工作的例如,如果$val=20M,那么它如何乘以20M*1024并以字节为单位获得正确的输出 function get_config_bytes($val) { $val = trim($val); $last = strtolower($val[strlen($val)-1]); switc

我正在使用一个关于图像上传的扩展,它使用下面提到的函数,这是一个常用函数,通常用于获取最大上传大小(以字节为单位),但我想知道它是如何工作的

例如,如果$val=20M,那么它如何乘以20M*1024并以字节为单位获得正确的输出

function get_config_bytes($val) {
            $val = trim($val);
            $last = strtolower($val[strlen($val)-1]);
            switch($last) {
                case 'g':
                    $val *= 1024;
                case 'm':
                    $val *= 1024;
                case 'k':
                    $val *= 1024;
            }
            return $this->fix_integer_overflow($val);
        }

我对此非常好奇,因为不久前当我使用这个函数时,它生成了一个通知,非整数乘以整数,但现在它工作正常。我不知道发生了什么事。谢谢

这个问题有两个部分

它是如何工作的? 如果您传入
20M
,则
开关/case
将匹配
case'm':
。由于
案例
-块缺少
中断
在它们中,将执行匹配的
案例
-块以及随后的所有其他
案例
-块。这将导致
20*1024(从m块)*1024(从k块)

你为什么会收到通知?
上述函数将在PHP7.1+上抛出一个通知。以前,如果您有一个像
20M
这样的字符串,并将其用作一个数字(对其执行数学运算),则它将自动转换为数字
20

从PHP7.1开始,它仍然可以工作,但会抛出通知“遇到格式不正确的数值”,除非您关闭了通知的错误报告

以下是一个不会引发任何通知的更新版本:

function get_config_bytes($val) {
    $val  = trim($val);
    $last = substr($val, -1);   // Get the last character
    $val  = rtrim($val, $last); // Trim away the last character which isn't a number

    switch(strtolower($last)) {
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }

    return $this->fix_integer_overflow($val);
}


我确信有更有效的方法可以做到这一点,但这两种方法都可以解决问题。

如果有人对此有任何线索,请告诉我。上述函数将在PHP7.1+上发出通知。以前,如果您有一个像
20M
这样的字符串,并将其用作一个数字(对其执行数学运算),则它将自动转换为数字
20
。从PHP7.1开始,它仍然可以工作,但会抛出通知“遇到格式不正确的数值”,除非您关闭了通知的错误报告。是的,但问题是它不是简单地乘以20*1024=20480。它正在生成20971520,这意味着它在内部乘以20*1024*1024并生成以字节为单位的值,之后的规则也将被执行,因此它将是:
20*1024*1024
。好的,太好了!我没注意到。非常感谢你。请把它作为答案提出来,这样我才能接受。我想知道我是否需要取消通知。谢谢,这消除了我的疑虑。