PHP面试基础知识笔记
文章目录
一、isset()函数和empty()函数
1. isset() 函数
isset()函数用于检测变量是否被设置并且非Null。
//isset() 函数用于检测变量是否已设置并且非 NULL。
public function check_isset(){
$a = null;
var_dump(isset($a)); // 输出 false
$b = 'test';
unset($b); //销毁变量$b
var_dump(isset($b)); //输出 false
$c = '';
var_dump(isset($c)); //输出 true
//isset可以应用到判断数组元素是否存在
$arr =['name'=>'jackie','age'=>20];
var_dump(isset($arr['phone'])); // 输出 false
var_dump(isset($arr['age'])); // 输出 true
}
2. Empty()函数
Empty() 函数用于检测变量是否为空。
//empty()函数检查一个变量是否为空
public function check_empty(){
$a ='';
var_dump(empty($a)); //输出 true
$b = null;
var_dump(empty($b)); //输出 true
$c =[];
var_dump(empty($c)); //输出 true
var_dump(empty($d)); //输出 true 变量没有赋值,输出true
$e = false;
var_dump(empty($e)); //输出true, $e=0 也是输出true false=0 如果$e = true 就输出false
$f = '0';
var_dump(empty($f)); //输出 true
}
二、按值传递和引用传递
1.按值传递
正常的赋值,相当于复制,变量已最后一次赋值为准。
$a = "test";
$b = $a;
$a = "newtest";
echo $a; //输出newtest
echo $b; //输出test
--或者
$a = "test";
$b = $a;
$b = "newtest";
echo $a; //输出test
echo $b; //输出newtest
2.按引用传递
被赋值的变量指向原始变量,一变则变,(跟着变、共同体),在原始变量加&。
$a = 'test';
$b = &$a; //引用赋值,$a、$b指向同一空间,两者相对与一个共同体
$b = 'newtest'; //$b 变则 $a跟着变
echo $a; //输出 newtest
echo $b; //输出 newtest
3.按引用传递(函数)
函数内变量改变,函数外跟着变。
$a = 'test';
function fun(&$var){ //$var 引用$a; 两者共同体
$var = "newtest"; //$var改变则$a跟着改变
}
fun($a);
echo $a; //输出newtest
4.两者优缺点
按值传递:php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。
按引用传递:不需要复制值,对于性能提高很有好处。
三、全等和等于区别
==只是判断内容是否一致,===先判断两者数据类型是否一致,如果不一致直接返回false,如果一致再判断两者内容是否一致。
四、static、$this和self
1.Static关键字
声明类属性或方法加上static就变成静态属性或静态方法,静态方法就可以不实例化就可以直接访问。
static变量使用
静态变量执行完不会销毁,而是会继续使用上次执行的结果。
for($i=0;$i<3;$i++){
static $a = 0;
echo $a;
$a++;
}
//输出 012 如果不加上static,输出000
静态方法
调用1:classname::staticMethod();
调用2:self::staticMethod();
静态属性
调用1:classname::staticAttr();
调用2:self::staticAttr();
2.Self关键字
self是指向类本身,与任何对象实例无关。self可以访问本类中的静态属性和静态方法,也可以访问父类中的静态属性和静态方法。无论是调用本类还是父类self都可以不用实例化,直接调用。
self::staticAttr
self::statciMethod
如果要调用本类中的静态成员,必须使用self来调用,使用this来调用会报错(如:未定义变量test)
3.This关键字
$this当前对象
五、单引号’ ’ 与双引号" "区别
尽量使用单引号
public function note(){
$var = "jackie";
echo "我叫$var"; //输出 我叫jackie
echo '我叫$var'; //输出 我叫$var
echo '我叫{$var}'; //输出 我叫$var
echo "我叫{$var}"; //输出 我叫jackie
$str1 = 'I\'am jackie'; //输出 I'am jackie
echo $str1,'<br />';
//单引号不需要考虑变量的解析,速度比双引号快
}
六、echo、print、print_r 区别
- echo() 可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构,而并不是真正的函数,因不能作为表达式的一部分使用。
- print() 只能打印一个值,如果字符串成功显示则返回true,否则返回false。
- print_r() 可以打印数组、对象
七、构造函数__construct()和析构函数__destruct()
1. 构造函数__construct()
- 在对应对象实例化时会自动被调用,具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
- 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。
2. 析构函数__destruct()
- 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
- 和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。
<?php
class Base{
public $test = 'jackie';
function __construct($test){
$this->test = $test;
echo '我是父类的构造函数----';
echo $test;
}
}
class Api extends Base
{
protected $name ='';
private $age = 25;
public $phone;
public function __construct($phone){
parent::__construct('111'); //调用父类的构造函数
$this->phone = $phone;
echo '我是子类的构造函数----';
}
public function __destruct(){
echo '我是析构函数,对象'.__CLASS__ .'调用完就执行---';
}
public function test(){
echo 'test---';
}
}
$c = new Api('110');
$c->test();
八、GET、POST 区别
- GET是从服务器上获取数据,POST是向服务器传送数据。
- GET安全性非常低(参数暴露在地址栏),但执行效率快,POST安全性较高。
- get传送的数据量较小,不能大于2KB,post传送的数据量较大,一般被默认为不受限制。
- GET是通过URL方式请求,POST是通过请求header请求。
待续。。。!