PHP中常见的错误和解决办法

1、PHP常见错误等级:Notice,Warning,Strict,Parse Error,Fatal Error
2、错误原理:

  • 通知级别(Notice):未定义,重复使用等(不会影响代码执行)

    常见的Notice:未定义变量(常量),表单元素未定义(下标)

1
2
3
4
5
6
7
8
9
<?php
//未定义变量
// 解决方案:使用前定义
echo $var;
//未定义常量
echo PI;
//数组元素下标未定义
// 解决方案:在使用前进行判断,保证代码安全,增加代码容错性 if (isset($_POST['name'])) echo $_POST['name'];
echo $_POST['name'];
  • 警告级别(warning):系统找不到

    常见的warning:包含文件不存在,默认时区,函数参数没有传入值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// 包含文件,不影响后面输出hello world
include_once 'fatalerror.php';
echo "hello world";
// 使用默认时区
// 解决方案:修改默认时区为'PRC'
echo data('Y-m-d',time());
// 实参没有传值
function display($value)
{
echo $name;
}
// 调用函数
display();
  • 严格级别(strict):版本兼容(软件升级过程中不可避免的出现了迭代产品)

常见的strict:构造方法,类访问非静态方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// 解决方案:1,将老款放下面;2,不做兼容
class GirlFriend{
// 结构中所有的内容都是类成员
function GirlFriend()
{
echo __METHOD__,'<br>';
}
// 构造方法
function __construct()
{
// 资源初始化
echo __METHOD__,'<br>';
}

// 实例化,构造方法兼容错误
$g = new GirlFriend();

// 类是可以访问类成员的:一般访问静态成员(static关键字修饰)和类常量(const)
GirlFriend::display();

// 解决方案:分清楚角色,静态成员和类常量都归类访问,普通的方法和属性都归对象访问
$g::display();
}
  • 编译级别(parse error):语法错误

    常见的parse:结构不完整,缺少语句结束符,关键字学错,定界符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// 结构不完整
// 解决方案:注意代码的结构规范
if (true)) {
echo 'true';
}
function FunctionName(){

}}

// 缺少语句结束符
// 缺少分号
echo "helloworld"

// 定界符,结束内容必须顶格
// 第一个符号后面不能有任何内容,包括空格和注释
$str=<<<END
hello world
END;
  • 致命级别(fotal error):结构错误(直接导致出错代码后面的代码不在执行)

    常见的fotal:文件包含,使用未定义的结构(函数和类),访问私有成员,内存超出,时间过长(超过30s)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
// 文件包含,require,后面的hello不能输出
// 解决方案,加载前进行文件判断if(file_exit('fatalerror.php')){require 'fatalerror.php';}
require 'fatalerror.php';
echo "hello";

// 使用未定义结构
// 解决方案:1确定定义的函数2自动加载
display(); //直接调用未定义的函数

$g = new GirlFriend();//未定义类

// 私有成员访问
// 解决方案:PHP重载
class ClassName{
private $age = 10;
public $name = "hhh";
}
$g = new ClassName();
echo $g->name;//公有可以访问
echo $g->age;//fatal error

// 内存超出:服务器内存不够
// 解决方案:优先查递归,有没有递归出口
// 递归:必须有递归点和递归出口
function dg(){
echo "a";
dg();
}
dg();

// 执行时间过长,时间超过30S
// 解决方案:加长PHP解决 set_time_limie(0);
$arr = array();
for ($i=0; $i < 100000; $i++) {
$arr[$i] = mt_rand(1,100000);
}
// 定义冒泡函数
function bubble_sort($arr)
{
for ($i=0,$len = count($arr); $i < $len; $i++) {
for ($j=0; $j < $len-1; $j++) {
if ($arr[$i]>$arr[$j]) {
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}
bubble_sort($arr);

3、错误解决方案

a)主动解决问题
b)抑制问题
c)关闭问题
  • parse error(编译错误):
    在书写代码的过程中,保证代码的格式正确,注意书写格式
  • runtime error(运行错误):
    1,忽略式:notice warning strict 可以直接忽略
    2,解决bug
    3,错误抑制符@,不让错误出现
    4,开发阶段(解决所有错误),生成阶段(抑制所有错误)

    4.1为单独项目进行错误控制
      ini_set('error_reporting',E_ALL);//显示错有级别的错误
      ini_set('display_errors',1);//开发,把错误显示出来
      生产环境
       ini_set('error_reporting',E_ALL & ~E_NOTICE & E_STRICT & E_WARNING);
    
    4.2整个服务器错误控制:在php.ini中进行配置:
       error_reporting
       display_errors
    
  • 高性能的代码实现:
    1,结构简约
    2,利用短路运算(出现概率高的放前面)
    3,算法实现