PHP_基本操作

320 阅读3分钟

基础知识

变量知识

定义变量

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会话变量
$_COOKIEcookie值变量
$_GLOBALS全局变量
$_REQUEST包含GET*GET、* 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调⽤用全局变量量。如:GLOBALS调⽤用全局变量量。 如: 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新增)
  • 常量可以不用理会变量范围的可以在任何位置访问

声明常量

常量可以使用 constdefine 定义。

  • 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进制。 782+781+780=5117*8^2+7*8^1+7*8^0 = 511

下面是十六进帛 FAF 转为10进制数,PHP中使用hexde()函数将16进制转为10进制

15162+10161+1516015*16^2+10*16^1+15*16^0

浮点数

浮点数表示实数,可理解为有限或无限小数。

0.12
-10.98

布尔型

当转换为 boolean 时,以下值被认为是FALSE:这个地方提示学生不用记,按照自己的感觉来就可以判定了,读完一遍之后把ppt关掉,提问true还是false,学生都会知道的

  1. 布尔值 FALSE
  2. 整型值 0(零)
  3. 浮点型值 0.0(零)
  4. 空白字符串
  5. 字符串 "0"
  6. 没有成员变量的数组
  7. 没有单元的对象(仅适用于 PHP 4)
  8. 特殊类型 NULL(包括尚未设定的变量)

所有其它值都被认为是 TRUE

NULL

NULL数据类型只有一个值NULL。

  1. 变量未被赋予任何值
  2. 变量被赋值为NULL
  3. 被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):转换成对象

运算符

算术运算符

运算符说明
a+a+b加法 aa和b的和
aa-b减法 aa和b的差
aa*b乘法 aa和b的积
a/a/b除法 a除以a除以b的商
aa%b取模 a除以a除以b后的余
++$a前加 $a 的值先加一,然后进行操作
$a++后加 $a 的值先进行操作,后加一
--$a前减 $a 的值先减一,然后进行操作
$a--后减 $a 的值先进行操作,后减一

赋值运算符

运算符说明
=右边值赋值给左边变量
+=左边值加上右边值赋值给左边变量
-=左边值减掉右边值赋值给左边变量
*=左边值乘以右边值赋值给左边变量
/=左边值除以右边值赋值给左边变量
.=左边字符串连接到右边变量后面
%=左边值对右边值取余数后赋值给左边变量

字符串运算符

运算符说明
.它返回其左右参数连接后的字符串
.=左边字符串连接到右边变量后面

比较运算符

运算符说明
$a==$b等于 TRUE,如果a等于a等于b
$a===$b全等于 TRUE,如果a等于a等于b,并且类型也相同
$a!=$b不等 TRUE,如果a不等于a不等于b
$a<>$b不等 TRUE,如果a不等于a不等于b
$a!==$b非全等 TRUE,如果a不等于a不等于b,或者类型不同
$a<$b小于 TRUE,如果a严格小于a严格小于b
$a>$b大于 TRUE,如果a严格a严格b
$a<=$b小于等于 TRUE,如果 a小于或者等于a 小于或者等于b
$a>=$b大于等于 TRUE,如果 a大于或者等于a 大于或者等于b

逻辑运算符

运算符说明
aanda and b逻辑与 TRUE,如果 aa 与 b 都为 TRUE
aora or b逻辑或 TRUE,如果 aa 或 b 任一为TRUE
!$a逻辑非 TRUE,如果 $a 不为 TRUE
a && b逻辑与 TRUE,如果 aa 与 b 都为TRUE
`$a$b`逻辑或 TRUE,如果 aa 或 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';

\