PHP基础学习笔记
PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用
PHP的超全局变量
- $_SERVER是PHP里面的超全局变量, 包含了web服务器提供的所有信息.可通过
phpinfo()
查看$_SERVER['PHP_SELF']
得到自身文件名
- $GLOBALS
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV
基础
- 描述变量使用
$
或者${}
, 前者会匹配更多字符让其合法 <?php echo
==<?=
- 纯php文件文末结束符可省略
- 支持
#
,//
,/* */
注释(//,#
后面的?>
不会被注释),/* */
不可嵌套 - PHP 支持 10 种原始数据类型
- 如果想查看某个表达式的值和类型,用 var_dump() 函数。
- 如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype() 函数。要检验某个类型,不要用 gettype(),而用
is_type
函数 - 如果要将一个变量强制转换为某类型,可以对其使用强制转换或者 settype() 函数, 使用*符号也能改变类型
整型
- 要使用八进制表达,数字前必须加上
0
(零)。要使用十六进制表达,数字前必须加上0x
。要使用二进制表达,数字前必须加上0b
- 将 resource 转换成 integer 时, 结果会是 PHP 运行时为 resource 分配的唯一资源号
- PHP 7.4.0 之前不支持
_
, 如1_234
浮点型
- 永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数
- 由于
NAN
代表着任何不同值,不应拿NAN
去和其它值进行比较,包括其自身,应该用 is_nan() 来检查
String字符串
.
与.=
1 |
|
- 单引号代表的字符串里的
\
转义符能转'\
两个字符,\n
没有任何含义, 在单引号里的$
失去了变量的含义(类似linux) - 双引号里的
\
能转移一些特殊字母和解析$
变量 - 在
{}
里面可以使用多重变量, 如
1 |
|
- []与{}都可以访问字符串片段
.
可以连接字符串
heredoc结构
类似linux的cat > file.name << eof
, 可输入转义字符和变量, 如
1 |
|
newdoc结构
- 与heredoc的区别是不具备转义和解析变量的能力
1 |
|
Array数组
1 |
|
- PHP的Array支持键值对
- 可以使用
array()
或者[]
初始化一个array对象 key
只能是interge
和string
- 使用
print_r
或者var_dump
函数来输出array - 要删除某键值对,对其调用 unset() 函数。
- unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数
- foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。
- 数组最后一个元素的
$value
引用在foreach
循环之后仍会保留。建议使用 unset() 来将其销毁。
Iterable
Iterable是 PHP 7.1 中引入的一个伪类型。它接受任何 array 或实现了 Traversable 接口的对象。这些类型都能用 foreach 迭代, 也可以和 生成器 里的 yield from 一起使用
- 类在扩展/实现(extending/implementing)的时候, 可以将参数类型从 array 或 Traversable 放宽到 iterable, 也可以将返回类型 iterable 的范围缩小到 array 或 Traversable
Resource
资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。所有这些函数及其相应资源类型见附录。
持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。参见数据库永久连接一章
NULL
null不区分大小写
PHP8.0.0新增了一个类型mixed, 代表任意类型
namespace
可以避免与其它用户空间代码出现命名空间冲突
变量
- PHP变量区分大小写
- 变量名规则
^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
- PHP变量名可以使用中文
&
引用赋值(只有有名字的变量才可以引用赋值)
1 | # global |
- 静态变量在离开函数后不会被销毁, 声明
static $var
- 可变变量使用
$$
要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下
$$a[1]
时,解析器需要知道是想要$a[1]
作为一个变量呢,还是想要$$a
作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用${$a[1]}
,对第二种情况用${$a}[1]
对于对象,
$foo->$bar
将bar解析后作为foo的属性注意: 在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。
$this
变量也是一个特殊变量,不能被动态引用
常量
- 定义规则
^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
- 使用define(name, value) 和const定义一个常量
const打小写敏感
表达式
- 三元表达式
1 | $first ? $second : $third |
运算符
- 除了基本的比较运算符外, PHP还支持
===(值与类型相等)
和!==
- PHP支持递增和递减运算符和
**
运算符 - PHP 支持引用赋值,使用
$var = &$othervar;
语法。引用赋值意味着两个变量指向了同一个数据(类型linux硬链接)
- new 运算符自动返回一个引用,因此对 new 的结果进行引用赋值是错误的
- NULL 合并运算符
??
<=>
返回-1 0 1- PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。
@ 运算符只对表达式有效。对新手来说一个简单的规则就是:如果能从某处得到值,就能在它前面加上 @ 运算符
(``)
命令执行运算符
1 |
|
在windows上, 如果输出是二进制文件, 需要使用popen(), 因为windows的管道是以文件形式打开的
流程控制
elseif
与else if
语义一样, 区别在于前者可以使用冒号, 后者不行
1 |
|
- PHP 提供了一些流程控制的替代语法,包括
if
,while
,for
,foreach
和switch
。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成endif;
,endwhile;
,endfor;
,endforeach;
以及endswitch;
1 | <?php if ($a == 5): ?> |
注意如果不是
^<?php
这样写的话会输出空格
- foreach不支持使用@来抑制错误信息
函数
- 使用默认参数时,任何默认参数必须放在任何非默认参数的右侧
...
指定可变参数, 也可用于传递array作为函数参数:
命名参数允许传入乱序的参数, 需要指定参数名- 命名参数也可以与位置参数相结合使用。此种情况下,命名参数必须在位置参数之后
- PHP支持可变函数, 函数名和方法名都可以使用变量指定
- 箭头函数支持与 匿名函数 相同的功能,只是其父作用域的变量总是自动的
- 会参考参数去父作用域中寻找是否有该值
- 匿名函数需要使用
use
继承父作用域的变量
1 | $message = 'hello'; |
- 匿名函数会自动绑定当前实例
this
, 可以使用静态匿名函数阻止绑定
常用函数
1 | # 取整(PHP4,5,6,7,8),参数mode传入常量,代表四舍五入还是直接舍去小数 |
- isset()
- substr()
- substr_replace()
- 字符串函数
- 数组函数
- 变量函数
- 数学函数
- error_get_last()
- shell_exec()
- get_class()
- is_a()
语言结构
语言结构就是PHP本身支持的语句, 比如
echo, print
等.与函数的区别在于语句的运行速度快, 但缺少了函数的一些特性, 比如函数可以接受其他函数返回的参数等