一、php练习题
1.1 求数组的和以及数据的平均值。
代码如下:
<?php
$num = 0;
$arr = 0;
$arr = [1,3,4,3,2,1];
foreach($arr as $key => $value) {
$num+=$value;
}
echo '和是:'.$num.'<br/>';
echo '平均值是:'.$num/count($arr).'<br/>';
?>
效果:
可以使用number_format(数字,精确到小数点后几位)
来格式化到小数点后面几位。
例:
<?php
$num = 0;
$arr = 0;
$arr = [1,3,4,3,2,1];
foreach($arr as $key => $value) {
$num+=$value;
}
echo '和是:'.$num.'<br/>';
echo '平均值是:'.number_format($num/count($arr), 1).'<br/>';
?>
效果:
1.2 数组翻转。
代码如下:
<?php
$arr=[1,2,3,4,5];
for($i = 0, $j = count($arr)-1; $i < $j; $i++, $j--) {
[$arr[$i], $arr[$j]] = [$arr[$j], $arr[$i]];
}
print_r($arr);
?>
效果:
1.3 遍历二维数组
例:
<?php
$arr=[
[1,2,3,4],
[5,6,7,8]
];
for($i=0; $i<count($arr); $i++) {
for($j=0; $j<count($arr[$i]); $j++) {
echo $arr[$i][$j], ' ';
}
echo '<br/>';
}
?>
效果:
1.4 循环输出1-100。
循环输出1-100,其中3的倍数输出A,5的倍数输出B,15的倍数输出C。 此题必须先判断能被15整除的数,因为如果先判断3的倍数那么将不会出现C,因为能被15整除的数都能被3整除。 例:
<?php
for($i=1; $i<=100; $i++) {
if ($i%15 == 0) {
echo 'C ';
}
elseif ($i%3 == 0) {
echo 'A ';
}
elseif ($i%5 == 0) {
echo 'B ';
}
else {
echo $i.' ';
}
}
?>
效果:
1.5 打印水仙花数
例:
<?php
for($i=100; $i<=999; $i++) {
$a = (int)($i/100); // 百位数
$b = (int)($i%100/10); // 十位数
$c = $i%10; // 个位数
if ($i== pow($a, 3) + pow($b, 3) + pow($c, 3)) {
echo $i, '<br/>';
}
}
// pow(数值,数值指数)
?>
效果:
1.6 打印100以内的斐波那契数
斐波那契数的原理:一个数等于前面两个数之和。
<?php
$num1=1;
$num2=1;
echo $num1, ' ', $num2, ' ';
while (true) {
$num3 = $num1 + $num2;
if ($num3 > 100) {
break;
}
echo $num3, ' ';
$num1 = $num2;
$num2 = $num3;
}
?>
效果:
二、作用域
2.1 全局变量
在函数外面。 例如:
<?php
$num=10;
function fun() {
echo $num;
}
echo $num;
fun();
?>
效果: 报错了,函数内部不会去全局去找。如果我就要在函数里面去找全局变量,可以使用超全局变量
2.2 局部变量
在函数里面,默认情况下,函数内部是不会去访问函数外部的变量,不像js,js局部找不到就会去全局变量去找。
2.3 超全局变量
可以在函数内部和函数外部访问。超全局变量有如下: 利用超全局变量修改:
<?php
$_POST['num']=10;
function fun() {
echo $_POST['num'];
}
fun();
?>
效果: 可以利用$GLOBALS输出全局变量:
<?php
$num=10;
function fun() {
echo $GLOBALS['num'];
}
fun();
?>
效果: 还可以如下关键字写法:
<?php
$num=10;
function fun() {
global $num; // 将全局变量的$num的地址保存到引入到函数内部。
echo $num;
}
fun();
?>
效果:
2.4 常量没有作用域
例:
<?php
define('PI', 3.14);
function fun () {
echo PI;
}
fun();
echo '<hr/>';
function fun1 () {
define('NUM', 6.28);
}
fun1();
echo NUM
?>
效果:
2.5 静态变量
静态变量一般指的是静态局部变量,静态变量只初始化一次。 例:
<?php
function fun() {
$num=10;
$num++;
echo $num, '<br/>';
}
fun();
fun();
?>
效果: 普遍局部变量,函数没调用一次就初始化一次,不会进行叠加。 采用静态局部变量(静态变量只初始化一次):
<?php
function fun() {
static $num=10;
$num++;
echo $num, '<br/>';
}
fun();
fun();
?>
效果: 常量和静态变量的异同点:
- 常量和静态变量都只初始化一次;
- 常量初始化完成后不能改变值,静态变量初始化后可以改变值。
- 常量没有作用域的区分,静态变量是局部作用域。
2.6 匿名函数的use( )
默认情况下,函数内部访问不到函数外部的变量,但在匿名函数中,可以通过use将外部变量引入匿名函数中。 例:
<?php
$num=10;
$fun = function () {
echo $num;
};
$fun();
?>
效果: 这个时候就可以使用ues(),将外部的变量给引入:
<?php
$num=10;
$fun = function () use ($num) {
echo $num;
};
$fun();
?>
效果:
2.7 总结在局部作用域中访问全局变量。
- 使用超全局变量;
- 使用$GLOBALS;
- 使用global;
- 匿名函数使用use( );
三、递归
函数自己调用自己。 例:
<?php
function fun($num) {
echo $num,' ';
if ($num == 1) {
return;
}
fun($num-1);
}
fun(10);
?>
效果: 例从1加到100:
<?php
function fun($num) {
if ($num == 0) {
return;
}
return $num + fun($num-1);
}
echo fun(100);
?>
效果: 利用递归思想打印前10个斐波那契数:
<?php
function fun($num) {
if ($num == 1 || $num == 2) {
return 1;
}
else {
return fun($num-1) + fun($num-2);
}
}
for($i=1; $i<=10; $i++) {
echo fun($i),' ';
}
?>
效果:
四、包含文件
4.1 包含文件的方式
- require
- include
require和include的异同点: require和include都可以包含多次,require一旦包含路径输错,底下就不会执行了。include即使路径发生错误,底下如果还有代码还会执行。 例: header.php代码如下:
<h1>我是头部</h1>
<?php
require './header.php';
require './header.php';
include './header.php';
include './header.php';
echo 'aa';
?>
效果: 然后我们故意输错require的路径:
<?php
require './header1.php';
echo 'aa';
?>
效果: 报错了,并且底下代码不执行了,接着我们改成include:
<?php
include './header1.php';
echo 'aa';
?>
效果: 给了一个警告,并且aa也打印出来了。
4.2 包含文件的路径
./ 当前目录
../ 上一级目录
如果不写./
,那么受include_path
影响,可以看下phpinfo
中的信息:
可以使用set_include_path()
去设置路径。使用场景:如果包含文件的目录结构比较多,可以用set_include_path()
去设置。set_include_path()
用分号分隔。
五、错误处理
5.1 错误的级别
- notice:提示
例:
<?php
echo $num;
?>
效果: 2. warning:警告 例:
<?php
include('./bb.html');
?>
效果: 3. fatal error:致命错误 例:
<?php
require('./bb.html');
?>
效果: notice和warning报错后会继续执行下面代码,error报错后会停止执行。
5.2 错误的提示方法
- 显示在浏览器上
- 记录在日志中
记录在日志中(在php.ini中配置也可以在函数中修改):
- error_reporting = E_ALL ( 报告所有的错误)
2. display_errors = On (将错误显示在浏览器上) 3. log_errors = On(将错误记录在日志中) 4. error_log='地址'(错误日志保存的地址) 在项目开发过程中有两个模式,开发模式,将错误显示在浏览器中就可以了。生产模式的话需要将错误保存在日志中,不能显示在浏览器中。 例:
<?php
$debug = true; // 假设为开发模式
ini_set('error_reporting',E_ALL); // 设置php配置 所有的错误有报告
if ($debug) { // 开发模式
ini_set('display_errors','On'); // 错误显示在浏览器中
ini_set('log_errors', 'Off'); // 不记录日志
}
else { // 生产模式
ini_set('display_errors','Off'); // 错误不显示在浏览器中
ini_set('log_errors', 'On'); // 记录日志
ini_set('error_log', './err.log'); // 记录在当前目录下
}
// 测试
echo $num;
?>
开发模式效果,显示在浏览器中: 接下来我们修改为生产模式:
<?php
$debug = false; // 假设为开发模式
ini_set('error_reporting',E_ALL); // 设置php配置 所有的错误有报告
if ($debug) { // 开发模式
ini_set('display_errors','On'); // 错误显示在浏览器中
ini_set('log_errors', 'Off'); // 不记录日志
}
else { // 生产模式
ini_set('display_errors','Off'); // 错误不显示在浏览器中
ini_set('log_errors', 'On'); // 记录日志
ini_set('error_log', './err.log'); // 记录在当前目录下
}
// 测试
echo $num;
?>
开发模式下,浏览器效果看不到报错: 那么我们打开demo.php所在的目录可以发现多了一个err.log,我们打开查看:
5.3 自定义错误处理方式
通过trigger_error
产生一个用户级别的error/warning/notice
信息。
例:
<?php
$age=-10;
if ($age<0) {
trigger_error('年龄不能小于0');
}
?>
效果:
默认触发了notice
级别的错误。
改为warning级别的错误:
<?php
$age=-10;
if ($age<0) {
trigger_error('年龄不能小于0', E_USER_WARNING);
}
?>
效果:
类似的:E_USER_NOTICE,E_USER_WARNING,E_USER_ERROR
5.4 自定义错误处理函数
例:
<?php
function err() {
echo '我是自定义错误处理函数';
}
set_error_handler('err'); // 注册错误处理函数
echo $num; // 只要有错就会触发这个函数
?>
效果:
自定义错误处理函数参数,规定四个参数,并且参数名规定了,$errno,$errstr,$errfile,$errline
。
例:
<?php
/**
* err 自定义错误处理函数
* @param $errno int 错误类型
* @param $errstr string 错误信息
* @param $errfile string 文件地址
* @param $errline int 错误行号
*/
function err($errno, $errstr, $errfile, $errline) {
switch($errno) {
case E_NOTICE:
case E_USER_NOTICE:
echo 'notice 错误<br/>';
break;
case E_WARNING:
case E_USER_WARNING:
echo 'warning 错误<br/>';
break;
case E_ERROR:
case E_USER_ERROR:
echo 'ERROR 错误<br/>';
break;
}
echo "错误信息:{$errstr}<br/>";
echo "错误文件:{$errfile}<br/>";
echo "错误行号:{$errline}<br/>";
}
set_error_handler('err'); // 注册自定义错误处理函数
// 测试错误
echo $num;
?>
效果:
六、文件夹操作
6.1 创建文件夹(mkdir(路径,权限,是否递归创建 ))
<?php
mkdir('./dir');
效果:
<?php
mkdir('./dir/aa');
在dir文件下创建aa文件夹。dir文件夹必须存在,如果不存在就报错了。
那如果dir文件夹不存,我希望在./dir/aa
这样写的时候连dir文件夹也一起创建了,就需要用到第三个参数递归创建。
例:
<?php
mkdir('./dir/aa/cc', 0777, true); // 递归创建
效果:
6.2 删除文件夹(rmdir())
例:
<?php
rmdir('./dir/aa/cc'); // 删除cc文件夹
效果: 例:
<?php
rmdir('./dir');
效果: 删除文件夹的必须为空才能删除,否则会报错。 php没有提供递归删除。
6.3 重命名文件夹(rename(旧名字,新名字))
例:
<?php
rename('./dir', './dic');
效果:
6.4 是否是文件夹(is_dir())
例:
<?php
echo is_dir('./dic') ? '是文件夹' : '不是文件夹';
效果:
6.5 打开文件夹、读取文件夹,关闭文件夹
- 打开文件夹:
opendir(),例:
<?php
var_dump(opendir('./'));
效果: 2. 读取文件夹: readdir(),例:
<?php
$folder = opendir('./');
while ($f = readdir($folder)) { // 利用while进行一直读取,如果读完了就为空,循环就结束了。
echo $f,'<br/>';
}
效果:
首先出现一点和两点,这是php的特性,只要有读取文件夹就会出现这两个。
tips:解决乱码的问题,可以使用iconv(进去编码格式,出来编码格式,字符串)。
可以使用如下语法将 .
和 ..
去除掉:
<?php
$folder = opendir('./');
while ($f = readdir($folder)) { // 利用while进行一直读取,如果读完了就为空,循环就结束了。
if ($f=='.' || $f=='..') {
continue;
}
echo $f,'<br/>';
}
效果: 3. 关闭文件夹: closedir(),例:
<?php
$folder = opendir('./');
while ($f = readdir($folder)) { // 利用while进行一直读取,如果读完了就为空,循环就结束了。
if ($f=='.' || $f=='..') {
continue;
}
echo $f,'<br/>';
}
closedir($folder);
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!