草庐IT

【web开发基础】PHP快速入门(5)-PHP运算符之算术运算符和字符串运算符详解

迷彩编程 2023-03-28 原文

前言

PHP开发基础开速入门系列

  1. 《​【web 开发基础】php 开发基础快速入门 (1)-PHP 介绍及开发环境快速安装和基本使用介绍​》
  2. 《​【web 开发基础】php 开发基础快速入门 (2)-PHP 的程序开发​》
  3. 《​【web 开发基础】php 开发基础快速入门 (3)-PHP 程序符号标记和程序注释的使用及空白符详解​》
  4. 《​【web 开发基础】php 开发基础快速入门 (4)-PHP 常量详解​》
这是PHP开发基础快速入门的第三篇文章,前两篇文章介绍了PHP的大致用法,书接上回,之前的文章对PHP的开始结束标记有过简单描述,这次详细唠唠PHP的标记相关知识以及程序注释等内容

运算符是什么

运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算。例如:2+3,其操作数是2和3,而运算符则是"+"。如在vb2005中运算符大致可以分为5种类型:算术运算符、连接运算符、关系运算符、赋值运算符和逻辑运算符;PHP也同样包含这些运算符。

运算符和变量是所有计算机编程语言中的不可或缺的一部分,是一个命令解释器对一个或多个操作数(变量或数值)执行某种运算的符号,也称为操作符

可以根据操作数的个数分为一元运算符,二元运算符,三元运算符。一元运算符只运算一个值,比如:上图中的取反运算符(!)或自增自减运算符(加一元运算符)(++,--)。二元运算符可以运算两个值,PHP支持大多数运算符都是二元运算符。而三元运算符只有一个(...?...:...)。如果按运算的不同功能去分类,可以分为算术运算符,字符串运算符,赋值运算符,比较运算符,逻辑运算符,位运算符和其他运算符。而本文要详细介绍的就是算术运算符,这也是我们在开发中最常用且最重要的运算符之一

算术运算符详解

算术运算符是最常用的符号,就是常见的数学操作符,用来处理简单的算术运算,包括加减乘除四则,取余等操作。PHP中常用的运算符如下图所示:

算术运算符的使用非常容易,与我们在数学中使用运算符的方式是一样的,不过使用算术运算符应该注意,除号(/)和取余运算符(%)的除数不能为0,也是除数不能为0, 在程序中同样需要遵守所有的数学规则.另外,对于非数值类型的操作数,PHP在算术运算时会自动将非数值类型的操作数转换成一个数字。变量的类型转换,后续文章会详细介绍。敬请期待!~

在这里着重介绍“%”、“++”和“--”三个算术运算符的在PHP中的使用,取模运算符(%)也称取余运算符。在PHP语言中在做求模运算时首先会将%运算符两边的操作数转换为整型(如int型:也就是我们所说的整数),然后返回一个操作数除以第二个操作数后所得到的余数。在程序开发时使用取模运算符通常有两个目的:

  1. 做整除运算:比如在求闰年时,能被4整除并不能被100整除,或者能被400整除的就是闰年。
  2. 让输入的数字不超过某个数的范围,比如:让任意一个随机数在10以内,就可以让这个随机数和10取余,得到的余数就永远不会超过10.实际项目中的应用也有很多,比如分库分表,哈希算法中的运用
<?php
$a = 10 % 3; //使用两个整数进行取模运算
var_dump($a); //输出整型的余数1

$b = 10.9 % 3.3; //使用两个浮点数进行取模操作
var_dump($b); //输出整型的余数1

$c = "10ren" % "3ren"; //使用两个字符串进行取模运算
var_dump($c); //输出整型的余数1

//计算是否闰年
$year = 2022;
if(($year % 400) == 0 || (($year % 100) != 0 && ($year %4) == 0)){
echo $year . "是闰年";
}else{
echo $year . "是平年";
}
echo '<br>';
$num = rand()%10; //获得一个10以内的随机数
echo $num;
执行结果:

