php学习笔记
PHP学习笔记--------- 2020.04.17
PHP底层是C语言。
静态网站:web1.0时代
1.静态网页就是实实在在的保存在服务器上的文件,每个网页都是一个独立的文件。
2.静态网页内容相对稳定,因此容易被搜索引擎找到。
3.静态网页没有数据库支持,在制作网页和维护网页方面的工作量较大,因此网站信息量大的时候完全依赖静态网页制作网站会很困难。(每个人看到的网页都是一样的,因为文件是一样的。)
4.静态网页的交互性较差,在功能方面有很大的限制。(我的网站文件里有什么内容你就看什么内容,其他的,没有所以交互性很差。)
动态网站:web2.0时代---就是解决静态网页的缺点。
1.交互性:网页会根据用户的要求和选择动态改变和相应,浏览器作为客户端,成为一个动态交流的桥梁。
2.自动更新:即无需手动更新HTML文档,便会自动生成刷新页面,可以大大节省工作量。
3.因时因人而异:不同用户,不同时间,访问同一网址可能看到不一样的也页面。
静态网页与动态网页 是相对的,常见的区别方法:
后缀为: .htm .html .shtml .xml 的基本可以判断是静态网页
后缀为: .asp .jsp .php .perl .cgi的基本可以判断是动态网页
在动态网页里有个标志性的符号---“?”
动态网页访问流程:
PHP代码标记符号
ASP标记:<% php代码 %>
基本弃用
段标记:<? php代码 ?>
基本弃用
脚本标记:<script language=”php”> php代码</script>
标准标记(常用):<?php php代码?>
开始介绍语法知识:
1.
第一行的输出有个结束符号 ;
而第二行没有,但是也能正确执行,这是因为 PHP的 ?>有自动结束语句的作用。
这种情况也是允许的:
这样也能正确执行,单标记的,这时候就把下面全部的代码都认为是PHP代码来编译。
变量
1.定义变量:在PHP中,不需要任何的关键字来定义变量,直接赋值就好。
2.格式: $
符号开头。区分大小写
,名字由字母数字和下划线组成,但是不能数字开
头.PHP允许中文变量名,但是我们不建议使用。
3.以下的是系统预定义变量(预定义变量都是数组)
$_GET
: 获取所有表单以get方式提交的数据
$_POST
: POST 提交的数据都会保存在此
$_REQUEST
: GET和POST 提交的都会保存·
$GLOBALS
: PHP中所有的全局变量(后面再细讲)
$_SERVER
: 服务器信息
$_SESSION
: session 会话数据
$_COOKIE
: cookie 会话数据
$_ENV
: 环境信息
$_FILES
: 用户上传的文件信息
4.可变变量:
如下例子:
$a=’b’;
$b=’abcd’;
echo $$a;
- 找到
$a
,然后解析得结果: b - 将第一个
$
符号与b进行绑定:$b
- 解析
$b
,得到结果 abcd .
变量传值:两种方式:值传递 、引用传递(内存地址传递)
引用传递:
$a = 1;
$b = 2;
$aa = &$a ;
常量定义形式:(两种)
1.使用定义常量的函数: define(‘常量名’,常量值);
2.5.3版本之后才有的:const 常量名 = 值
- 常量不需要使用
$
符号,一旦使用$
就会被认为是变量。 - 常量的名字组成由字母,数字和下划线组成,不能数字开头。
- 常量名称通常大写字母(与变量区别开来)。
- 名称可以使用一些特殊字符,但要用define()来定义。
例子:define(‘-_-’,’smile’);
//正确
const -_- = ‘smlie’;
//错误
注意的一些细节:
1.两种方式定义的常量访问权限是有区别的。
2.常量默认不区分大小写,但是也可以设置区分大小的的,用define()的第三个参数,详细看函数手册。
常量使用:
在定义的时候必须赋值
define('PI',3.14);
const PII = 3.1415;
define(‘-_-’,’smile’);
echo PI,PII;
// echo -_-; //特殊字符名称的常量不能直接echo输出
echo constant(‘-_-’);
//要用函数 constant(‘常量名’) 输出
系统常量:
系统定义好了的常量,直接使用就行。
常见的几个常量:
PHP_VERSION
: PHP版本号
PHP_INT_SIZE
: 整形大小
PHP_INT_MAX
: 整形能表示的最大值.
直接 echo PHP_VERSION;
查看即可。
在PHP中还有一些特殊的常量,他们有 双下划线+常量名+双下划线结束 ,这种变量称为:系统魔术常量
:魔术常量的值会随系统环境变化而变化,但是用户无法定义和修改。
__DIR__
:当前被执行脚本所在本机的绝对路径。
__FILE__
:当前被执行脚本所在本机的绝对路径(附带显示文件自己的名字)
__LINE__
:当前所属的行数;
__CLASS__
:当前所属的类。
__METHOD__
:当前所属的方法。
![image](https://img2020.cnblogs.com/blog/2391167/202105/2391167-20210517103059402-953045886.png)
PHP是一种弱类型语言,变量本身没有数据类型。
PHP的三大类八小类数据类型:简单数据类型、复合数据类型、特殊数据类型
1.整型: int/integer , 系统分配4 个字节存储, 表示整数类型(有前提) ,
2.浮点型: float/double , 系统分配8 个字节存, 表示小数或者整型存不下的整数,
3.字符串型: string , 系统根据实际长度分配, 表示字符串(引号)
4.布尔类型: bool /boolean , 表示布尔类型, 只有两个值: true和false
5.复合数据类型: 2 个小类· ,
6.对象类型: object , 存放对象(面向对象)
7.数组类型: array , 存多个数据(一次性)
8.特殊数据类型: 2 个小类· ,
9.资源类型: resource , 存放资源数据 (PHP 外部数据, 如数据库、文件)
10.空类型: NULL, 只有一个值就是NULL (不能运算
)
类型转换:
1.自动转换:系统自动转换
2.强制转化:规则在前面加个括号(),写上对应的想要转换的类型,例:(float)$a;
强制类型转换不会转换变量本身,只是改变了复制的值。 例如:echo (float)$a ,不会改变$a的类型,只是输出的时候是float的样子。
而settype就是直接改变变量本身的类型,成功返回true,否false .
其他类型转数值的说明
1 .布尔true 为1 , false 为0 ;
2 .字符串转数笸有自己的规则+,
2 .1 以字母开头的字符串, 永远为0 ;
2 .2 以数字开头的字符串, 取到碰到字符串为止( 不会同时包含两个小数点)
判断数据类型:以is_开头后面跟类型名的函数:is_XXX(变量名),是该类型变量返回true,否返回 false
Bool类型不能用 echo 输出,可以用var_dump()结构查看
var_dump ( mixed $expression [, mixed $... ] ) : void
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
例子:
比较运算符
===
: 全等于,左边与右边相同,大小以及数据类型都相同。
!==
: 不全等于,只有大小或者类型不相同。
数字运算,PHP默认输出的数值都会自动转换成十进制的。PHP默认有符号位(区分正负)
$a = 120
; //十进制
$a = 0b110
; //二进制
$a = 0120
; //八进制
$a = 0x120
; //十六进制
常用系统函数:
有关输出的函数
print()
:类似echo输出提供的内容,本质是一种结构(不是函数),返回值是1,可不需要使用括号。
print_r()
:类似类似var_dump,但是比它简单,不会输出数据的类型,只会输出值(打印使用比较多),通常对变量进行操作。
输出的 1 在最后,先执行print的再返回输出echo的。
分支结构和循环结构的替代语法:模式如下
左大括号 { 使用冒号替代 :
右大括号 } 使用end+对应起始标记替代
例:
for(;;){ => for(;;):
} => endfor;
If、switch、for、while、foreach都可以这样
时间戳
函数的基本概念:
函数:function,是一种语法结构,将实现某一种功能的代码块(多行代码)封装到一个结构中,从而实现代码重复利用(复用)。
基本语法如下:
function 函数名(){
//函数体
}
在php中,所有函数都有返回值,如果没有明确写出return,那么系统默认返回NULL,可以用var_dump()
查看。
连接运算符:
. (点号)
:将两个字符串连接在一起。
.= (点等于)
:复合运算,将左边的内容与右边的内容连接起来,然后重新复制给左边变量。
例:$a .= $b
; //也就是等于: $a = $a . $b
;
文件包含:
Include:包含文件
Include_once:系统自动判断文件包含过程中,是否已包含过(一个文件最多被包含一次)
Require:与include相同
Require_once:与include_once相同
语法:
Include’文件名字’;
Include(‘文件名字’); //注意文件路径别错了
函数命名规范:
由字母、数字、下划线组成,到那时不能以数字开头。函数通常以名字代表函数的功能,而有些功能会比较复杂,可能一个需要多个单词组合表达。
1、驼峰法:除了左边打一个单词外,后面所有的单词首字母都大写,如:shouPeopleInfo()
2、下划线法:shou_people_info()
作用域:
1、全局变量:全局变量不能在函数中使用。
2、局部变量:函数中定义的变量,在当前函数内使用
3、超全局变量:这是系统定义的变量,如:$_POST
。为了使得函数内能使用,于是有了超全局
的变量。它没有访问限制。超全局变量会将全局变量自动纳入到超全局变量$GLOBALS
里面,辅助函数内能使用到函数外的全局变量。使用方式:
$GLOBALS['key'] = value;
指的的是PHP当前页面的全局变量$key = value的引用,此值可以在PHP流程的任意地方改变,改变的是该全局变量,真正的全局引用。
另外在php中存在:能够实现全局访问局部,同时局部也可访问全局,使用:global关键字。
1、如果使用global定义的变量在外部存在(全局变量),那么系统在函数内部定义的变量直接指向外部全局变量所在的内存空间(同一个变量)。
2、如果global定义的变量在外部不存在,那么系统会在外部全局空间创建一个该全局变量。
实质就是共同拥有同一块内存地址,共同使用数据。
使用语法:
global 变量名;
//不能赋值
变量名 = 值;
//赋值
但是注意,一般不会这么用,用到的话就通过函数传参进来,或者定义常量来使用。
静态变量:
static
,是在函数内部定义的变量,使用static关键字修饰,用来实现跨函数共享数据的变量。函数运行结束后所有的局部变量都会被清空,static变量则能保存下来。
基本语法:
function 函数名(){
//定义变量
static $变量名 = 值; //通常定义同时赋值
}
静态变量的原理:系统在进行编译的时候就会对static这一行进行初始化,为静态变量赋值,然后函数在调用的时候就会自动 跳过static关键字这一行,因为已经编译过了。
静态变量的使用:
1、为了统计:当前函数的调用次数、
2、为了统筹函数多次调用得到的不同结果(递归思想)
可变函数
可变函数:当前有一个变量保存的值,刚好是一个函数的名字,那么就可以使用变量+()来充当函数名使用。
$变量 = ‘display’;
function display(){
}
//可变函数
$变量();
可变函数挺多用的,很多的系统函数需要用户在外部定义一个自定义函数,然后传入到系统函数内部使用。举例子:
匿名函数
匿名函数:没有名字的函数
语法:
$func = function(){ //可传参
}; //注意结尾要分号
变量保存匿名函数,本质得到的是一个对象Closure
闭包:
闭包 Closure,一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及他们引用的对象没有被释放)和自由变量提供绑定的计算环境(作用域)
简单解释:函数内部的一些局部变量(要执行的代码块)在函数执行之后没有被释放,是应为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)
举例子:
证明:函数的局部变量在函数使用完之后没有被释放
1、使用内部匿名函数。
2、匿名函数使用局部变量:ues()
3、匿名函数被返回给外部使用。如下图:
闭包有什么用?闭包就是提供了一个环境给使用内部函数。
伪类型:
假类型,实际上在php中不存在的类型。但是通过伪类型可以帮助程序员更好的查看操作手册从而方便学习。
mixed:混合的,可以是php中多种数据类型
number:数值的,可以是任意数值(整型或浮点型)
字符串类型语法:
1、单引号字符串
2、双引号字符串
引号方式:比较适合定义短的(不超过一行的)或者没有结构要求的字符串。
如果有结构要求,或者内容超过一行,可以使用以下两种结构定义。
3、nowdoc字符串:没有单引号的单引号字符串。
语法:
$str = <<<‘边界符’
字符串内容
边界符;
在输出结果查看源代码就能看到原封不动显示定义字符串的时候的结构格式。
4、heredoc字符串:没有单引号的单引号字符串。
$str = <<<边界符
字符串内容
边界符;
这两种结构化定义字符串变量的规则:
1、结构化字符串的边界符号有条件:
1.1、上边界符后面不能有任何内容。有注释-->报错, 有空格-->报错
1.2、下边界符,必须定格:最左边。
1.3、下边界同样后面只能跟分号,不能有其他任何东西。
2、结构化字符串的内部(边界符之间)的所有内容都是字符串本身。
heredoc字符串 与 nowdoc字符串 有区别吗?
区别在:单引号内不会解析而原样输出(但只解析\’ ),因为单引号字符串的单引号是标志字符串的,所以要在字符串内输出单引号就需要解析转义,所以 \’ 是需要解析的。
双引号字符串则会解析全部的转义字符(\’不解析),变量也会解析。由于需要解析,所以用双引号的效率比单引号低。
字符串转义:反斜杠+字母
在php中常用的转义字符:
\’
: 在单引号字符串中显示单引号
\”
:在双引号字符串中显示双引号
\r
:表示回车(理论上是回到当前行的首位置)
\n
:代表新一行
\t
:类似tab键,输出4个空格
\$
:在php中输出$符号
双引号中变量识别的规则:
1、用空格隔开,保持变量的独立性,让系统可以区分
2、使用大括号包裹变量。
字符串长度问题:
1、基本函数strlen():得到字符串的长度(单位:字节)
2、拓展函数mb_strlen(): 课根据字符集(单位)不同计算出不同结果长度。
在UTF-8中,一个中文是3个字节。
字符串相关函数:(介绍常用的一部分,其余的用到就去查操作手册吧,记一下大概有什么功能的函数就行。)
1、implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
2、explode(分割字符,目标字符串):讲字符串按照某个格式进行分割,变成数组
3、str_split(字符串,字符长度):按照指定长度拆分字符串得到数组
截取函数:
1、trim(字符串[,指定字符]):本身默认去除两端的空格(中间的不行),也可指定需要去除的内容,从两端开始去除,碰到非目标字符为止。
2、ltrim():去除左端的。
3、rtrim():去除右端的。
4、Substr(字符串,起始位置从0开始[,长度]):从指定位置开始截取字符串,可截取指定长度。(不指定默认截取到最后)
5、Strstr(字符串,匹配字符):从字符到最后。
6、Strpos():
7、Strrpos():
8、str_replace(匹配目标,替换成的内容,字符串):将目标字符串中的部分字符替换成特定的。
9、格式化输出数据:
10、Printf()/sprintf():格式化输出数据,其实就是C语言的。
11、str_repeat():重复某个字符串N次。
12、Str_shuffle():随机打乱字符串。
数组:
数组:array,数据的组合。将一组数据(多个)存储到一个指定的容器中,用变量指向该容器,然后可以通过一次性得到该容器中的所有数据。
在PHP中系统提供多种定义数组的方式:
1、使用array关键字:最常用的
$变量 = array(元素1,元素2,元素3...);
可以使用中括号来包裹数据:
$变量 ={元素1,元素2...};
2、隐形定义数组:给变量增加一个中括号,系统自动变成数组。
$变量[] = 值1;
//如果不提供下标也可以,系统自动生成(数字:从0开始)
$变量[下标] = 值;
//中括号里面的内容称之为下标key ,改下表可以是字母(单词)或者数字,与变量命名规则相似。
example:
PHP数组特点
1、可以调整下标或者字符串下标
如果数组下标为整数:索引数组
如果数组下标为字符串:关联数组
2、不同下标可以混合存在:混合数组
3、数组元素的顺序以放入顺序为准,跟下标无关。
4、数组下标的增长特点:从0开始自动增长,如果中间出现不连续的较大值,则下一个从该值开始+1增长。
5、特殊下标的自动转换:布尔值的true/false 空:NULL
6、PHP中数组中元素没有数据类型限制。在例子中可能看到,有数字字符布尔,都行的。
7、PHP中数组中元素没有长度限制。
8、PHP中的数组是很大的数据,所以存储的位置是堆区,是放在一块连续的内存里。
多维数组:
1、多维数组:数组里面的元素又是数组。
2、二维数组:数组中的所有元素都是一位数组
3、多维数组:在第二维的数组中可以继续是数组,在php中没有维度限制。原则上可以无限嵌套进去,但是不建议超过三维的数组,因为增加访问的复杂度,降低效率。
4、异型数组(不规则数组):数组中的元素不规则,有普通基本变量也有数组
数组遍历:
数组遍历:普通数组数据的访问都是通过数组元素的下标来实现的,如果说数组中所有的数据都依赖输出出来,就需要我们使用一下简化的规则来实现走动获取下标以及输出数组元素。
$arr=array(0=>array(‘name’=>’Tom’),1=>array(‘name’=>’Jim’);); //二维数组
//访问一位数组:$arr[一维下标]
$arr[0]; //结果:array(‘name’=>’Tom’);
//访问二维元素:$arr[一维下标][二维下标]
$arr[1][‘name’]; //结果:Jim
foreach遍历语法:
foreach($数组变量 as [$下标=>]$值){ //[$下标=>]是可选项
//通过$下标访问元素的下标;通过$值访问元素的值
}
通常:如果是关联数组(字母下标),就需要下标,如果是数字下标就直接访问值