PHP语法基础
变量
- 变量名字必须以$开头
- 删除变量 : unset($var);
预定义变量
预定义变量:提前定义的变量,系统定义的变量(预定义变量都是数组)
| 变量名 | |
|---|---|
| $_GET | 获取以get方式提交的数据 |
| $_POST | 获取以post方式提交的数据 |
| $_REQUEST | 获取以get,post方式提交的数据 |
| $GLOBALS | PHP中的所有全局变量 |
| $_SERVER | 服务器信息 |
| $_SESSION | session会话数据 |
| $_COOKIE | cookie会话数据 |
| $_ENV | 环境信息 |
| $_FILES | 用户上传的文件信息 |
可变变量
可变变量:就是一个变量的变量名可以动态的设置和使用。
<?php
$a = 'b';
$b = 'aa';
echo $$a; // 等价于 、$($a) ==> $b = aa ===>输出 aa
$a = &$b //引用传递
?>
静态变量
用static修饰的变量,是在函数内部定义的变量
- 系统会在编译时为静态变量开辟空间(函数调用前)赋值,
- 函数调用时会自动跳过静态static修饰语句
常量
- 常量名不需要使用$,字母全大写。
- define(‘’常量名“,常量值)
- const 常量名 = 常量值
- constant(“常量名”)
<?php
const PI = 3.1415926; //const关键字定义常量
define('PII',3.1415926); // define函数定义常量,可以定义包含特殊符号的常量名 const不行
echo PII ,"<br>", PI , "<br>"; //该发式不能访问特殊符号的常量 需要使用constant函数
define("~_~","沉默");
echo constant("~_~"); //访问常数的函数
?>
系统常量
| 系统常量名 | ||
|---|---|---|
| PHP_VERSION | php的版本 | |
| PHP_INT_SIZE | 整型所占用的字节数 | |
| PHP_INT_MAX | 整型的最大值 | |
| PHP_INT_MIN | 整型的最小值 | |
| ... |
魔术常量
| 魔术常量名 | ||
|---|---|---|
| __DIR__ | 当前被执行的脚本所在电脑中的绝对路径 | |
| __FILE__ | 当前被执行的脚本所在电脑中的绝对路径(包括文件名) | |
| __LINE__ | 当前所属的行数 | |
| __NAMESPACE__ | 当前所属的命名空间 | |
| __CLASS__ | 当前所属的类 | |
| __METHOD__ | 当前所属的方法 | |
| ... |
<?php
echo __DIR__ , "<br>"; //F:\桌面\php02
echo __FILE__ , "<br>"; //F:\桌面\php02\text.php
echo __LINE__ , "<br>"; //30
// echo __NAMESPACE__, "<br>";
// echo __CLASS__ , "<br>";
// echo __METHOD__ , "<br>";
?>
数据类型
在PHP中将数据分为三大类,八小类
-
简单(基本)数据类型 : 4 小类
- int :系统分配4个字节存储
- flaot/double : 系统分配8个字节存储
- string : 视情况而定
- bool/Boolean
-
复合数据类型 : 2个小类
- object
- array
-
特殊数据类型: 2小类
- resource : 存放资源数据(数据库资源等)
- NULL
数据类型转换
- 自动转换
- 强制转换
<?PHP
$a = '12a99' ;
$b ='a12';
$c = '2.5';
echo $c + $a ,'<br>'; // 自动转换 14.5
echo (int)$a ,"<br>"; //强制转换 12
echo (int)$b ,"<br>"; //强制转换 0
?>
类型判断
- is_xxx(变量名) 判断数据类型
- Gettype(变量名) 获取类型
- Settype(变量名 ,‘类型’) 设置数据类型 ,设置成功返回true , 失败返回false
<?php
$a = 12.9;
$b = '12.9';
$c = (double)12.9;
var_dump( is_float($a) ) ; echo "<br>" ; // bool(true)
var_dump( is_string($b) ) ; echo "<br>" ; // bool(true)
var_dump( is_double($c) ) ; echo "<br>" ; // bool(true)
var_dump( Gettype($a) ) ; echo "<br>" ; // string(6) "double"
Settype($a,'string');
var_dump( Gettype($a) ); // string(6) "string"
?>
| 方法 | ||
|---|---|---|
| isset() | 判断某个变量是否存在 | |
| unset() | 删除某个变量 | |
| empty() | 判断数据是否为空 |
进制转换
| 描述 | 返回值类型 | |
|---|---|---|
| Decbin(int) | 十进制转二进制 | string |
| Decoct(int) | 十进制转八进制 | string |
| Dechex(int) | 十进制转十六进制 | string |
| Bindec(int) | 二进制转十进制 | string |
| Octdec(int) | 八进制转十进制 | string |
| ... |
<?php
$a = 1011;
$b = 015243;
$c = 0x15a151f21c;
echo $a ,"<br>";
echo $b ,"<br>";
echo $c ,"<br>";
echo "<hr>";
var_dump( bindec( $a ) ) ; echo "<br>";
var_dump( decbin(5) ) ; echo "<br>" ;
var_dump( octdec(54623) );
?>
字符串
nowdoc,nowdoc字符串
-
单引号与双引号
-
nowdoc字符串 (<<<'')
-
heredocs 字符串(<<<)
<?PHP //heredocs 字符串 $str = <<<EOD helloWorld EOD; //nowdoc字符串 $str1 = <<<'EOD' hello world EOD; echo $str ,"<br>",$str1; ?>
字符串相关的函数
| strlen() | 得到字符串的长度(字节为单位) | |
| Implode(string $glue,array $arr) | 数组转字符串 | |
| Explode() | 字符串分割 | |
| Str_split() | 根据长度来分割字符串 | |
| Substr() | 指定位置截取字符串 | |
| Strstr() | 从指定字符开始截取到最后 | |
| Trim() | 清除字符串两边的空格,也可清除字符串两边指定的字符 | |
| Ltrim() | 清除左边的... | |
| Rtrim() | 清除右边的... | |
| Strtolower() | 全部小写 | |
| Strtoupper() | 全部大写 | |
| Ucfirst() | 首字母大写 | |
| Strpos() | 字符在字符串中首次出现的位置 | |
| Strrpos() | 字符在字符串中最后出现的位置 | |
| Str_replace() | 将目标字符串中部分进行替换 | |
| printf/sprintf(string $format) | 格式化输出数据 | |
| Str_repeat() | 重复某个字符串N次 | |
| Str_shuffle() | 随机打乱字符串 | |
| ... |
字符串长度问题
- 中文在utf-8编码中占3个字节
- mbstring扩展(需要在php.ini配置文件中开启)
<?PHP
$str= "啊啊11";
echo strlen($str),"<br>";//8
echo mb_strlen($str,'utf-8');//4
?>
数组
数组的定义
- 使用array关键字定义
- 作用中括号
数组的分类
- 索引数组 : 整数作为索引
- 关联数组 : 非整数转为索引
- 混合数组 : 索引仅有整数又有非整数(字符串,bool)
<?php
$arr1 = array(1,'2',3,'四'); //索引数组
$arr2 = array( // 关联数组
"name" => "小李",
"age" => 18,
"TD" => "student",
);
$arr3 = [1,2,4,6,8,10]; //索引数组
$arr4[] = 10; //混合数组
$arr4[1] = 11;
$arr4[10] = 11;
$arr4s["sex"] = "x";
$arr4[] = "adada";
echo "<pre>";
var_dump( $arr1 ) ; echo "<br><br>";
var_dump( $arr2 ) ; echo "<br><br>";
var_dump( $arr3 ) ; echo "<br><br>";
var_dump( $arr4 ) ; echo "<br><br>";
?>
二维数组
<?php
$arr = array(
array( "name"=>'xiaoli',"age"=>18),
array( "name"=>"zhangshan" ,"age"=>25),
array( "name"=>"xiaoming" ,"age"=>35)
);
echo "<pre>";
var_dump($arr);
?>
数组的遍历
- foreach 遍历
<?php
$arr = array(
array( "name"=>'xiaoli',"age"=>18),
array( "name"=>"zhangshan" ,"age"=>25),
array( "name"=>"xiaoming" ,"age"=>35)
);
echo "<pre>";
// var_dump($arr);
var_dump( $arr[0]['name'] );
var_dump( $arr[1] );
echo "<hr>";
foreach($arr as $value){
var_dump( $value );
}
echo "<hr>";
foreach($arr as $value){
foreach($value as $key=>$value2){
echo $key ," = ",$value2 , "<br>";
}
}
?>
- for循环遍历(数组的下标要有规律)
<?php
$arr = array(
array( 2,4,6,8),
array( 1,3,5,7,9),
array( 1,2,3,4,5,6,7,8)
);
echo "<pre>";
for($i=0;$i<count($arr);$i++){
for( $j=0;$j<count($arr[$i]) ; $j++ ){
var_dump($arr[$i][$j]);
}
}
?>
each 和 list
- each 获取一个数组中当前数组指针所指的元素的下标和值,然后数组指针下移 返回一个数组(array(4))-
- [0] => 取得元素的下标
- [1] =>取得元素的值
- ["key"]=>取得元素的下标
- ["value"]=>取得元素的值
each 获取失败时返回false
- list 是一种结构(无返回值)提供一堆变量去存入数组中的值(数组的下标要有序)
list 从0开始依次++
<?php
$arr = array( 9,8,7,6,5,4);
echo "<pre>";
list($first,$second) = $arr ;
echo $first , $second;//98
?>
list each 搭配while遍历数组
- 数组的下标有限制
<?php
$arr = array( 9,8,7,6,5,4);
echo "<pre>";
while(list($key,$value) = each($arr)){
echo $key ," = " , $value,"<br/>";
}
?>
数组排序函数
| sort() | 顺序排序(下标重排) | |
| rsort() | 逆序排序 | |
| asort() | 顺序排序(下标不变) | |
| arsort() | 逆序排序(下标不变) | |
| ksort() | 顺序排序(按照下标) | |
| krsort() | ... | |
| shuffle() | 随机打乱数组元素 |
<?php
$arr = array( 9,8,7,6,5,4);
echo "<pre>";
while(list($key,$value) = each($arr)){
echo $key ," = " , $value,"<br/>";
}
echo "<hr>";
asort($arr);
foreach( $arr as $key => $value){
echo $key , " = " , $value ,"<br>";
}
echo "<hr>";
krsort($arr);
foreach( $arr as $key => $value){
echo $key , " = " , $value ,"<br>";
}
echo "<hr>";
ksort($arr);
foreach( $arr as $key => $value){
echo $key , " = " , $value ,"<br>";
}
echo "<hr>";
sort($arr);
foreach( $arr as $key => $value){
echo $key , " = " , $value ,"<br>";
}
?>
数组指针函数
| reset() | 重置指针,将数组指针指向首位 返回第一个元素的单元值,如果数组为空返回false | |
| end() | 重置指针,指向最后一个元素,返回。。。 | |
| next() | 指针下移,返回。。。 | |
| prev() | 指针上移,返回。。。 | |
| current() | 返回指针当前对应的元素值。。。 | |
| key() | 返回当前的下标值。。。 |
数组的其他函数
| count() | 统计数组的长度 | |
| array_push() | 在数组后面追加一个元素 | |
| array_pop() | 移除数组后面一个元素 | |
| array_shift() | 在数组最前面移除一个元素 | |
| array_unshift() | 在数组最前面添加一个元素 | |
| array_reverse() | 翻转数组 | |
| in_array() | 判断一个元素是否存在与数组中 | |
| array_keys() | 获取数组中所有下标,返回一个数组 | |
| array_values() | ... |
运算符
比较运算符
- !== 不全等于 ,只要大小 或 类型 不同就返回 true
连接运算符
- . 将两个字符串连接起来
- .= 类似于+=、 -=、*=
错误抑制符
- @ eg: @(1/0)
位运算符
- ...
流程控制替代语法
| 原 | 替代 | 原因 |
|---|---|---|
| for(;😉{} | for(;😉: endfor; | { 替换为 : , }替换为 endfor |
| if(){} | if: endif; | { 替换为 : , }替换为 endif |
| switch(){} | switch:endswitch; | { 替换为 : , }替换为 endswitch |
| while() | .. | .. |
常用的系统函数
| 名称 | 描述 | 返回值类型 |
|---|---|---|
| 有关输出的函数 | ||
| print() | 本质是一种结构(不是函数)可以用使用括号 功能类似于echo | |
| print_r() | 类似于var_dump(),但不会输出数据的类型 ,多用于数组的输出 |
| 时间函数 | 描述 | 返回类型 |
|---|---|---|
| date(string $format) | 按照指定时间格式... | |
| time(void) | 计算机元年到当前时间的秒数 | int |
| microtime() | 获取微秒级别的时间 | |
| strtotime() | 按照规定格式的字符串转换成时间戳 |
<?php
echo date("Y年m月d日 H:i:s") , "<br>"; //2020年01月07日 20:23:53
echo time() , "<br>"; //1578399833
echo microtime(); //0.98924500 1578399833
echo strtotime('tomorrow 6 hours'); //1578434400
?>
文件加载
include
- include 系统碰到一次include 就会加载一次,如果一个文件多次包含 , 那么系统就会多次加载
- include_once 同一个文件包含多次时 ,只加载一次
require
include 和 require的区别
- include的报错级别低不会影响后面的代码的执行 ,require 报错会中断程序的运行
函数
没有写函数类型时,系统默认为void类型
<?php
function f1(){ echo __FUNCTION__ ;};
var_dump( f1() ); //f1NULL
?>
形参的默认值
- 有默认值的参数要写在最右边
<?php
function f1($a , $b=0){
return $a+$b;
}
echo f1(2);
?>
引用传递
<?php
$a=5;
function f1( &$x , $y=2){
$x /=$y;
}
echo $a ; //2.5
?>
return
return还可以直接写在文件里(‘全局’)表示终止,后面的代码不再运行 但其他文件include/require 该文件时 可以定义一个变量来接收 返回的数据(实现数据的传递)
作用域
PHP无块级作用域,有函数作用域
PHP中全局变量不能再局部作用域中使用
超全局变量会自动将全局变量纳入到$GLOBALS里,且$GLOBALS没有作用域限制。
-
全局作用域(函数外部定义的变量)
-
局部作用域(函数内部定义的变量)
-
超全局作用域
-
$global
-
常量没有作用域限制
<?php
$G = "全局声明";
function f1(){
global $G; // 引入全局变量
echo $G , "<br>";
global $a ; // 此时不能赋值
$a = 55; //赋值
}
f1();
echo $a; // 访问“局部”
?>
可变函数
<?php
function func1(){
echo __LINE__,__FUNCTION__;
}
$f2 = 'func1';
$f2(); //197func1 //相当于f1()
?>
匿名函数
<?php
$f1 = function(){
echo "匿名函数";
}; // 该分号不可省略
$f1();
?>
闭包(closure)
- 产生原因:内部函数(内嵌函数)
- use :将外部变量(局部) 保留给内部使用 // 类似于值传递
<?php
function f1(){
$a = 1;
$f2 = function() use($a){
echo $a+=100;
$c=0;
};
$f2(); //2
echo "<br>" , $a; //1
}
f1();
?>
伪类型
Mixed
混合类(可以是多种PHP中的数据类型)
Number
数值类(可以是任意数值类型(整型,浮点型))
常见的数学函数
| 名称 | 描述 | |
|---|---|---|
| max() | 参数可以是数值,也可以是数组 | |
| min() | ... | |
| rand() | ||
| mt_rand() | 功能与rand一样,效率比rand高 | |
| round() | 四舍五入 | |
| ceil() | 向上取整 | |
| floor() | 向下取整 | |
| pow() | ... | |
| abs() | ||
| sqrt() |
有关函数的函数
| function_exists() | 判断指定的函数是否存在 | |
| func_get_arg(int) | 在自定义函数中获取指定数值对应的参数 | |
| func_get_args(void) | 在自定义函数中获取所有参数集(数组)(实参集) | |
| func_num_args() | 获取自定义函数的参数数量(实参的数量) |
<?php
function f1($a , $c = 22){
$a = 11; // 给参数重新赋值
$c = 55;
var_dump( func_get_arg(0) ) ; echo "<br>","<pre>"; //int(11) 被更改了
var_dump( func_get_args() ) ; echo "<br>","<pre>";//无有默认值的参数
var_dump( func_num_args() ) ; echo "<br>","<pre>";//int(1)无有默认值的参数
}
function_exists('f1') && f1(111);
?>
错误处理
分类
- 语法错误 : 编译不会通过
- 运行错误 : 语法没错 但runtime error
- 逻辑错误 :
错误代号
-
系统错误 :
- E_PARSE 编译错误(parse error)
- E_ERROR 致命错误(fatal error)
- E_WARNING 警告错误(waring,不会影响程序执行但有可能会得不到想要的结果)
- E_NOTICE 通知错误(notice)
-
用户错误:
- E_USER_ERROR , E_USER_WARNING , E_USER_NOTICE
-
其他 : E_ALL (所有的错误)
错误代号之间 可以进行位运算
- 排除通知级别 : E_ALL & ~E_NOTICE
- 只要警告和通知: E_WARNING | E_NOTICE
错误触发
- 系统触发
- 人为触发
错误处理函数
- trigger_error() 错误处理函数
<?PHP
$a = 0;
if($a==0){
trigger_error("被除数不能为0");//Notice: 被除数不能为0 in F:\桌面\php02\....
}else{
echo 100/$a;
}
?>
<?PHP
$a = 0;
if($a==0):
trigger_error("被除数不能为0",E_USER_ERROR);//Fatal error: 被除数不能为0 i...
endif;
echo 100/$a;
?>
错误设置
- 错误显示设置
-
php的配置文件(修改php.ini文件)
- DisPlay_error 是否显示错误 (约461行 默认为E_ALL)
- Error_reporting 显示什么级别的错误 (约478行 默认为On)
-
在运行的php脚本中设置
- Error_reporting() 设置对应的错误显示级别
- Ini_set('配置文件中的配置项','配置值')
-
错误日志
- 开启日志功能(log_errors = On),修改 error_log = "日志路径"
自定义错误处理
- trigger_errors() 不会阻止系统报错
- set_error_handle( $callback )
<?PHP
/**
* $errno 系统提供的错误代码 (E_ALL , E_NOTICE..)
* $errstr 错误信息
* $errfile 错误所在的目标文件
* $errorline 错误所在的行数
*/
function my_error($errno , $errstr,$errfile,$errorline){
switch($errno){
case E_ERROR:
case E_USER_ERROR:
echo "fatal error in file " . $errfile ." ".$errstr . $errorline;
break;
case E_WARNING:
case E_USER_WARNING:
echo "warning in file " . $errfile.$errstr . $errorline;
break;
case E_NOTICE:
case E_USER_NOTICE:
echo "notice in file ".$errfile." ( ".$errstr." in ".$errorline . "lines )";
break;
}
return true;
}
set_error_handler('my_error');
echo $a;//notice in file F:\桌面\php02\text.php ( Undefined variable: a in 274lines )
?>

浙公网安备 33010602011771号