在编程中,最常见的运算时对一个变量进行加1的或者减1的运算操作,虽然不是本文的重点,但是不得不提的就是赋值运算符,赋值运算符是所有编程语言当中最重要的运算符,赋值运算符可以改变变量的值,也可以写成(+=)这种方式计算递增变量的值,还可以使用(-=)计算递减变量的值.PHP也提供了另外两个不寻常的算术运算符,来执行递增和递减的运算。分别称为递增(自增)和递减(自减)运算符,即“++”、“--”。自增和自减常用于循环之中。

自增和自减是一元运算符,这两个运算符并不只是递增和递减的另一个选项,在进一步应用PHP的过程中,就可以看出它们的更多的用处和价值,比如下面的代码:

<?php
$a = 1;
$a = $a + 1; //$a变量加1后再赋值给这个变量
$a += 1; //使用赋值运算符在原变量上加1
++$a; //使用自增运算符递增1
三句代码的效果是一样的,这三句代码都让变量$a递增1,最后一种形式是用了自增运算符,显然是最简洁的一种方式.这个运算符的操作不同于前面介绍的其他运算符,因为它直接修改了其操作数的值.表达式的结果是递增变量的值,后面的表达式可在表达式中使用已经递增的值.

递增和递减运算符都可以在变量的前面使用前自增(++$a)后自增($a++),这样就决定了变量是先运算后使用还是先使用后运算.

下面我们看看具体的例子:

<?php
$a = 10;//定义变量$a,赋值10
$b = $a++;//后自增
?>

以上两条语句被执行后,$a的值为11,而$b的值是10;首先是将$a的值赋给$b,然后将$a的值加1,而下面的语句被执行后,$a和$b的值都是11,首先将$a的值加1,然后将$a的值赋给$b:

<?php
$a = 10;//定义变量$a,赋值10
$b = ++$a;//前自增
?>

前自增和后自增的区别

<?php
$a = 15; //声明变量$a赋值15
$b = $a++ + ++$a; //先用$a的值加上$a自增1后再自增1的值17,再赋值给$b

//输出结果
echo $a;
echo '<br>';
echo $b;
echo '<br>';

$b = $a-- - --$a; //先用$a的值17减去$a自减1后再自减1的值15,再赋值给$b
//输出结果
echo $a;
echo '<br>';
echo $b;
执行结果:

另外,在处理字符变量的算术运算时,PHP沿袭了Perl语言的习惯,而非C语言的.比如:在Perl中,'Z' + 1 将得到 'AA';而在C语言中,'Z'+1将得到'['(ord('Z')==90, ord('[')==91)。注意字符变量只能自增,不能自减,并且只支持纯字母(a-z和A-Z)。比如:涉及到字符变量的算术运算如下:

<?php
$i = 'a';
for($n=0;$n<52;$n++){ //循环自增52次
echo ++$i . "\n"; //$i自增
}
执行输出结果:

:自增或者自减运算符不会影响布尔值,自减NULL值也没有效果,但是自增NULL的结果是1

PHP中的字符串运算符

字符串基本用法

在PHP中字符串运算符只有一个,是英文的句号/点号( . ),也称为连接运算符.它是一个二元运算符,返回其左右参数连接后的字符串.这个运算符不仅可以将两个字符串连接起来,变成合并的新字符串;也可以将一个字符串和任何标量数据类型相连接,合并成的同样是新的字符串.不同类型拼接,PHP底层会自动进行类型转换,会把其他类型隐式转换为字符串后拼接接成新的字符串

<?php
$name = "李白";
$age = 19;
$height = 1.92;
echo $name . "身高:". $height . "米" . "今年" . $age . "岁"
?>
执行结果如下:

字符串使用的野路子

在PHP中,两个都是纯数字的字符串,可以进行加法运算,PHP引擎会把数字字符串转换为数值类型的数据然后进行加减乘除混合运算,但是在实际应用中不建议这么做,避免未知的错误最后自己在代码中手动做一次类型转换

<?php
$a = '123' + '345';
$b = 'abc123' + '345';
echo $a;
echo '<br>';
echo $b;
?>
执行结果如下:

有关【web开发基础】PHP快速入门(5)-PHP运算符之算术运算符和字符串运算符详解的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  7. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  8. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  9. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

  10. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

随机推荐