思考:PHP是一种运行在服务器端的脚本语言,可以嵌入到HTML中开发。也就是说混入到HTML中(还有CSS和JavaScript)的PHP代码要被PHP解释器“取出来”,然后转变成HTML,最后才能交给浏览器去解析。那么,PHP解释器凭什么能够从一堆“乱七八糟”代码中准确识别PHP部分呢?
引入:混到一块的内容要加以区分,必须要有一个不同于其他内容的规则,而PHP的代码本身无法做到,因此需要有一个类似JavaScript的标签来区分,然后可以将PHP的代码逻辑写到指定的标签内,就可以实现PHP的独立识别了。
定义:PHP标记是一种不对称的双标记,而且可以根据实际所处的位置变成必要的不完整标记。PHP解释器会将从标记开始,将标记内的所有内容当做PHP的代码来解析。
1.标记规则:标准规则,通常是嵌入到HTML中的时候使用
?>
2.标记规则:不完整规则,通常是独立的PHP文件(全部是PHP代码)使用
3.标记规则:历史规则,PHP在早起经历了多种标记,现在已经几乎都不用,但是如果碰到,要认识
短标记:short_tag
//短标记:起始标记没有PHP
//目前默认不支持,如果要支持需要开启配置php.ini:short_open_tag = On
?>
*********************************************************************
ASP标记:asp_tag
<%
//ASP标记:以前ASP语言的方式
//PHP7已经明确不支持
%>
*********************************************************************
脚本标记
总结:PHP因为其语言特殊性,需要使用标记来人为的区分,因此必须使用PHP所对应的标记。标记的主要方式有两种:
思考:代码一旦写起来一来会随着业务复杂度的上升而变得多而复杂,二来项目的开发通常需要与团队共享代码,三来会因为团队人员的变更而导致不同的人去更新别人的代码。那么这个时候就会出现一个效率问题:为了能够去完善代码,个人可能需要去读懂全部代码才知道如何下手,这样的效率通常会不如完全重新开发一套系统,如何解决?
引入:想要让代码的可读性变强,可扩展性变强,就需要对代码的逻辑、针对的业务、设计的关联等做出明确的说明,这种说明就是代码中所常用的文字描述,俗称注释。而这种描述本身会在代码被解析的时候自动忽略掉,因此只会方便写代码和读代码的人,而不会额外的给程序本身增加任何压力。
定义:注释,为了方便程序的迭代开发和管理,使用特定的符号将描述的自然语言进行标记,方便开发人员理解代码并不会给程序本身增加额外效率损失。
1.注释规则:单行注释,使用的注释符号只会让符号后面的内容被PHP解释器忽略,有#和//两种
2.注释规则:注释多行(块注释),从起始符号开始,直到结束符号前都是注释,起始符号为“/*”,结束符号为“*/”
总结:PHP的注释是很有必要的,分为单行注释和块注释,一般短注释使用单行注释,而注释内容较多又涉及分行的话使用块注释。一个良好的软件有一个共同的特性,就是代码的可读性强,因此作为一名优秀的程序员写出来的优秀代码,都是有注释说明的。
思考:目前所有的编程语言几乎都是英文单词去构成的,而目前除了Python语句是以行为单位自动“结算”外,其他语言基本上都是需要程序员手动去控制的。如何能够告诉PHP解释器代码什么时候该结束了呢?
引入:PHP的代码结束机制是通过程序员输入的结束符号来控制,这个符号就是英文状态下的分号:“;”,一旦碰到这个,系统会认为从前面到分号前的所有代码是一个整体(特殊状况除外,如括号“()”和花括号“{}”)
定义:PHP的代码在写完之后,通常会有一个语句结束符,该符号使用英文输入法状态下的分号:“;”
1.使用规则,单行代码需要在代码结束出增加“;”告知PHP引擎代码结束了
2.PHP语句结束符的特殊性【了解】:如果PHP在有结束标记?>的情况下,那么最后一条PHP语句可以没有语句结束符。
,所以可以省去(不建议)
?>
总结:PHP语句结束符作为PHP语句的结束标志,是主动用来告知PHP解释器的基本符号,平常在使用的时候一定不要忘记。
思考:PHP是作为一种动态脚本语言来支撑Web2.0的,而动态网站的显著特性是能够与用户进行交互,交互的内容是什么?本质就是各种数据,但是PHP是一种运行在内存的代码,那么意味着在内存运行周期中,用户与服务器交互的数据就由PHP来承担,PHP要怎么来保留这些数据呢?
引入:PHP运行在计算机内存中,内存就是一种效率很高的存储介质,数据既然需要通过PHP来进行处理,那么PHP就需要将数据进行临时的保存,这种临时保存的机制就是通过PHP内定的量来控制,而量又分为两种:变量和常量
定义:PHP变量,是一种在PHP脚本运行周期内(从一个脚本的第一行代码执行到最后一行执行完成),系统通过指定的标识符,以“$”符号开始,指向保存在内存中的数据,从而在代码运行过程中,可以通过标识符来获得对数据的使用的一种代码形态。
1.PHP变量命名规则
2.PHP变量使用:PHP是一种弱类型语言,即变量的定义可以直接使用,且不用管实际赋值给变量的数据是什么样子
3.变量的生命周期:变量的存在是为了保证程序在运行过程中能够有效的访问数据,所以PHP变量的生命周期是两种:1是人为的删除变量(上例中unset删除变量);2是脚本执行结束(最后一行代码执行完毕)
4.预定义变量:系统中为了方便程序员开发,将很多需要用户很麻烦操作的变量制作成了系统变量,用户可以直接调用就能获取相应的数据结果。预定义变量通常都是数组数据。
5.变量传值:指的是将变量赋值给另外一个变量,在PHP中通常有两种方式来实现变量传值
6.变量内存分析:计算机中内存大致分为栈、堆、数据段和代码段
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u72dypyL-1645517241626)(效果图/PHP变量内存存储原理.gif “”)]
总结:PHP中的变量的存在是PHP能够成为动态语言的一个很重要特性,能够允许代码对数据进行加工、判断等,在实际开发中,应尽量保证变量的识别度(命名与实际代表意义)、变量的优化定义(避免定义不用的变量)。变量通常是用来保存用户有关的数据的(用户提交的或者用户需要的)
定义:变量的好处在于可以随时根据数据的需求改变变量所代表的数据,而常量则是一开始定义并赋值后,在整个脚本执行周期中不允许改变的量,其他与变量基本一致。
1.PHP常量命名规则
2.常量定义:常量的定义通常使用define函数或者const关键字,而且必须在定义的时候就对其赋值
3.常量使用:常量一旦定义不能改变,只能在后面使用其初始化时给的数据,常量直接通过常量名访问
4.系统常量:在系统中,有一些东西是程序员可能用到的,但是又不允许程序员改变,所以系统就定义了一些常量。
5.魔术常量:系统中有一些东西是在变化的,但是又是不允许随意变化,是有规律变化的。这个时候为了保证系统的健壮性,就尽量不让用户来进行控制。魔术常量就是其值会随着实际环境的变化而变化,而这种变化是程序员不能控制的。
总结:常量就是在一开始就固定数据,通常这些数据是不允许其他代码去改变的,能够保证数据的原始状态和真实性。常量的定义通常是程序员为了方便程序数据的使用而定义的。
思考:用户有很多的数据是需要通过变量来保存的,数据到底是如何管理的呢?
引入:数据的存在是复杂的,系统会通过分门别类来进行管理,一来可以保证数据的安全性,二来可以通过数据分类来实现内存的有效利用。
定义:在PHP中,将数据根据其特定的格式和应用归集成对应的类别,对每一种类别给定一种特定的名称。
1.PHP中数据类型分为三大类八小类:
总结:PHP是一种弱类型的编程语言,因此PHP中的变量本身没有数据类型,可以指定存放任何数据,但是对于具体要存储的数据有数据类型之说,主要是为了保证内存的高效利用。
思考:开发需求中必然会涉及到跟数值有关的信息,像年龄、商品价格等,这类数据在PHP中到底是怎么管理的呢?
引入:PHP中对于数值管理,通过两种方式来进行管理:整数和小数,而且为了支持不同的显示需求,PHP还会将数值按照特定的方式进行管理。
1.整型数据类型:在PHP中,整形采用8个字节存储数据,根据数据需求,PHP提供了多种进制的整数存储方式
2.进制转换:在实际开发的时候若需要用上进制转换的时候,可以使用PHP提供的系统函数。函数的记忆是比较方便的:二进制bin,八进制oct,十进制dec,十六进制hex,所以彼此的转换分先后组合即可:如二进制转十进制:bindec(二进制数或者字符串),得到一个十进制结果;另外唯一一个特殊的就是二进制转十六进制:bin2hex(二进制数或者字符串)。当然,进制转换是有规则的,大家可以了解下.
3.小数型数据类型:在PHP中同样采用8个字节存储数据,浮点数也提供了多种小数存储方式
4.浮点数精度问题:浮点数与整形一样使用8个字节存储数据,但是能够表示的数值却会比整形大很多,原因在于浮点数64个字节并非全部用来存数值,而是有一部分存储指数(10的N次方中的N),还有一部分用来存储实际数值。造成的结果就会带来两个:一个是存储的数值比整形大很多;二个是存储的数值的精确度只能保证在13-14位之间,超过该部分就会四舍五入(丢失精度)
总结:数值型存储类型用来存储整数和浮点数,整数部分数据量相对较小,但是很精确;浮点数部分不够精确,但是范围很大。因此在实际使用的时候,应当根据实际业务的情况来选择使用哪种类型(当然PHP会自动选择,不需要用户操心)。另外,浮点数因为小数和精度问题,不适合用来进行计算,只是适合大概范围数据。
思考:在实际业务需求中,总是会碰到类似的事情,用户会根据某件事的结果来做出不同的抉择,那么在程序中如何去保存这种Yes和No结果呢?
引入:在PHP中,对于一些抉择类的数据,通常是采用布尔类型来进行保存,因为布尔结果只有两种:True和false。
1.大多数程序语言都有布尔类型:布尔类型是一种简单的数据类型,专门用于对某些注重结果的数据存储,结果中只会有两个值:True和False
总结:PHP中布尔类型本身非常简单,但是在实际开发中的应用却非常广泛,凡是在判断的地方都是使用到布尔结果进行判定。
思考:实际业务当中,最常见的信息就是文字信息,文字信息有长短,那么在PHP中该如何实现存储呢?
引入:PHP中对于“文字”是最普遍的数据,几乎所有用户提供的数据都是“文字”数据,即便是用户填写的数字,在最终PHP接收的时候也是当做“文字”接收的。而PHP中,使用字符串这种数据类型来保存所有的“文字”数据。
1.在PHP中,凡是用户输入的数据,和程序员使用了引号(单引号和多引号)定义的数据,系统都理解为字符串。PHP7中字符串的长度理论上无限制。
2.单引号和双引号都可以定义字符串,但是彼此是有区别的:
3.在PHP中,考虑到有些特殊情况下,字符串会很长,而且有格式存在。所以PHP针对单引号和双引号还做了一层扩展:nowdoc结构(单引号)和heredoc结构(双引号)
4.字符串查看:日常字符串通常直接输出操作即可。PHP中字符串其实每个字符都有一个下标,可以通过下标(数组访问方式)来对字符串中的具体位置字符进行访问。PHP中的下标都是从0开始。
总结:字符串型是日常开发中所见到的最常见的一种数据类型,其中关键注意点就是单双引号字符串的区别,以及双引号中解析PHP变量的使用,在实际开发中经常用。
思考:在业务需求中,经常会出现这样的问题:一个用户通常会有许多信息需要展示,这个时候是不是用很多的变量来解决这个问题呢?如果是很多用户呢?
引入:程序中,为了解决某些系列数据问题,通常会用一个变量来保存所有信息,这样能够保证数据在进行解析和展示的时候更有层次感,也更方便。
定义:数组即数据的组合,是指将一系列相关或者相似的数据,组合到一起,使用一个变量代表。在数组中,可以有多个数据,每个数据称之为一个元素,元素与元素之间使用英文逗号“,”分隔。元素的组成有两部分:下标(key)和值(value)。
1.定义数组:在PHP中可以通过多种方式来定义数组,通用的几种方式如下:
2.PHP中数组的使用:PHP中数组的访问其实就是访问数组中的某个元素值,访问方式必须通过数组下标进行访问。默认的数组元素的下标是不可见的,根据元素的顺序从0开始。
'name',1 => 'age']
//访问name值
echo $arr[0];
?>
3.PHP中数组的特点
'张三','age' => 30,'gender' => '男');
//混合数组
$arr3 = array(1,2,'name' => '张三','age' => 30);
//访问:一样,使用下标访问
echo $arr1[1]; //2
echo $arr2['name']; //张三
?>
4.二维数组:普通数组基本都是一维数组,即数组里面的元素全部都是一维的(普通数据),但是有的时候,尤其是在大数据处理的情况下,通常都会存在数组元素本身也是数组的情况。我们把数组元素都是一维数组的数组称之为二维数组。另外,理论上来将,PHP中数组没有限定数组到底可以多少层嵌套(多维数组),但是建议数组的层级不要超过三维。
'张三',age => 30);
$user2 = array('name' => '李四',age => 23);
$user3 = array('name' => '王五',age => 40); //一维数组
//二维数组
$users = array($user1,$user2,$user3);
//二维数组访问:先通过一维下标找到对应的数组元素,然后用二维下标读取元素值
//获取张三的年龄
echo $users[0]['age']; //$users[0]的结果是$user1,然后组合$user1['age'],从而最终获得张三的年龄
?>
总结:在PHP中数组的使用频率非常高,在结合数据库操作之后,通常都是关联数组,而且在数据展示的时候二维数组居多(第一维索引,第二维关联),所以数组在程序开发当中使用的非常普遍,也是数据类型中比较复杂的一种。
思考:有这么多数据类型,在应用的时候如果确定需要某种指定的数据类型,如计算的时候需要数据是数值,到底如何确认数据是否满足呢?
引入:在PHP中,提供了一系列的数据判断函数,能够对数据进行格式判定,可以给程序员提供判定结果,以供参考。
定义:类型判定是系统通过指定函数来确定数据的类别,给定判定结果,结果为布尔值,是对应类型返回true,不是返回false。
1.通过系统函数判定数据类型:函数的格式很好记,使用is_开头,后面跟对应的数据类型,可以通过操作手册is_进行搜索查询(PHP操作手册.chm->索引->输入is_),以下讲几个常用的判定函数
总结:数据类型判定在实际开发中有着非常重要的地位,因为作为后台语言,要与用户进行交互,要时刻警惕用户提交的数据是否满足需求,必要时还要确保用户是否存在恶意操作。在实际开发中,要特别记住一句话:不要相信任何外来数据。
思考:数据类型可以判定用户的数据是否满足格式,但是如果碰到需要特定的数据的时候,而给定的数据是有效数据但是却不符合类型要求时怎么办呢?
引入:在实际开发中,这类问题会经常碰到,尤其是进行有效性判定的时候,给定的数据通常不是目标数据类型,那么这个时候就需要对数据本身进行类型转换。
定义:PHP中需要将一些不同的类型转换成某个指定数据类型才能进行相关运算,这种转换操作叫做类型转换。PHP是一种弱类型语言,所以在PHP中有两种类型转换方式:自动转换和强制转换。
1.自动转换:就是PHP会自动根据数据要参与的运算场景来将不符合条件的数据类型的数据转换成目标类型数据,这种操作在PHP代码中绝大多数时候可以满足开发需求。
2.强制转换:在程序员开发过程中某个特定节点下,需要对数据进行最终格式确定,这个时候可以对数据进行强制转换。转换方式是在数据变量前使用(目标数据类型)。
总结:总体而言,因为PHP的若类型,所以绝大部分时候PHP中需要转换的时候都会由系统自动完成,但是也会有某些情况下需要使用到强制转换(安全、明确)。合理的使用的数据类型的转换,能够帮助我们的代码更加健壮,安全。
思考:常量的数据是程序员为了程序运行定义的必要数据,变量保存的这些临时数据有什么用?
引入:变量通常保存的是用户数据,而用户的数据通常是需要通过各种运算才能满足存储或者给用户展示的形态。
1.定义:运算符是系统定义的特殊的符号,PHP解释器在碰到各种符号时,就会按照预定的方式来实现某些运算。
2.在PHP中,运算符很多,分为以下几类:
$b;
var_dump($res); //布尔true:10 > 5,成立
//全等运算
$res = ($a == $c);
var_dump($res); //布尔true:10 与 '10'系统自动会转换成相同的格式比较,都是10,所以相等
$res = ($a === $c);
var_dump($res); //布尔false:10与10值相同,但是10是数字,'10'是字符串,类型不同
?>
在PHP中比较运算比较特殊,通常系统会自动将类型转换成相同的然后进行比较,所以大家在使用和=比较的时候,如果自己不够明确可以参照PHP操作手册中的类型比较表:PHP操作手册->附录->PHP类型比较表。
松散比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7uP9zDAD-1645517241629)(效果图/PHP类型比较(松散比较).png “”)]
严格比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8tL5RpYT-1645517241630)(效果图/PHP类型比较(严格比较).png “”)]
$b); //1:因为 5 > 3
var_dump($a <=> $c); //0:因为 5 == '5'
?>
= 18){
//必须同时满足性别为男,同时年龄达到18周岁
echo '已成年';
}
//短路运算
true || $a = 10; //逻辑或运算,一个为true,整个为true,现在左边已经是true,那么右边不会运算
echo $a; //18,没有被修改,说明上述运算短路了
?>
= 18 ? '成年' : '未成年';
echo $man; //成年
?>
位运算符【了解】
> 1;
//00000000 ... 00000101
//00000000 ... 00000010 //最终结果:2
//在不使用第三方变量的情况下,交换两个变量的值
$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;
echo $a,$b; //35,实现交换
?>
3.运算符优先级:很多运算的时候都是同时使用好多个运算符号,那么此时就会有谁先算和谁后算的问题(如乘除同级但是高于加减),在PHP中运算符号也有优先级规定,具体可以参照PHP操作手册->语言参考->运算符->运算符优先级
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xJucOvNQ-1645517241631)(效果图/PHP运算符优先级.png “”)]
总结:PHP中运算符有很多,绝大部分都是经常要使用的。在PHP中会经常碰到数据运算,所以对于运算符的掌握是一种基础要求。