合并_01php基础语法(8days)笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并_01php基础语法(8days)笔记相关的知识,希望对你有一定的参考价值。
一.入门指引
1.php是什么?
PHP是什么?
Hypertext Preprocessor,超文本预处理器
Personal Home Page,个人主页
是一种在服务器端执行的脚本语言,可嵌入到 html中,尤其适合 web 开发。
?
php可以做什么?
网站,web程序 B/S架构
?
?
命令行脚本
桌面应用程序
?
?
二.安装Apache
制作一台服务器,来提高网页服务,只要安装了一个能提供网页服务的软件的电脑,就可以称之为网页服务器。
常见的网页服务器软件
- Apache
- IIS
- Google
?
安装Apache
1. 在D盘根目录下新建一个文件,命名为amp,并分别创建apache、php和mysql文件夹
2. 填写基本信息
?
- 选择自定义安装,
?
?
?
?
?
- 选择安装路径
?
- 安装,完成
?
6测试安装是否成功
在浏览器中,输入http://localhost,看到如下界面,就表示安装成功
分析:it work是哪里来的?
?
在htdocs 下,有一个html页面,如下:
?
Apache默认的文档目录,apache/htdocs
默认的索引页:index.html
?
Apache的安装易出问题的地方:
关于端口的占用问题,http的端口是80,迅雷用的也是80端口。
什么是静态网站,什么是动态网站?
?
是否和数据库打交道,动态网站的内容是随时变化的,而静态则一成不变(除非更改源代码)。
?
对于动态网站而言,我们需要提供一个数据源,通常情况下,是由数据库来完成的。比如mysql
?
对于apache而言,他只能管理文件和文件夹,并不能完成和数据库的交互,也不能完成逻辑代码的编写,所以,我们需要一门语言来完成这个工作,这就是PHP了。
?
对于静态网站来说,只有html,css和javascript,而动态网站,则包括一门语言和数据库(PHP+MySQL)
?
?
三.安装PHP
Php并没有独立的安装程序,它是作为apache的一个模块来安装的。
安装步骤
- 在amp目录下新建一个文件夹,命名为php,然后将php安装包拷贝到该目录下,并解压。
- 然后配置apache
- 找到httpd.conf文件
?
- 具体配置
?
要讲php作为apache的一个模块来运行,将php配置为apache的一个模块,使用loadmodule指令完成。
LoadModule 模块名 模块文件
?
?
凡是php文件,要指定将其php模块来处理。配置这个的指令有三种:
第一种:使用addtype指令,
?
第二种:使用addhandler指令
?
这种,有一个小问题,就是只有文件名中含有.php,都会被当做php文件来解析。所以一般不推荐
?
第三种:使用FilesMatch指令
?
PHP在运行的时候,需要载入php的配置文件,由于php是作为apache的一个模块来运行的,所以我们需要告知apache,这个配置在哪里。
?
找到php.ini相关文件
?
复制其中一个,然后更名为php.ini
使用PHPIniDir配置,设置PHP。Ini路径
?
?
有了上述三个配置,基本上就可以完成apache和php的整合。
?
?
注意,配置文件,很容易出错,一般来说,一个指令尽量要顶格写。
?
有时候,还需要对php进行一些初始化设置。需要在php.ini文件中进行相应的配置。
?
常用的配置:
Extension,php扩展库目录
?
?
在默认情况下,所有的扩展库都是关闭的,所以我们还需要手动开启相应的一些扩展库,比如gd库、myslq扩展库。
?
市区设置
?
一定要注意,在php.ini配置过程中,要顶格写。
每一次配置都需要重启apache才能生效,php.ini也是一样。
?
php与apache之间的联系
Php作为apache的一个模块来运行的,php和apache是通过CGI来关联的。
建议大家使用php5.3版本。
?
四.安装MySQL
安装步骤
- 在amp下新建一个目录,命名为mysql
- 安装
- 选择自定义安装
- 选择安装目录和数据存放目录
?
- 启动配置向导
- 选择详细配置
- 选择开发者机器
- 多功能
- 端口和模式设置
- 选择字符集
- 设置path
- 设置密码
?
出现了错误
?
?
- 安装完成
?
测试安装
?
Php连接mysql。
测试
在phpinfo中查看是否有mysql,
?
可以编写一段代码来测试,
?
可以安装一个phpmyadmin来测试
将phpmyadmin解压到在htdocs下,然后更名为phpmyadmin,然后访问即可。
输入用户名和密码,进入主界面
?
?
Mysql安装最容易出问题的当然,是卸载之后的安装,原因在于卸载并不彻底,主要是这数据存放目录data。默认在C:\\C:\\ProgramData\\Mysql\\Mysql server\\data
?
?
五.虚拟主机配置
通常情况下,一个web服务代理一个网站,但是有时候我们需要用一台服务器代理多个网站。这个就是基于域名的虚拟主机技术。
?
我们可以直接在httpd.conf当中进行配置,也可以使用extra中的httpd-vhosts.conf配置,建议使用第二种方式。
首先要开启vhost.conf配置,
?
打开vhost.conf进行配置
?
为了使用基于域名的虚拟主机技术,我们需要指定服务器的ip和端口来接收服务。
这个通过NameVirtualHost 指令完成。
NameVirtualHost *:80
如果端口不是80 必须要改端口的,这句很关键
?
其中*表示所有的ip地址,如果是一个具体的ip,你可以写上这个ip,但建议使用*,80指的是端口。
接下来,要单独的配置具体的域名,通过 VirtualHost 指令段,其参数必须和NameVirtualHost
而且在指令段中必须包含ServerName 和 DocumentRoot
?
?
配置hosts文件,指定域名和DNS的对应关系。
?
?
?
?
通过浏览器访问某个域名的时候,需要进行域名的解析,首先找本地的hosts文件,如果能解析,就使用本地的配置,如果不能解析,则去外网进行解析。
?
?
现在去访问localhost,会怎么样?
会访问到在vhost文件中配置的第一个虚拟主机。
?
默认的虚拟主机,如果访问一个url,没有配置对应的虚拟主机,则会访问到vhost文件中配置的第一个虚拟主机。
?
?
再来配置一个
?
那如果要访问原来的localhost。
?
?
在hosts文件配置域名ip对应关系
?
?
? 配置细节
- 配置项一般不区分大小写,但参数通常是大小写敏感的
- 配置项要顶格写,否则无效
- #表示注释
- / 和 \\ 的使用,路径的结尾不用添加斜线,建议使用/
- "" 的使用,地址要使用引号包含
- Apache 的每一次配置,包括后面的php.ini的配置,都需要重启apache才能生效
- 如果配置错误,则Apache不能正常启动
?
思考一个问题:
一个主配置httpd.conf,一个是辅助配置文件vhost.conf
如果关闭辅助文件,然后再来访问localhost,会怎么样?
在主配置文件中,有如下配置:
?
六.访问权限配置
在G盘中配置一个虚拟主机shop.cc,然后在浏览器中进行访问,
?
说明没有权限。
Apache有一个严格的权限控制。
?
通过directory指令来进行权限的配置。
默认的一个权限配置
?
?
第一种解决方案:在主配置文件中配置directory段,如下
?
第二种解决方案,在辅助文件中,对应的virtualhost 指令段中进行配置(推荐)
?
?
注意,这个配置要求更加严格,
?
将shop网站下的index.html更名为index1.html,出现如下状况:
?
默认的索引页,
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
?
在默认情况下,只索引index.html,如果要默认能够访问index.php,可以在此处添加
DirectoryIndex index.html index.php
?
?
索引列表
如果没有默认的索引页,它会将该文件夹下面的所有文件以列表的形式展示出来,但是需要有权限才行。
?
?
在实际的网站部署时,索引列表是应该 关闭的 。
FollowSymLinks 是指的符号链接,linux系统才有效。
?
关于Deny 和 Allow 的说明
[总则]:
影响最终判断结果的只有两点:
- order语句中allow、deny的先后顺序;
- allow、deny语句中各自包含的范围。
?
修改完配置后要保存好并重启Apache服务,配置才能生效;
开头字母不分大小写;
allow、deny语句不分先后顺序,谁先谁后不影响最终判断结果,但都会被判断到;
order语句中,"allow,deny"之间"有且只有"一个逗号(英文格式的),而且先后顺序很重要;
Apache有一条缺省规则,"order allow,deny"本身就默认了拒绝所有的意思,因为deny在allow的后面;同理,"order deny,allow"本身默认的是允许所有;
"order allow,deny"代表先判断allow语句再判断deny语句,反之亦然。
?
如果主文件和辅助文件都配置了权限,会怎么办?
以辅助文件为主
注意options这个指令,不会叠加,所以有时候我们会看到在indexes 有一个 + 或者 -的出现。
?
?
七.分布式配置文件
?
.htaccess
分布式配置文件,名字是固定的
?
?
配置分布式文件步骤:
- 开启分布式配置,默认情况下,这个是关闭的
将 AllowOverride None 改为 AllowOverride All 就开启了分布式配置
?
- 创建.htaccess
使用editplus编辑器或其他高级编辑器来创建
?
?
- 配置相应的权限
凡是写在directory中的权限配置都可以写在这个文件当中。
deny from All
?
分布式配置文件修改之后,不需要重启,立即生效。
?
和directory配置一样,所配置的权限在该目录及其子目录生效。
?
?
思考:使用.htaccess好不好?
?
优点:方便,给内容提供者一个自由配置权限的机会。
?
缺点:性能所损失(不小),只要开启分布式配置,那么它会在每个文件夹下搜索.htaccess。
?
一般不推荐使用分布式配置文件。
?
?
? 注意细节
- .htaccess 文件,比较特殊,可以使用 editplus 或者 ST2 等编辑器来创建。
- .htaccess 属于目录级别的控制,对应于 Directory 指令段中的配置。
- .htaccess 默认并未启用,可在主配置文件中使用allowoverride 指令加以配置。
- 配置修改.htaccess 文件,不需要重启,每次都会读取,性能有损失。
?
?
?
?
?
?
作业:配置一个虚拟主机,名字 test.ip.com,其中ip就是大家自己的IP,如test.192.168.5.32.com
?
?
?
?
?
八.Php语言基础
?
Php语言的执行周期
?
- apache来调用php模块
- 初始化php模块(读取php.ini配置文件,并加装相应的扩展库)
- 处理php代码
- 释放php的相应资源
- Php模块将处理结果返回到apache
?
?
Opcode是zend 引擎能够识别并执行的代码。
?
?
弄清一个概念?
PHP是什么类型的语言? 编译型 or 解释型
?
任何一门语言,C、PHP、java最终都要转换成机器能够识别的代码才行。这个过程通常称之为编译(解释、翻译)。
?
编译之后,得到一个编译后的代码,对于编译后的代码,在执行的时候,通常有两种选择,一是重复的执行编译后的代码,一次编译,多次运行,这种类型的就是编译型。
二是每一次执行都需要编译一次,像这种类型的就是解释型语言。
?
PHP属于解释型。
?
为什么需要标记?
<?php ?>
?
由于php是可以嵌入html代码的服务器端的脚本语言,php可以和html混在一起写,如果没有一个标记以区分哪个是PHP代码,那么php模块如何来处理php代码呢?
?
标记有四种:
- <?php ?> 标准的写法,推荐使用
- <script language=‘php‘> </script>
- <? ?> [需要开启short_open_tag] (在php.ini中开启)
- <% %> [需要开启asp_tags]
大家需要注意的 <? ?>,但是在5.3之后,默认是关闭的。
?
Php语句结束符
开启错误显示
display_errors = On
?
每一行代码必须有一个分号作为语句结束符。
Php结束符 ?> 默认包含一个语句结束符
如果php代码段是整个文档内最后的一个代码段,可以省略结束标记 ?>
?
如果整个文件都是php代码,建议不写 ?>
?
注释:
单行注释:# //
多行注释: /* */
?
? 注意细节
- 尽量多写注释
- 注释应尽量规范化 [推荐使用phpdocumentor规范]
- php注释只能注释php的代码,不能注释标签的内容
- 放在html代码注释内的php代码也会被执行
?
?
?
?
?
一.变量
1.变量概念
所谓变量,是指在程序中其值可以变化的量。
?
程序是用来管理和处理数据的。在程序运行过程当中,我们需要保存这些数据,变量和常量就是用于保存程序运行时的数据的。
?
变量通常由两部分组成,变量名 和 值
?
在php中,定义一个变量,使用$符号,在定义的时候不用理会其类型。
?
增,就是赋值,比如$a = "PHP"
改, 重新赋值即可,$a = "Mysql"
查, 通过引用的方式 如 $a
删, 使用unset
?
Unset 到底干了什么?
去掉了引用,然后销毁变量。
?
变量的命名规范
- 变量名通常是由字母、数字和下划线组成,不以数字开头。
- 见名知意
- 对于一个有多个单词组成的变量名,单词之间如何分割,firstName,first_name。(入乡随俗)
? 注意细节
- $不是变量名的一部分,这是语法,表示后边的标识符是一个变量(特殊的this)
- 当使用一个没有定义的变量时,会报一个notice错误,可以使用isset来检查
- 变量名是大小写敏感的,建议使用下划线方式
?
?
2.变量之间的赋值
在php中,变量赋值默认是采用值传递的方式。
?
?
还有一种传值的方式,就是引用传递。
?
? 注意细节
unset一个变量时,删除了该变量,以及标识符到变量之间的引用
只有有名字的变量才可以引用赋值。($bar = &(24 * 7); // 非法;)
?
3.可变变量
变量名(变量标识符),它还可以是一个变量,这就是可变变量。
?
简单的例子
在php中,不仅有可变变量,还有可变函数。
?
4.预定义变量
php中存在很多不需要用户脚本来定义就可以直接使用的变量,称之为预定义变量。
- $_POST
- $_GET
- $_REQUEST
- $_SERVER
- $_FIELS
- $_SESSION
- $_COOKIE
- $_ENV
- $GLOBALS
?
关于get和post,如果在get和post同时存在一个变量,应该取哪一个值。
?
取决于reques的顺序。
?
起作用是后面POST。
?
$_REQUST = $_POST + $_GET
?
如果能够明确是post还是get提交,就直接使用post或者get,当不明确的时候,那就可以使用$_REQUEST。
?
$_SERVER,和HTTP协议以及服务器相关的一些信息。
?
:服务器的ip地址
:浏览器请求端的IP地址
:当前请求的完整的URL路径
:文件名,相对的路径
?
? 注意细节
- 使用request时,如果post和get都有一个相同名称的变量时,则只保留post,取决于php的配置 request_order = ‘GP‘;
- $GLOBALS 引用全局作用域中可用的全部变量
?
作用域
什么是作用域?
指的是变量的生效范围。
- 全局变量
- 局部变量
- 超级全局
?
全局变量的作用域,也就是生效范围,在当前脚本,在脚本运行结束的时候失效。
?
?
二.常量
1.常量的基本用法
和变量相对应,在程序运行过程中,其值不能变化的量,这就是常量。
定义常量,需要使用define函数。
?
常量一般都使用大写,我们可以通过define函数的第三个参数来决定是否区分大小写,默认情况是大小写敏感的,设置为true,则不区分大小写,但不建议这么做。
?
常量不能重新复制,
在编程的时候,有时候不知道常量是否已经定义,或者说在常量没有定义的情况下,我就要定义它。该怎么做?
?
使用defined函数来判断常量是否已经定义。
?
常量的命名,规则和变量一致,但是使用大写。
?
变量和常量的区别
- 变量有$符号,常量没有。
- 常量只能使用define语句来定义,不能直接使用赋值语句。
- 变量是有作用域的,但是常量是没有作用域概念的。
- 常量的值一经定义,不可改变
- 常量的值只能是标量(整型,浮点,字符串,布尔)
?
在php5.3以上,还可以使用constant函数来获取常量的值。
2.预定义常量
PHP自身也提供了大量的预定义常量,可以通过get_defined_constants函数获取。
比如:
?
:换行符,很重要
不同操作系统其换行符是不同的,
Windows:\\r\\n *nix:\\n MAC:\\r
PHP_EOL,会根据不同的操作系统,使用不同的值。
?
整型的最大值,整型占用的字节数
?
目录分隔符,windows下面可以使用\\ 和/,而在*nix下面则只使用/。
?
环境变量中路径与路径之间的分隔符。
?
C:\\Program Files\\Intel\\WiFi\\bin\\ ; C:\\Program Files\\Common Files\\Intel\\WirelessCommon
?
在手册中的位置
3.魔术常量
形似常量,实非常量。
?
典型的应用(项目代码)
下面的写法也是可以的,但要注意__DIR__必须在PHP5.3以上版本才支持。
?
? 注意
- 它们的值随着它们在代码中的位置改变
- 这些特殊的常量不区分大小写,但尽量大写,保持一致
?
魔术常量的名称 前后都有__,所以大家在定义常量的时候,就不要使用这种形式。
?
三.数据类型
什么是数据类型?
简单来说,具有某种类型的数据,不同类型的数据在结构上、操作上都有不同的限制和约定。
在PHP中,有八种数据类型,4 + 2 + 2
4: 4种标量类型(简单),整型、浮点型、布尔、字符串
2:两种复合类型,数组和对象
2:两种特殊类型,资源和NULL。
?
?
?
PHP在定义变量的时候,是不需要声明类型的。但是它不代表没有类型的。
变量的类型是如何确定的?在程序运行的上下文来确定的。
?
如何来查看某个变量的数据类型? 使用var_dump函数。
?
?
1.整型
在php当中,整型的范围,占用 个字节,最大值是多少?
?
在PHP中,不支持符号。没有无符号的(unsigned)。
?
整型,除了可以使用十进制的表示方式之外,还可以使用八进制,16进制来表示。
八进制:以0开头,如012--->2*80 + 1 * 81 = 10
十六进制:以0x开头,0x12--->2*160 + 1 * 161 = 18
不同的位,有不同的权。
?
要将10进制转成其他进制,如2进制,8进制,16进制? 要使用长除法
55
?
在php中,提供了一系列的函数用于进制之间的转换。
? decbin:10进制 -> 2进制
? dechex:10进制 -> 16进制
? decoct:10进制 -> 8进制
? bindec:2进制 -> 10进制
? hexdec:16进制 -> 10进制
? octdec:8进制 -> 10进制
?
Dec :10进制 bin:2进制
Oct :8进制 hex:16进制
? 注意细节
- 对于整型,一旦数值过大,不会溢出,而是发生类型转换,会转成浮点型。
- php不支持无符号整型。
?
?
Php中的整型,无法定义让其只有正数部分。
2.浮点型
浮点型,在php中,float,double 实际上是相同的。
?
在PHP中浮点数具有14位十进制数字的精度,最大值 和平台相关,通常是 1.8e308。
?
注意,浮点数的比较是不靠谱的。
在编写程序的时候,不要试图通过比较两个浮点数是否相等来获得业务逻辑。
其它的定义浮点数的方式,科学计数法的方式 e或者E
3.布尔类型
这是最简单的数据类型,它只有两个值,TRUE和FALSE,而且不区分大小写。
我们经常说0表示假,非0表示真。在程序运行的时候,会转换成布尔类型。0和1本身是表示整型的。
?
?
通常情况下,布尔类型应用在程序的流程控制当中,尤其是if语句中。
4.字符串类型
一个字符串,它是由多个字符组成的,通常情况下,我们有四种方式来定义字符串。
- 双引号
- 单引号
- Heredoc (定界符)
- Newnoc (定界符)
?
在双引号中,可以解析变量,而在单引号中,是不能解析变量的。
?
在单引号中,可以包含双引号,在双引号中,也可以包含单引号。但是不能自身。
变量能不能解析,不是取决于变量被哪一个包含,而是取决于定义字符串是单引号还是双引号,如果是双引号,则变量解析,如果是单引号,则不解析。
?
在字符串中,如果有{$ 连在一起的时候,就表示{}当中的这个作为一个变量进行解析。
?
?
[需求]:使用php输出一个a标签,并给a标签定义一个点击事件,alert一句话。
?
需要使用转义字符
?
转义字符
在双引号中,支持所有的转义字符。
在单引号中,只支持‘ 和
?
使用PHP输出一段html代码
?
Heredoc的结束符必须顶格写,且改行除了结束符和;,也不能有其他的内容。
5.数组
数组是一组数据的集合,是一个复合类型的。数组可以保存多个值。
数组中的每一个元素都是由Key/value组成的键值对。
数组的基本操作
增加 定义
定义一个数组有两种方式,使用array结构或者使用 []语法
在定义的时候,可以指定下标,也可以不指定下标。
?
指定下标
下标的数据类型可以是哪一些?
通常情况下使用的是整型和字符串,当然也可以使用浮点和布尔类型。只能是标量类型。
如果是浮点数,则会取整(只取整数部分)。如果是布尔类型,true->1 false->0,不要使用浮点和布尔。
?
如果下标重复,实际上就是修改该元素,那么其结果就是修改之后的值。
在一个数组中,可以同时存在整型下标和字符串下标。
以数字作为下标,我们一般称其为 索引数组。
以字符串作为下标的,我们一般称其为关联数组。关联数组能够表示业务逻辑。
?
不指定下标
在定义数组的时候,如果省略下标,如果还没有元素的话的,就从0开始,否则元素的下标就是在当前的最大索引上加1。
?
查看
可以使用print_r 和 var_dump,可以结合pre与格式标签,不要使用echo来输出数组,它只能输出Array。
?
修改
重新赋值即可。可以使用array语言结构全部修改,或者使用[]来修改某一个元素。
?
删除
删除数组有两种情况,一是删除其中的某个(某些),而是删除整个的数组。都可以使用unset。
?
? 注意细节
- 元素的下标只能是字符串和整型,可以使用浮点数,但会被取整,如果使用字符串形式的数字,则仍会被当做整数。如果使用布尔型,则true->1 ,false-> 0
- 可以不指定下标,如果不指定下标,则系统会自动分配一个数字下标,其值是当前最大的下标 + 1。
- 如果指定的键名已经有了值,则该值会被覆盖。
- 应始终在用字符串表示的数组索引上加上引号。$foo[‘bar‘] √ $foo[bar] ×。
- 字符串的 [] 特殊用法
?
在字符串中,也可以使用数组的方式来访问该字符串中的字符。可以将字符串比作数组,而字符则是该数组中的元素。此时只针对单字节字符有效,如果是多字节,则会出现乱码。
6.对象
和数组类似,是一个复合类型的数据,数组只能保存多个变量,而对象不仅可以保存多个变量,而且还可以保存方法。有时候,我们称对象是有生命力的数组。
7.资源
在使用PHP编程的时候,有时候需要操作一些不属于PHP本身的一些资源,比如数据库,图形处理,文件处理。
当我们使用php扩展库的时候,就会得到一个资源类型的数据。
?
8.NULL
NULL表示一个变量没有值,该类型只有一个值,就是NULL,而且不区分大小写。
什么样的数据会是NULL。
?
在下列情况下一个变量被认为是 NULL:
- 被赋值为 NULL
- 尚未被赋值
- 被 unset()
?
最常见的一个应用就是将对象的值赋值为NULL,以销毁该对象。
?
9.伪类型
有时候,我们需要在程序或手册中描述数据的类型,这就是伪类型。
Number 数值型,如max函数
Mixed 混合类型(不确定),如var_dump函数
Callback 回调函数,如array_map
Void 空,如echo和pi
?
?
作业:
进制转换,十进制101转成二进制,八进制。
$a = 5, $b = 10,不用第三个变量,交换两个数的值。
利用循环及转义字符知识 输出 ASCII码中的可见字符。提示:32-126之间
?
?
?
?
?
?
?
?
?
作业说明
进制转换,十进制101转成二进制,八进制。
两种都要会,一是手算,理解原理。
二是利用系统函数,
二进制:bin
八进制:oct
十进制:dec
十六进制:hex
其它进制转成十进制,参数是字符串。
?
?
$a = 5, $b = 10,不用第三个变量,交换两个数的值。
利用加减法(正解)
?
下面的方法也可以
?
?
利用循环及转义字符知识 输出 ASCII码中的可见字符。提示:32-126之间
?
一.类型转换
?
运算数在参加运算的时候,需要将类型转为相同,然后才进行计算。在上面的例子中,第一个运算中,会先将$int转成浮点,然后和$f1相加,第二个运算中,会先将$str转成int类型,然后和$int相加。
?
在这个过程中,出现了类型转换。在上面的例子中,转换是系统自己进行的。
?
弱类型和强类型。
?
在定义一个变量的时候,不需要指定变量的类型,它的类型由程序的上下文来决定的,比如$a = 10,那就意味着$a是一个整型,$a = ‘hello‘,就意味着$a是一个字符串。
像这种确定变量类型的方式就是弱类型。
与之对应的就是强类型,比如C、java、C#等。
?
变量在参与运算的时候,类型发生了变化,但变量本身的类型并没有改变。
?
?
注意两点:
- 在参与运算的多个操作数据之间,运算之前都需要将数据类型转成一致才可以。
- 这并没有改变这些操作数本身的类型;改变的仅是这些操作数如何被求值以及表达式本身的类型。
?
通常有两种方式来完成类型转换:
- 强制转换
- 自动转换
?
强制转换,我们在需要转换的变量之前,使用类型关键字,用括号括起来。
Int 或者 interger
Float
Boolean
String
Array
Object
在PHP中,实现强制转换,在要转换的变量之前加上用括号括起来的目标类型即可。
- (int), (integer) - 转换为 整型(integer)
- (bool), (boolean) - 转换为 布尔型(boolean)
- (float), (double), (real) - 转换为 浮点型(float)
- (string) - 转换为 字符串(string)
- (array) - 转换为 数组(array)
- (object) - 转换为 对象(object)
- (unset) - 转换为 NULL
?
将其他类型转为资源类型是没有意义的。
强制转换在程序中,应用并不多,大部分情况下,使用自动类型转换就可以完成业务逻辑。
?
转换规则
?
转换成字符串
- 一个 整数 或 浮点数 被转变为数字的字面样式的字符串
- 一个boolean TRUE 值被转换成 字符串"1"。 Boolean FALSE 被转换成"" ????
- 数组转换成 字符串 "Array"
- 资源总会被转变成"Resource id #1"这种结构的 字符串
- NULL 总是被转变成空的字符串。
?
?
?
转换成整型
- 从布尔值转换,FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。
- 从浮点数转换,当从浮点数转换成整数时,将向下取整。
- 从字符串转换,如果字符串 没有包含 ‘.‘,‘e‘或‘E‘ 并且数字值符合整数类型的限定 ,可被认定是一个 integer, 否则被认定为一个float。字符串的开始部分给定了它的值,如果 字符串 以合法的数字开始,这个数字可直接使用。 否则,值就是 0 。
?
转换成布尔型
当转换为 boolean 时,以下值被认为是 FALSE:
- 布尔值 FALSE 自身
- 整型值 0 (零)
- 浮点型值 0.0 (零)
- 空字符串, 以及 字符串 "0" (注意"00"、"0.0"被认为是TRUE)
- 空数组
- 特殊类型 NULL (包括尚未设定的变量)
?
所有其它值都被认为是 TRUE(包括对象和资源)。
1 和其它非零值(不论正负)一样,被认为是 TRUE!
? 注意细节
- HTML 表单并不传递整数、浮点数或者布尔值,它们只传递字符串。
- FALSE 是一个布尔值而 "false" 是一个字符串。
数据类型相关函数
- Var_dump:打印变量的详细信息,包括类型和值
- Gettype:获得类型
- Settype:设置类型
- Is系列:其中is_array会经常用到
- Isset:检查一个变量是否存在(设置)
- Empty:检查一个变量是否为空
?
对于isset而言,只要声明过(有值),不管它的值是什么,那么就返回true
对于empty而言,相当于 boolean(变量) ,然后再来取反。
简单例子
注意,在使用empty时候,要结合具体的业务逻辑类分析。
?
二.运算符
能够实现某种运算功能的符号。
根据不同的功能,可以分为以下几大类:
- 算术运算符
- 赋值运算符
- 字符串运算符
- 比较运算符
- 递增/递减运算符
- 逻辑运算符
- 位运算符
- 错误控制运算符
- 三目运算符
?
不同的运算符所对应的的运算数是不同的,单目、双目、三目。
一个运算符在进行运算的时候,需要确保运算数是一致的。
1.算术运算符
除法运算的结果,可能是浮点数,也可能是整数。
在取模运算中,如果有小数,则会去除小数部分。
在取模运算中,结果的正负取决于第一个数。
面试题:
执行程序段<?php echo 8%(-3) ?>将输出
?
2.赋值运算符
就是 =
$a = ‘php‘
?
[思考]:$a = ($b = 4) + 5; 这行代码如何理解? $a = 9
赋值运算表达式的值也就是所赋的值。也就是说,"$a = 3"的值是 3。
表达式也是有值的。
有时候我们还将 = 和其它的运算组合到一起,形成组合赋值。
$a = $a + 5 => $a += 5;
?
3.字符串运算符
只有一个,就是 点 . ,没有加号,
注意的是,点 和 赋值运算符一起 形成 组成赋值。
.=
4.比较运算符
比较运算符,比较两个运算数的关系,返回的结果是一个布尔值。
不等有两种写法,!= 和<>
?
?
? 注意细节
如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。
=== 和 == 的区别。比如 0 == false 返回真,而0 === false 返回假。
?
5.递增递减运算符
++ 和 --
根据其位置的不同,又分为前++,前--,后++,后--
?
前置和后置的区别?
不管是前置还是后置,变量的结果是一致的。
不同的运算的顺序,通过表达式来分析,前置,++$b,是先进行运算,然后再得到值,
而后置$b++,则是先得到值,然后进行运算。
?
?
? 注意细节
递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1
?
?
6.逻辑运算符
?
与:两者都为true的情况才为true and
或:两者都为false的才为false or
?
非:非真即假,非假即真,直接取反。 !
?
异或:xor,如果两者相异,结果为真,两者相同,结果为假。
?
之所以出现 && 和and 两种运算符,是由于它们的优先级不同。
?
短路运算:
在进行逻辑运算的时候,如果通过第一个参数已经能够确定整个表达式的值,那么就不会进行后面的运算。
?
对于 与 运算,如果第一个为假,则后面的不会进行计算。
对于 或 运算,如果第一个为真,则后面的不会进行计算
?
真实的代码:
?
7.位运算符
按位进行运算,
位,bit,是指二进制表示中的每一个数值。 010101
字节 Byte,是由位构成的,通常是8 bit 00001010
1KB = 1024 Byte
1MB = 1024 KB
1GB = 1024 MB
1TB = 1024GB
已知$a = 9,$b = -4,分别求: $a & $b, $a | $b, ~$b,$a ^ $b,$a >>2, $b<<2的值。
位运算都是以二进制的形式来出现的。
同时要注意,二进制的表示形式有 原码、反码、补码。
?
原码:
将十进制转成的二进制。用最高位表示符号位,0表示正数,1表示负数。
?
反码:
对于正数,反码和原码相同
对于负数,符号位不变,其它位取反。
?
补码:
对于正数,补码和原码相同
对于负数,在反码的基础上 + 1。
?
计算机在底层进行运算的时候,是以补码的形式进行的。Why?
?
$a & $b $a | $b的过程:
?
- 右移:低位溢出,符号位不变,高位用符号位补全 (相当于除以2n 然后取整)
- 左移:高位溢出,符号位不变,低位补0 (相当于乘以2n)
?
$a >> 2 和 $b << 2的运算过程:
不管是左移还是右移,它只会改变该数的大小,不改变符号,所以在移位操作的时候,符号位始终是不变的。
?
在实际编程的时候,经常会用一个位表示一种状态(或一个值)。
?
8.错误控制运算符
?
我们不期望看到错误,可以使用错误控制运算符进行屏蔽。
?
不是在每个会出现错误的地方使用这个运算,一般而言,对于我们无法控制的错误,比如去请求其它的资源的时候,可以使用。
?
? 注意细节
@ 运算符只对表达式有效。不能把它放在函数或类的定义之前,也不能用于条件结构例如 if 和 foreach 等。
?
9.三目运算符
从名字我们就可以得知,这个运算符有三个运算数。? :
表达式1 ? 表达式2 : 表达式3
等价于一个简单的if……else语句
If (表达式1){
表达式2
} else {
表达式3
}
使用三目运算符可以简化程序。
?
10.其它特殊运算符
主要有以下几个:
=> 数组运算符
表示键和值的对应关系
Array(‘os‘ => ‘Linux‘
[ ] 数组运算符
用于获取数组元素
-> 对象运算符
对象操作属性,以及方法的运算符
?
instanceof 对象运算符
判断某个对象是否是类的实例。
:: 域作用符,用在面向对象当中的。
?
11.结合性和优先级
先看一个问题:
?
多个运算数在参与运算的时候,要注意它们的顺序和优先级。
?
在程序当中,并不是所有的运算符都是由左向右的,有一些是从右向左,比如赋值=。
一般来说,单目运算符比双目运算符的优先级高。
?
= 的优先级比较低,比它还低的有 and or xor ,
And 和 && 的区别
? 注意细节
- 运算符优先级指定了两个表
以上是关于合并_01php基础语法(8days)笔记的主要内容,如果未能解决你的问题,请参考以下文章