基础知识
变量知识
定义变量
PHP是弱类型语言,不像其他语言需要对变量进行类型声明。PHP中以 $ 作为前缀来定义变量,以a~z(大小写)或 _ 下划线定义变量名。
下面是合法的变量名
$hd = 'php.net';
$_name = '清风揽月';
下面是非法的变量声明
$999 = 'yahoo.com'
$&* = 'sina.com.cn'
弱类型
PHP是一种非常弱的类型语言。在大多数编程语言中,变量只能保持一种类型的数据,而且这个类型必须在使用变量前声明,例如C语言中。
而在PHP中,变量的类型通常不是由程序员设定的,确切地说,是根据该变量使用的上下文在运行时(即变量的值)决定的。
简单来说,var = 1;就是数字,var2 = '1'就是字符串,变量类型是由值决定的。
传值与引用
传值赋值
直接使用 = 将变量的值赋值给另一个变量。
$a = 1;
$b = $a;
$b = 2;
echo $a;//结果是1
引用赋值
将一个变量的内存地址赋值给另一个变量的行为即传址赋值。需要在 = 等号前加上 & 引用符号,这样两个变量指向内存中的一个地址,任何一个变量的改变都影响到另一个变量,有点类似于快捷方式的概念。
$a = 1;
$b = &$a;
$b = 2;
echo $a;//结果是2
可变变量
可以变量即使用一个变量的值,作为另一个变量名。
$a = 'hello'; //普通变量
$$a = 'world'; //可变变量 相当于:$hello = ‘world’;
echo "$a ${$a}";//输出:hello world
echo "$a $hello";//输出:hello world
变量作用域
变量作用域指变量在代码中可以访问的位置。
超全局变量
可以代码的任何位置都可以访问的变量
| 变量 | 说明 |
|---|---|
| $_GET | 地址栏GET提交 |
| $_POST | 表单POST提交 |
| $_FILES | 文件上传变量 |
| $_SESSION | 会话变量 |
| $_COOKIE | cookie值变量 |
| $_GLOBALS | 全局变量 |
| $_REQUEST | 包含* POST、$_COOKIE |
| $_SERVER | 服务器环境变量 |
server所有变量
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
$_SERVER['HTTP_HOST'] 请求头信息中的Host内容,获取当前域名。
$_SERVER["SERVER_NAME"] 输出配置文件httpd.conf中的ServerName,一般情况下与HTTP_HOST值相同,但如果服务器端口不是默认的80端口,或者协议规范不是HTTP/1.1时,HTTP_HOST会包含这些信息,而SERVER_NAME不一定包含。(主要看配置文件的设置)。
$_SERVER["HTTP_USER_AGENT"] 获取用户相关信息,包括用户浏览器、操作系统等信息。
$_SERVER['HTTP_ACCEPT'] 当前请求的ACCEPT头部信息。
$_SERVER["HTTP_ACCEPT_LANGUAGE"] 这个值是由浏览器发送,表明用户默认的语言设置,后面的q值表示用户对该语言的喜好程度。
$_SERVER["HTTP_ACCEPT_ENCODING"] 大部分的现代浏览器都支持gzip压缩,并会把这一信息报告给服务器。这时服务器就会压缩过的HTML发送给浏览器。这可以减少近80%的文件大小,以节省下载时间和带宽。
$_SERVER["HTTP_COOKIE"] 浏览器的cookie信息。
$_SERVER["HTTP_CONNECTION"] 当前请求的连接情况。
$_SERVER["HTTP_UPGRADE_INSECURE_REQUESTS"] 表示浏览器可读懂服务器发过来的请求,
$_SERVER["HTTP_CACHE_CONTROL"] 表示浏览器是否会缓存这个页面信息。
$_SERVER["PATH"] 当前脚本所在文件系统。
$_SERVER["SystemRoot"] 当前服务器的操作系统。
$_SERVER["COMSPEC"] 指向cmd.exe的路径。
$_SERVER["PATHEXT"] 环境变量设置。
$_SERVER["WINDIR"] 脚本指向的系统目录。
$_SERVER["SERVER_SIGNATURE"] 包含服务器版本和虚拟主机名的字符串。
$_SERVER["SERVER_SOFTWARE"] 服务器软件配置信息。
$_SERVER["SERVER_ADDR"] 当前运行脚本的服务器的ip地址。
$_SERVER["SERVER_PORT"] 服务器端口。
$_SERVER["REMOTE_ADDR"] 浏览网页的用户ip。
$_SERVER["DOCUMENT_ROOT"] 当前运行脚本所在的根目录。
$_SERVER["REQUEST_SCHEME"] 服务器通信协议,是http或https。
$_SERVER["CONTEXT_PREFIX"] 前缀。
$_SERVER["CONTEXT_DOCUMENT_ROOT"] 当前脚本所在的文档根目录。
$_SERVER["SERVER_ADMIN"] 服务器管理员信息。
$_SERVER["SCRIPT_FILENAME"] 当前执行脚本的绝对路径。
$_SERVER ["REMOTE_PORT"] 用户连接到服务器时所使用的端口。
$_SERVER["GATEWAY_INTERFACE"] 服务器使用的CGI规范的版本。
$_SERVER["SERVER_PROTOCOL"] 请求页面时通信协议的名称和版本。
$_SERVER["REQUEST_METHOD"] 请求提交数据的方式。
$_SERVER["QUERY_STRING"] 服务器请求时?后面的参数。
$_SERVER["REQUEST_URI"] 当前脚本路径,根目录之后的目录。
$_SERVER["SCRIPT_NAME"] 当前脚本的路径。这在页面需要指向自己时非常有用。
$_SERVER["PHP_SELF"] 当前正在执行脚本的文件名。
$_SERVER["REQUEST_TIME"] 得到请求开始时的时间戳。
全局变量
- local(局部)
- global(全局)
- static(静态)
全局声明(函数外声明)的变量会保存在 $_GLOBALS 中,函数内默认不能访问到全局变量,在函数中访问需要使用 global 关键字。
$hd='李逍遥';
function p() {
//利⽤ global 引入全局变量
global $hd;
echo $hd;
}
p();
也可以使用全局数组GLOBALS['hd'];
检测变量
通过isset 函数可以检测变量是否定义。
var_dump(isset($name));
# 结果是false
变量销毁
php在全部代码执行结束后会删除所有变量,也使用 unset 函数可以在程序运行中删除变量。
$name='php.net';
unset($name);
全局变量不能在函数中删除
$name = 'php.net';
function run()
{
global $name;
unset($name);
}
run();
echo $name;
# 依然可以输出 php.net
静态变量
PHP支持声明函数变量为静态的(static)。一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调⽤时被初始化。 要声明函数变量为静态的⽤关键字static。通常静态变量的第一次使⽤用时赋予⼀个初始值。
function calculate()
{
static $a=1;
return ++$a;
}
calculate();
echo calculate();
常量使用
常量是一个简单值的标识符(名字)。常量默认为大小写敏感。按照惯例常量标识符总是大写的。
常量特性
- 常量前面没有美元符号($)
- 常量只能用define() 函数定义,而不能通过赋值语句
- 常量一旦定义就不能被重新定义或者取消定义
- 常量的值用来定义 整型,浮点,字符串,布尔值,数组(PHP7新增)
- 常量可以不用理会变量范围的可以在任何位置访问
声明常量
常量可以使用 const 和 define 定义。
- const 是语言结构,在编译时要比define快
- define 可以设置第三个参数为true,来定义不区分大小写的常量
- 类文件中定义常量也使用const,所以const统一易读
define('常量名',值);
define('WEBNAME','www-php-net');
echo WEBNAME;
常量检测
$bool = defined('WEBNAME');
var_dump($bool); // 结果是false
系统常量
__DIR__ 文件所在目录
__FILE__ 文件路径
__LINE__ 程序代码行号
PHP_VERSION 显示PHP版本
PHP_OS 显示服务器的操作系统版本
TRUE boolean值真(true)支持小写常量
FALSE boolean值假(false)支持小写常量
__FUNCTION__ 函数名称
__METHOD__ 方法名称
__CLASS__ 类名称
使用函数 get_defined_constants(true) 可以获取当前可使用的所有常量
数据类型
使用不同数据类型储存不同数据,就像我们家里面放衣服和放洗手液会使用用不同的容器一样。下面是常用PHP数据类型表:
| 类型 | 说明 |
|---|---|
| integer | 整型 |
| float | 浮点型 |
| string | 字符串 |
| boolean | 布尔型 |
| array | 数组 |
| object | 对象 |
整型
整型可以是十进制、八进制、十六进制。
01988 #十进制
0xfff #十六进制
下面是 777 八进制数转成 10进制数,即逢8进1原则,PHP中使用 octdec() 函数可以将8进制转为10进制。
下面是十六进帛 FAF 转为10进制数,PHP中使用hexde()函数将16进制转为10进制
浮点数
浮点数表示实数,可理解为有限或无限小数。
0.12
-10.98
布尔型
当转换为 boolean 时,以下值被认为是FALSE:这个地方提示学生不用记,按照自己的感觉来就可以判定了,读完一遍之后把ppt关掉,提问true还是false,学生都会知道的
- 布尔值 FALSE
- 整型值 0(零)
- 浮点型值 0.0(零)
- 空白字符串
- 字符串 "0"
- 没有成员变量的数组
- 没有单元的对象(仅适用于 PHP 4)
- 特殊类型 NULL(包括尚未设定的变量)
所有其它值都被认为是 TRUE
NULL
NULL数据类型只有一个值NULL。
- 变量未被赋予任何值
- 变量被赋值为NULL
- 被unset()函数处理后的变量
$a; //变量 $a未被赋予任何变量,值为NULL
$b = NULL; //变量 $b被赋值为NULL
$c = 10;
unset($c);
//使用unset()函数处理后,$c为NULL
判断类型相关
getType()
$num = 1234;
$type = gettype($num);
var_dump($type);
检测是否为布尔型
$var = true;
$bool = is_bool($var);
var_dump($bool);
检测是否为整型
$int = 1234;
$bool = is_int($int);
var_dump($bool);
检测是否为浮点数
$num = 1.1234;
$bool = is_float($num);
var_dump($bool);
检测是否为字符串
$string = 'www-php-net';
$bool = is_string($string);
var_dump($bool);
检测是否为NULL
$var = null;
$bool = is_null($var);
var_dump($bool);
判断类型函数
is_bool();//判断是否为布尔型 is_float(); //判断是否为浮点型 is_int(); //判断是否为整型 is_numeric(); //判断是否为数值型 is_string(); //判断是否为字符串 is_array(); //判断是否为数组 is_object(); //判断是否为对象
is_bool():判定是否为bool
is_int();判定是否为整型
is_float():判定是否为浮点型
is_string():判定是否为字符串
is_array();判定是否为数组
is_object():判定是否为对象
is_resource():判定是否为资源
is_null():判断是否为空
is_scalar():判断是否为标量
is_numeric():判断是否为数字或数字字符串
is_callable():判断是否为有效函数名
gettype($xx):输出变量类型
类型转换
转换变量或者值的类型,转换成其他数据类型的方法主要分为两大类:自动转换和强制转换。
(int)、(integer):转换成整形
(float)、(double)、(real):转换成浮点型
(string):转换成字符串
(bool)、(boolean):转换成布尔类型
(array):转换成数组
(object):转换成对象
运算符
算术运算符
| 运算符 | 说明 |
|---|---|
| b | 加法 b的和 |
| b | 减法 b的差 |
| b | 乘法 b的积 |
| b | 除法 b的商 |
| b | 取模 b后的余 |
| ++$a | 前加 $a 的值先加一,然后进行操作 |
| $a++ | 后加 $a 的值先进行操作,后加一 |
| --$a | 前减 $a 的值先减一,然后进行操作 |
| $a-- | 后减 $a 的值先进行操作,后减一 |
赋值运算符
| 运算符 | 说明 |
|---|---|
| = | 右边值赋值给左边变量 |
| += | 左边值加上右边值赋值给左边变量 |
| -= | 左边值减掉右边值赋值给左边变量 |
| *= | 左边值乘以右边值赋值给左边变量 |
| /= | 左边值除以右边值赋值给左边变量 |
| .= | 左边字符串连接到右边变量后面 |
| %= | 左边值对右边值取余数后赋值给左边变量 |
字符串运算符
| 运算符 | 说明 |
|---|---|
| . | 它返回其左右参数连接后的字符串 |
| .= | 左边字符串连接到右边变量后面 |
比较运算符
| 运算符 | 说明 |
|---|---|
$a==$b | 等于 TRUE,如果b |
$a===$b | 全等于 TRUE,如果b,并且类型也相同 |
$a!=$b | 不等 TRUE,如果b |
$a<>$b | 不等 TRUE,如果b |
$a!==$b | 非全等 TRUE,如果b,或者类型不同 |
$a<$b | 小于 TRUE,如果b |
$a>$b | 大于 TRUE,如果b |
$a<=$b | 小于等于 TRUE,如果 b |
$a>=$b | 大于等于 TRUE,如果 b |
逻辑运算符
| 运算符 | 说明 | ||
|---|---|---|---|
| b | 逻辑与 TRUE,如果 b 都为 TRUE | ||
| b | 逻辑或 TRUE,如果 b 任一为TRUE | ||
| !$a | 逻辑非 TRUE,如果 $a 不为 TRUE | ||
| a && b | 逻辑与 TRUE,如果 b 都为TRUE | ||
| `$a | $b` | 逻辑或 TRUE,如果 b 任一为TRUE |
and与&& 、or与||是同一逻辑运算符的两种写法,但优先级不同。
这四个符号的优先允许从高到低是:&&、||、AND、OR。
三元表达式
变量=(表达式)?值1:值2; 当表达式的返回值为true时,$变量被赋予值1,否则被赋予值2
echo true?'唔爱':'李逍遥'; //返回唔爱
?? 与 ?:
$var=0;
echo $var?:'唔爱机器人'; #输出唔爱机器人
$var=0;
echo $var??'唔爱机器人';#输出0
PHP 7 新增加的 NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式。 ?: 只判断 true 或 false ,而 ?? 判断变量存在并且值不为null
屏蔽错误
@ 运算符用于屏蔽表达式警告错误
@(20/0);
流程控制,循环
if/else/elseif
当条件表达式的值为真(true)时,PHP将执行语句组,相反条件表达式的值为假(false)时,PHP将不执行语句组,忽略语句组执行下面的语句。
if (true) {
echo '清风揽月';
} else {
echo '不成立';
}
//也可以使用以下写法
if (true) :
echo '清风揽月';
else :
echo '不成立';
endif;
elseif
$age = 10;
if ($age<=15) {
echo '儿童';
} elseif ($age<=30) {
echo '青年';
} elseif ($age<=50) {
echo '中年';
} else {
echo '尊敬的老人';
}
//也可以使用以下写法
$age = 10;
if ($age<=15) :
echo '儿童';
elseif ($age<=30) :
echo '青年';
elseif ($age<=50) :
echo '中年';
else :
echo '尊敬的老人';
endif;
switch
switch设置多个执行代码块,break指令终止向下执行,default为上面条件都不满足时执行的默认代码块。
switch ($status) {
case 'success':
echo '成功';
break;
case 'error':
echo '错误';
break;
case 'warning':
echo '警告';
break;
}
//也可以使用以下写法
switch ($status) :
case 'success':
echo '成功';
break;
case 'error':
echo '错误';
break;
case 'warning':
echo '警告';
break;
endswitch;
while
当while循环语句中表达式(循环控制语句)的结果为真时,程序将反复执行同一段程序:循环体( while中的语句或语句序列),直到满足一定的条件(表达式的结果为假时)后才停止执行该段程序。
$num = 10;
while ($num>0) {
echo($num--).'<br/>';
}
//也可以使用以下写法
$num = 10;
while ($num>0):
echo($num--).'<br/>';
endwhile;
do...while
与while的差别是条件后判断。
$num = 10;
do {
echo($num--).'<hr/>';
} while ($num>0);
for
for(表达式1;表达式2;表达式3){
语句或语句序列;
}
// 表达式1为循环初始条件;
// 表达式2为循环控制条件;
// 表达式3为控制变量递增;
for ($num=10;$num>0;$num--) {
echo $num.'<hr/>';
}
// 也可以使用以下写法
for ($num=10;$num>0;$num--) :
echo $num.'<hr/>';
endfor;
break 与 continue
break
我们之前在 switch 条件判断中已经使用过 break 关键字,它会使得程序流程离开 switch 本体中的语句,如果 break 使用在 for、while 或 do-while 循环结构中时,将会使得程序离开该层循环。
do {
if (!isset($num)) {
$num=10;
}
if ($num==0) {
break;
}
echo($num--).'<hr/>';
} while (true);
break 在多层循环嵌套使用时,可以指定跳转出层数。
$num=0;
while (true):
$num++;
switch ($num) {
case $num%2==0:
echo $num."<hr/>";
break;
case $num%15==0:
echo $num."<hr/>";
break 2;
}
endwhile;
continue
continue 的作用与 break 有点类似,continue 若使用在 for、while 或 do-while循环结构中,当程序执行至 continue 时,之后的语句将直接被略过,而直接执行下一次的循环动作。
for ($num=10;$num>0;$num--) {
if(!($num%2))continue;
echo $num.'<hr/>';
}
文件引入
include & require
使用include和require 将文件导入,就像把该文件粘贴到使用函数的地方。
include( )与require ( )区别在于错误处理方式,当引入产生错误时include( )产生一个警告而require( )则导致一个致命错误。
include './test.php';
echo 'test'; //如果test.php文件不存在会报一个warning错误,但是可以输出test
可以使用 @ 屏蔽incluce加载警告错误
if (!@include 'a.php') {
echo '文件不存在';
}
require 加载失败时将终止程序执行
require './test.php';
echo 'test'; //如果test.php文件不存在会报一个fatal错误,不可以输出test
include_once和require_once
与include( )语句及require( )区别是如果文件已经加载过,则不会重复加载文件。
// 因为 include 每次都加载所以下面两行代码执行会报错
include './functions.php';
include './functions.php';
//下面使用 include_once 就不会报错
include_once './functions.php';
include_once './functions.php';
\