作者选择了 Open Sourcing Mental Illness Ltd作为 Write for Donations计划的一部分接受捐款。
介绍
数字在编程中非常常见,它们被用来表示屏幕大小,地理位置,货币,点,视频中所花费的时间,游戏动画的位置和颜色,通过分配数字代码。
能够在编程中有效地执行数学操作是要发展的一个重要技能,因为你会经常使用数字。虽然对数学的高级别的理解可以帮助你成为一个更好的程序员,但这不是一个前提条件。
我们将使用PHP中的两个数字数据类型 integers 和 floats:
*整数是可以是正数、负数或0的整数(..., -1
, 0
, 1
,...)。
*浮点数,或浮点,是包含十进制点的真实数(如在 9.0
或 -2.25
)。
本教程将探讨在PHP中可用于数值数据类型的许多不同的操作器,以及PHP如何处理类型拼搏
和内置的数学函数。
操作员
一个 operator 是采取一个或多个值(或 表达式,在编程术语中)并产生另一个值(使构建本身成为一种表达式)的东西。
委托操作员
最基本的操作员是 assignment operator,一个单一的符号等于: =
. 这个分配操作员被用来设置变量值时。 一个 variable 就像一个盒子一样。 许多不同的东西可以存储在一个盒子里。 可以添加额外的元素到盒子里。 盒子中的元素可以重新排列或每一个都给一个贴纸。 盒子也可以被空白,并且可以添加一些新东西到盒子里。 这是当一个变量被用在代码中时的确切情况。 变量被命名,而这个命名变量被分配一个值:
1$box=3;
2var_dump($box);
3$box="Hello";
4var_dump($box);
若要查看变量类型和值,则使用var_dump()
函数而不是echo
。名为$box
的变量被分配给一个值为3
的 int。然后,相同的$box
变量被分配给一个新的值为Hello
。
1[secondary_label Output]
2int(3)
3string(5) "Hello"
在第一个分配之后,$box
变量包含3
的整数值,而在第二个分配之后,$box
变量包含一个5个字符串,匹配Hello
。
为了使我们的$box
更有用,让我们看看我们的下一个类型的运营商。
算法操作员
PHP 有数值运算符,在计算机程序中和计算机上一样工作,甚至是笔和纸张。要注意的重要方面是用于操作的符号。
Addition (+
):从第一个值开始,然后将下一个值添加到该数字中,可以使用数字值本身或包含该值的变量:
1$start=10;
2var_dump($start+3);
结果是这个方程式的 sum:
1[secondary_label Output]
2int(13)
Subtraction (-
):从第一个值开始,然后从前一个值中提取或删除下一个值:
1$start=10;
2var_dump($start-3);
结果是这个方程式的 difference:
1[secondary_label Output]
2int(7)
Multiplication (*
):从第一个值开始,然后将其乘以下一个值:
1$start=10;
2var_dump($start*3);
这就等于将第一位数加到第二位数的次数:
1$start=10;
2var_dump($start+$start+$start);
这两者都给了我们相同的结果,该方程式的 product:
1[secondary_label Output]
2int(30)
Division (/
):第二个值可以进入第一个值多少次:
1$start=10;
2var_dump($start/3);
结果是这个方程式的 quotient:
1[secondary_label Output]
2float(3.3333333333333)
在这种情况下,结果是作为一个浮动而不是整数,因为3不平等地进入10。我们可以告诉PHP将结果给我们作为只是整数的值,通过添加(int)
,这将忽略任何东西之后的`。
1$start=10;
2var_dump((int) $start/3);
将结果作为一个整数,这是一个整数:
1[secondary_label Output]
2int(3)
当一个划分方程的剩余值或剩余值被要求时,称为 modulo(%
):
1$start=10;
2var_dump($start%3);
3var_dump(3%$start);
第一個「var_dump」給了我們前方程式的剩餘部分,當方程式被扭轉時,模塊會返回「3」,因為10會進入3個零次,留下原始的3個剩餘部分:
1[secondary_label Output]
2int(1)
3int(3)
Modulo 通常用于创建基于奇数或甚至行的模式,当确定行的整数是否奇数或甚至时,使用 %2
:
1var_dump(10%2);
2var_dump(11%2);
平的整数总是会给出0的结果,因为平的数是可分为2的,而不平的整数总是会给出1的结果,因为它不是均匀的:
1[secondary_label Output]
2int(0)
3int(1)
PHP 能够快速执行复杂的计算,并提供许多更多的工具来编写所需的计算。 可以进行指数、百分比、平方根和更多操作。 在我们看看这些数学函数之前,让我们探索另一种类型的运算器,该运算器结合了分配和算术运算器。
算术分配操作员
假设有10个苹果的篮子,以代码来表示这一点,我们可以写$basket = 10
。接下来我们再选5个苹果,然后将它们放入篮子里,而不是使用整数10
,我们可以使用在$basket
变量中存储的10
的值:$basket = $basket + 5
。虽然这在技术上是正确的,但它是相当多余的。我们只是想将5个苹果添加到现有的篮子里。
- 取值为
$basket
- 添加
5
到该值 - 重新分配新值为
$basket
您可以使用相同的原理与其他算术运算器:
Expression | Result (assuming $i = 10) |
---|---|
$i += 5 | Add 10 + 5; Result: $i = 15 |
$i -= 5 | Subtract 10 - 5; Result: $i = 5 |
$i *= 5 | Multiply 10 * 5; Result: $i = 50 |
$i /= 5 | Divide 10 / 5; Result: $i = 2 |
如果Sammy决定在我们的篮子中挑选一些苹果,我们可以使用$basket -=6
这样的东西,这将让我们留下给$basket
分配的整数9
。
1$basket = 10;
2$basket += 5;
3$basket -= 6;
4echo $basket;
当$篮子
在最后一行中响起时,它会给出最后的值:
1[secondary_label Output]
29
虽然Sammy可以同时吃很多苹果,但我只能一次吃一个苹果。
增加操作员
为了增加一个数字为1
,PHP提供一个单独的增量运算器,这是一个双加符号(‘++’)。这可以用来独立增加一个变量(在其自己的线上)或直接在一个表达式中。
1++$basket;
2echo $basket;
第一行将1添加到当前值,该值为9,下一行则为结果:
1[secondary_label Output]
210
我们可以在一个线上做同样的事情:
1echo ++$basket;
首先,它将1添加到当前值,该值为10,然后下一行给出结果:
1[secondary_label Output]
211
当$篮子
的值再次为输出时:
1echo $basket;
它确认$basket
变量实际上是在前一行中更新的,而不仅仅是添加到输出结果:
1[secondary_label Output]
211
在之前的每一行中,增量操作员在变量之前使用了。此预增量操作在任何其他操作之前应用于变量,例如Echo
命令。使用++$basket
就像写$basket += 1
一样。增量操作员也可以在变量之后作为后增量使用。当变量独立设置时,命令并不重要,但当它在表达式中使用时,命令变得重要。让我们重复那些行,仅此时将增量操作员置于变量后:
1$basket++;
2echo $basket;
第一行将1添加到当前值,该值为11,接下来的行会给出结果,这与上一个示例中的预加值行完全相同:
1[secondary_label Output]
212
现在我们来看看后增量值的差异:
1echo $basket++;
在值增加之前,发生了回声
操作,所以第二个回声
的结果仍然显示了$篮子
的值,然后增加了1:
1[secondary_label Output]
212
最后一个Echo
命令确认在处理Echo
后,变量实际上增加了:
1echo $basket;
顯示「$basket」的最終值:
1[secondary_label Output]
213
与增量运算器一起,PHP为我们提供了使用减量运算器减少一个值的1
的能力。
减少操作员
若要将一个值减至 1 ’,我们可以使用减数运算符,该运算符是双减数符(
--`)。 与增量运算符一样,该运算符可以在变量之前或之后添加,但位置可能会影响程序的输出:
1echo --$basket; # Pre-decrement
2echo $basket--; # Post-decrement
3echo $basket;
第一行从当前值中删除1
,即在执行echo
命令之前为13。下一行在评估后操作员之前执行echo
命令,使输出保持相同。
1[secondary_label Output]
212
312
411
记住这个操作员的顺序,当我们看看操作员优先级如何在我们的结果中发挥重要作用时。
运营商先行
一个运算器的 precedence 指定了它如何紧密
连接两个表达式在一起,这通常被称为操作的顺序
。这意味着不同的运算器更重要,并首先应用。
1echo 1 + 5 * 3;
在这个表达式中,倍数(*
)运算器比附加(+
)运算器具有更高的优先级,因此首先被评估: 5 * 3 = 15
。
1[secondary_label Output]
216
如果操作的顺序没有被遵循,那么‘1 + 5’将首先被评估,然后该结果将被应用,给我们‘6 * 3 = 18’。
增量和减量运算器不能应用于一个数字;它们与变量一起使用;然而,我们可以将变量添加到我们增加或减少该值的方程式中;当使用这些增量或减量变量时,方程式在增量或减量操作之前或之后执行:
1$my_num = 8;
2echo 7 + $my_num++ + 9;
3echo $my_num;
4echo 7 + --$my_num + 9;
5echo $my_num;
在第一个echo
行中,数学表达式是使用$my_num
的原始值执行的,然后后增量操作员增加了该值,就像我们写了echo 7 + 8 + 9;
,这给了我们24
的结果。我们从第二个echo
中看到$my_num
现在设置为9。第二个数学方程式是在前增量操作之后执行的,这意味着$my_num
的值现在设置为8,而数学方程式本身也是一样的。
1[secondary_label Output]
224
39
424
58
集团运营
关节总是具有最高级别的优先级,提供一种方法来组合操作或力量优先级,例如,将关节添加到以前的方程式:
1echo (1 + 5) * 3;
由于组合中的项目在倍增之前被评估,结果不同:
1[secondary_label Output]
218
总结数学方程式的运算器先行性:
1、从左到右进行评估 2.从左到右进行计数和划分 3.使用从左到右的任何计数和划分来评估最终结果
类型Juggling
当变量被声明或设置时,PHP不会定义变量类型,相反,变量类型取决于变量被使用的背景,我们可以使用var_dump()
来显示变量的细节,包括其类型:
1$my_var = 'string';
2var_dump($my_var);
3$my_var = 1;
4var_dump($my_var);
当一个字符串值被分配给一个变量时,该变量会变成一个字符串. 如果一个整数值被分配给同一个变量,它就会变成一个整数:
1[secondary_label Output]
2string(6) "string"
3int(1)
PHP 还会根据对方程式的评估来设置类型:
1$var1 = 1.2;
2$var2 = 2;
3$var3 = 12;
4var_dump($var1 * $var2);
5var_dump($var3 * $var2);
6var_dump($var1, $var2, $var3);
如果一个操作员是浮动,那么两个操作员都被评估为浮动,结果将是浮动,正如第一个 var_dump
所示的。
1[secondary_label Output]
2float(2.4)
3int(24)
4float(1.2)
5int(2)
6int(12)
从第三个var_dump
来看,这并不会改变操作符本身的类型;唯一的变化是操作符被评估的方式和结果表达式本身的类型。
其他数据类型,如字符串和布尔语也可能被转换为一个数字,这可能会引起很多混淆,所以最好避免。虽然PHP会产生警告或警告,但它仍然会尽最大努力将变量变成可以评估的类型。
Expression | Result | Type Juggling |
---|---|---|
2 * false | 0 | the boolean is converted to the integer 0 |
2 * true | 2 | the boolean is converted to the integer 1 |
2 * 'hi' | 0 | the string is converted to the integer 0 |
2 * '1' | 2 | the string is converted to the integer 1 |
虽然PHP的轻松打字可以使编写代码更快和更容易,但它通常会使追踪问题变得更困难。
数学功能
PHP 包含许多内置的函数,使我们能够执行额外的数学计算。
在使用正数和负数时,您可以使用abs
函数获得该数的绝对值:
1echo abs(-1.3);
这会忽略一个数字前面的+
或-
,只会返回数字本身:
1[secondary_label Output]
21.3
当用数字估计或检索浮动的整数值时,有多个选项:
1echo round(1.3);
2echo round(1.5);
3echo ceil(1.3);
4echo floor(1.5);
圆
函数将返回最接近的整数,而5
将评估到更高的数目。
1[secondary_label Output]
21
32
42
51
由于这是真的,任何圆圈的周围可以通过将其直径乘以一个称为pi(π)的特殊数字来确定:
1echo pi();
2echo 4 * pi();
pi
函数在PHP中返回了pi
的前14位数字,因为pi
是一个不合理的数字,这意味着它的十进制形式永远不会结束。
1[secondary_label Output]
23.1415926535898
312.566370614359
无论是扭转硬币还是滚动死球,当一个结果的目标是随机时,随机数字提供工具。
1echo rand();
此函数会显示在 0 和机器配置的 getrandmax
之间的数字. 当您需要更少的随机性或想要增加最多数时,您可以包括 min 和 max。
1var_dump(rand(100, 999));
每次调用这个rand
函数时,它会返回100至999之间的三位数。
返回随机数的计算实际上不是随机的,所以当涉及到安全和加密时,PHP提供了更安全的加密功能。 为了生成适合无偏见的结果的加密随机整数,如牌或抽取胜利数字,请使用随机_int
函数:
1var_dump(random_int(-999, 999));
在random_int
中,您必须指定包括min 和 max 数字,而rand
和rand_int
都接受负数。
在生成可以使用字节字符串的盐、密钥或初始化矢量的加密安全值时,使用指定的字节长度的随机_字节
:
1var_dump(random_bytes(20));
您每次都会收到一个新的随机字节字符串,这将看起来像:
1[secondary_label Output]
2string(20) "q8?Ud;??W?p4?C????"
对于 PHP 的数学功能还有很多,请查看 php.net 文档以了解更多。
结论
本教程涵盖了您在使用整数和浮动数字数据类型时使用的许多操作员。它还展示了操作员的优先级和位置如何影响结果。这些结果带给了我们PHP的变量类型juggles
的方式以及可能导致的问题。最后,对内置函数的简短介绍扩大了应用程序可用的数学选择。 有关其他数据类型的更多信息,请参阅 理解PHP中的数据类型。