PHP基本操作和基本语句及语法
遍历二维数组
$stu=[
[1,2,3,4],
[40,50,60,70]
];
for($i=0;$i<count($stu);$i++){
for ($j=0;$j<count($stu[$i]);$j++){
echo $stu[$i][$j].' ';
}
echo '<br>';
}
作用域
变量作用域
/*
* 1.全局变量:在函数外面
* 2.局部变量:在函数里面,默认情况下,函数内部是不会去访问函数外部的变量的
* 3.超全局变量:可以在函数内部和函数外部访问
*/
# 超全局变量
/*
* $_COOKIE
* $_GET
* $_POST
* $_SESSION
*/
$num = 10;
function fun(){
echo $num; // Undefined variable '$num'
}
fun();
--------------------------------------------
# 函数内部默认不能访问函数外部的值
$_POST['num']=10; //将值赋值给超全局变量
function fun(){
echo $_POST['num'].'<br>'; //获取超全局变量的值 10
}
fun();
--------------------------------------------
function fun(){
$_GET['num']=10; # 将值赋值给超全局白变量
}
fun();
echo $_GET['num']; //打印超全局变量的值
全局变量
$num=10; //全局变量
function fun(){
echo $GLOBALS['num'];
}
fun(); //输出全局的num
--------------------------------------------
$num=10; //全局变量
function fun(){
global $num;
echo $num;
}
fun(); //输出全局的num
// 这里注意,global $num也是在函数里面定义的一个变量,名字必须要和外面一样
//但是它是把函数外面的变量名的地址取到放进函数块里面的,它与GLOBALS不一样,
//当你修改num的值时,全局变量的值也改变了。
常量没有作用域
define('PI','3.14');
function fun(){
echo PI;
}
fun(); //输出3.14
--------------------------------------------
function fun(){
define('PI','3.14');
}
fun();
echo PI;
静态变量
# 静态变量一般指的是静态局部变量
function fun(){
$num=10; # 普通变量没调用一次初始化一次
$num++;
echo $num.'<br>';
}
fun(); //11
fun(); //11
function func(){
static $nums=10;
$nums++;
echo $nums.'<br>';
}
func(); //11
func(); //12
常量和静态变量的区别:
1.常量和静态变量都只初始化一次
2.常量不能改变值,静态变量可以改变值
3.常量没有作用域,静态变量有作用域
匿名函数use()
# 默认情况下,函数内部不能访问函数外部的变量,但在匿名函数中,可以通过use将外部变量引入匿名函数中
$num=10;
$fun=function () use ($num){
echo $num;
};
$fun(); //10
在函数内部访问函数外部变量
1. 使用超全局变量
2. $GLOBALS
3. global
4. use将函数外部变量引入到匿名函数内部
包含文件
包含文件的格式
1. require:可以包含多次
2. include:包含多次
3. require_once:只包含一次
4. include_once:只包含一次
5. HTML类型的包含页面中存在PHP代码,如果包含在PHP中是可以执行的
6. 包含文件相当于把包含文件中的代码拷贝到主文件中执行,魔术常量除外,魔术常量获取的是所在文件的信息
7. 包含编译时不执行,运行时加载到内存,独立编译包含文件
require遇到错误抛出error类别的错误,并且停止执行
include遇到错误抛出warning类型的错误,并继续执行
./和不写./的区别
require './11.html'; //在当前目录下查找
require '11.html'; //受php配置文件中include_path配置的影响
# 可以使用set_include_path('c:\\');phpinfo();
# 使用set_include_path()函数可以设置多个路径,路径之间用分号分割
# 并且如果包含文件的目录结构比较复杂,比如:在c:\\aa\\dd\\cc\\bb中有多个文件需要包含
# 可以将包含的路径设置成include_path,这样包含就只要写文件名就可以了
错误处理
错误的级别
1. notice:提示
2. warning:警告
3. error:致命错误
错误的提示方法
方法一:显示在浏览器上
方法二:记录在日志中
与错误有关的配置
1. error_reporting=E_ALL:报告所有的错误
2. display_errors=on:将错误显示在浏览器上
3. log_errors=on:将错误记录在日志中
4. error_log=‘地址’:错误日志保存的地址
$debug=true; // 开发模式
ini_set('error_reporting',E_ALL); //所有的错误都报告
if($debug){
ini_set('display_errors','on');//错误显示在浏览器上
ini_set('log_errors','off'); //错误不显示在日志中
}else{
ini_set('display_errors','on');
ini_set('log_errors','off');
ini_set('error_log','./err.log');
}
# 测试一:
//function fun(){
// echo $num;
//}
//fun();
# 测试二:$debug=false;
function fun(){
echo $num;
}
fun();
在项目开发过程中有两个模式,开发模式,运行模式
开发模式:错误显示在浏览器上,不要记录在日志中
运行模式:错误不显示在浏览器上,记录在日志中
自定义错误处理
通过trigger_error产生一个用户级别的error/warning/notice信息
$age=100;
if ($age>80):
//trigger_error('年龄不能超过80岁'); //默认触发了notice级别的错误
//trigger_error('年龄不能超过80岁',E_USER_NOTICE);//触发notice级别的错误
//trigger_error('年龄不能超过80岁',E_USER_WARNING);
trigger_error('年龄不能超过80岁',E_USER_ERROR);//错误用户error错误
endif;
定义错误处理函数
function error(){
echo '这是一个错误处理函数';
}
set_error_handler('error');//注册错误处理函数
echo $num;
--------------------------------------------
/*
* @parama $errno int 错误类别
* @parma $errstr string 错误消息
* @parma $errfile string 文件地址
* @parma $errline int 错误行号
*/
function error($errno,$errstr,$errfile,$errline){
switch ($errno){
case E_NOTICE:
case E_USER_NOTICE:
echo '记录在日志中'.'<br>';
break;
case E_WARNING:
case E_USER_WARNING:
echo '给管理员发邮件'.'<br>';
break;
case E_ERROR:
case E_USER_ERROR:
echo '给管理员打电话'.'<br>';
break;
}
echo "错误信息:{$errstr}<br>";
echo "错误文件:{$errfile}<br>";
echo "错误行号:{$errline}<br>";
}
set_error_handler('error');
echo $num;
文件操作
创建文件夹
# 创建文件夹【mkdir(路径,权限,是否递归创建)】
# 1.创建目录
mkdir('./aa');//创建aa文件夹
mkdir('./aa/bb');//在aa目录下创建bb文件夹,如果没有aa文件夹则会报错
mkdir('./aa/bb/cc',0777,true);//递归创建
删除文件夹
# 删除文件【rmdir()】
rmdir('./aa/bb/cc/dd');//删除dd文件夹
# 删除的文件夹必须是空的
# php没有提供递归删除
重命名文件夹
# 重命名文件夹【rename(旧名字,新名字)】
rename('./aa',';./aaa');
是否是文件夹
# 是否是文件夹
is_dir('./aa')?'是文件夹':'不是文件夹';
打开文件夹、读取文件夹、关闭文件夹
# 打开文件夹,读取文件夹,关闭文件夹
$floder=opendir('./');//打开目录
var_dump($floder);//5:resource(3, stream)
while ($f=readdir($floder)){
if ($f=='.'||$f=='..'):
continue;
endif;
echo iconv('gbk','utf-8',$f),'<br>';//将gbk编码转换为utf-8编码
}
closedir($floder);//关闭文件夹
总结:
1. opendir():返回资源类型
2. 每个文件夹都有.和..
3. iconv():用来做字符编码转换
总结:我认为这里面最重要的是错误处理,因为一旦错误处理不好,会造成很严重的后果,比如:数据库的错误信息,这些信息一旦显示在浏览器上,将有可能实现自己的所有数据库信息被盗取。还有学知识真的应该举一反三,比如知道了判断一个文件夹是否是文件夹,那同样也应该想一下判断是否是一个文件是什么函数。