文章目录
- PHP的基础知识点
- error_reporting() 函数的作用
- HTTP状态码
- require 和 include 的区别
- 存储引擎 MyISAM 和 InnoDB 的区别
- 如何得到当前PHP脚本的路径(包括所有参数)
- 不使用第三个变量,交换两个变量的值
- 自定义一个函数,用冒泡排序对数组升序排列
- 将 a.txt 文件里的内容追加到 b.txt
- 表单提交方式中的 get 和 post 的区别
- php中三种处理mysql数据库的扩展库(mysql、mysqli、pdo)的区别?
- 验证邮箱的正则表达式
- 用递归遍历目录,返回一个数组
- 自定义一个删除多级空目录的函数
- 单引号和双引号的区别
- 七种转为布尔类型的 false 的情况
- null 的三种情况
- empty() 和isset() 的区别
PHP的基础知识点
PHP中类的继承属于单继承,一个子类只能继承一个父类。可见性为 public 和 protected 的属性和方法可以被继承。
继承的方法或属性可以被重写,可见性越来越大。
可以使用 trait 来模拟多继承。
PHP中的变量名、类常量名区分大小写,但类名、函数名不区分大小写。
error_reporting() 函数的作用
error_reporting()函数的作用是临时设置脚本执行过程中的错误报告级别。
error_reporting(E_ALL ^ E_NOTICE); // 除了E_NOTICE之外,报告所有的错误
使用 error_reporting(0) 或者在函数前面加 @,可以抑制错误信息输出,以防止错误消息泄露敏感信息。
HTTP状态码
在HTTP1.1中,状态码401的含义是未经授权;如果想返回“找不到文件”,可使用header函数,语句为:header(“HTTP/1.1 404 Not Found”);
require 和 include 的区别
include 引入文件,如果引入的文件发生错误,会产生一条警告信息,后续的代码会继续执行。
require引入文件,会更加严谨一些,如果引入的文件发生错误,会抛出一个致命的错误,并中断后续代码的执行。因此我们常常用require引入一个非常重要的文件。
存储引擎 MyISAM 和 InnoDB 的区别
MyISAM适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好,MyISAM不支持事务、外键和行锁。MyISAM的每个数据表包括三个文件,分别是表的结构、表的索引和表的数据,表的索引和表的数据是分开存储的。
InnoDB在写操作比较多的时候会更优秀,InnoDB支持事务、外键和行锁。InnoDB的数据表包括两个文件,表的索引和数据存储在同一个文件中,默认是共享表空间,即所有数据表的索引和数据存储在同一个文件中,但也可以设置为独立表空间(若要对数据表采用分区技术,必须设置为独立表空间)。
如何得到当前PHP脚本的路径(包括所有参数)
echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
不使用第三个变量,交换两个变量的值
<?php
$a = 1;
$b = 2;
list($b, $a) = array($a, $b);
echo $a.$b;
或
<?php
$a = "hello";
$b = "good";
$a = $a.$b;
$b = substr($a, 0, strlen($a)-strlen($b));
$a = substr($a, strlen($b));
echo $a.$b
自定义一个函数,用冒泡排序对数组升序排列
<?php
/**
* 冒泡排序:每轮两两比较,如果后者小于前者,就交换它们的位置
* 时间复杂度:O(N^2) 数组的长度是 N
* 空间复杂度:O(1)
* @param Integer[] $nums
* @return Integer[]
*/
function bubbleSort($nums)
{
$n = count($nums);
if ($n < 1) {
return $nums;
}
for ($i = 0; $i < $n; $i++) {
// 先默认数组是有序的,如果在内层循环中,一次交换操作都没执行,说明数组已是升序,可提前结束循环
$sorted = true;
for ($j = $i + 1; $j < $n; $j++) {
if ($nums[$i] > $nums[$j]) {
list($nums[$i], $nums[$j]) = [$nums[$j], $nums[$i]];
$sorted = false;
}
}
if ($sorted) { // 提前结束循环
break;
}
}
return $nums;
}
将 a.txt 文件里的内容追加到 b.txt
file_put_contents('b.txt', file_get_contents('a.txt'), FILE_APPEND);
表单提交方式中的 get 和 post 的区别
- get是表单的默认提交方式,会把数据附加到表单的action属性所指向的URL中,在URL中可见,安全性较差;post会把数据放到http的包体中,用户一般看不到,安全性较好。
- get传递的数据量受URL长度的限制,故数据量较小,一般只有几kb;而post传递的数据量受php.ini的限制,数据量较大,如果有文件上传的话,表单的提交方式一定要用post。
- get传递的数据会被缓存下来,可能有安全性问题,而post方式没有这个问题。
- get传递的数据通过$_GET[]获取,post传递的数据通过$_POST[]获取。
php中三种处理mysql数据库的扩展库(mysql、mysqli、pdo)的区别?
- mysql: 只可以通过面向过程的方式处理mysql数据库
- mysqli: 既支持面向对象的方式处理mysql数据库,也保留了面向过程的处理方式,同时增加了预编译和参数绑定的功能。
- pdo: 支持面向对象的方式处理各种数据库类型(如:mysql、oracle、db2等),也就是说pdo是可以跨数据库类型的,推荐使用pdo。
验证邮箱的正则表达式
$pattern = "/^[^_][\w\.-]+@[\w]+(\.\w+)+$/i";
或
$pattern = "/^[a-zA-Z0-9_\.-]{2,}@[a-zA-Z0-9_\-]{2,}(\.[a-zA-Z0-9]{2,})+$/";
用递归遍历目录,返回一个数组
<?php
function getdir($path){
if(is_dir($path)){
$arr=scandir($path);
foreach($arr as $v){
if($v!='.' && $v!='..'){
$newPath=$path."/".$v;
$newArr[]=$newPath;
if(is_dir($newPath)){
$newArr2=getdir($newPath);
if(is_array($newArr2)){
$newArr=array_merge($newArr,$newArr2);
}
}
}
}
}
return $newArr;
}
$re=getdir("file");
echo "<pre>";
var_dump($re);
echo "</pre>";
自定义一个删除多级空目录的函数
<?php
function deleteDir($path){
$arr=explode("/",$path); //array('a','b','c');
$len=count($arr);
for($i=0;$i<$len;$i++){
$nPath=implode("/",$arr);
if(count(scandir($nPath))==2){
$re=rmdir($nPath);
unset($arr[$len-$i-1]);
}else{
return false;
}
}
return $re;
}
单引号和双引号的区别
- 双引号可以解析变量,单引号不能解析变量
- 双引号和单引号可以互相嵌套
- 双引号当中包含单引号,单引号当中包含变量,变量会被解析,单引号会被原样输出
- 双引号可以解析所有的转义字符,单引号只能解析\和’本身的转义
- 双引号的效率比单引号要低
七种转为布尔类型的 false 的情况
- 整型 0
- 浮点类型 0.0
- 空字符串 “”, ‘’
- 字符串 “0”, ‘0’
- 布尔类型 false
- 空数组 array(), []
- null
null 的三种情况
- 直接赋值为null,如:$a=null
- 未定义的变量
- unset销毁的变量,如:unset($a)
empty() 和isset() 的区别
区别:
- empty 判断变量是否为空;isset 判断变量是否被设置(声明),且不为 null。
- empty 在 false 的七种情况下返回 true,其余返回 false。
- isset 在 null 的三种情况下返回 false,其余情况返回 true。