结合实际 PHP 面试,汇总自己遇到的问题,以及网上其他人遇到的问题,尝试提供简洁准确的答案
1、echo、print、print_r、var_dump 区别
-
echo和print是语言结构、print_r和var_dump是普通函数
-
echo:输出一个或多个字符串
-
print:输出字符串
-
print_r:打印关于变量的易于理解的信息
-
var_dump:打印关于变量的易于理解的信息(带类型)
2、单引号和双引号的区别
双引号可以被分析器解析,单引号则不行
3、isset 和 empty 的区别
-
isset:检测变量是否已设置并且非 NULL
-
empty:判断变量是否为空,变量为 0/false 也会被认为是空;变量不存在,不会产生警告
4、static、self、$this 的区别
-
static:static 可以用于静态或非静态方法中,也可以访问类的静态属性、静态方法、常量和非静态方法,但不能访问非静态属性
-
self:可以用于访问类的静态属性、静态方法和常量,但 self 指向的是当前定义所在的类,这是 self 的限制
-
$ this:指向的是实际调用时的对象,也就是说,实际运行过程中,谁调用了类的属性或方法,$this 指向的就是哪个对象。但 $this 不能访问类的静态属性和常量,且 $this 不能存在于静态方法中
5、include、require、include_once、require_once 的区别
-
require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行
-
include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次
6、常见数组函数
-
array_count_values — 统计数组中所有的值
-
array_flip — 交换数组中的键和值
-
array_merge — 合并一个或多个数组
-
array_multisort — 对多个数组或多维数组进行排序
-
array_pad — 以指定长度将一个值填充进数组
-
array_pop — 弹出数组最后一个单元(出栈)
-
array_push — 将一个或多个单元压入数组的末尾(入栈)
-
array_rand — 从数组中随机(伪随机)取出一个或多个单元
-
array_keys — 返回数组中部分的或所有的键名
-
array_values — 返回数组中所有的值
-
count — 计算数组中的单元数目,或对象中的属性个数
-
sort — 对数组排序
7、Cookie 和 Session
-
Cookie:PHP 透明的支持 HTTP cookie 。cookie 是一种远程浏览器端存储数据并以此来跟踪和识别用户的机制
-
Session:会话机制(Session)在 PHP 中用于保持用户连续访问Web应用时的相关数据
8、预定义变量
对于全部脚本而言,PHP 提供了大量的预定义变量
超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量
-
$GLOBALS — 引用全局作用域中可用的全部变量
-
$_SERVER — 服务器和执行环境信息
-
$_GET — HTTP GET 变量
-
$_POST — HTTP POST 变量
-
$_FILES — HTTP 文件上传变量
-
$_REQUEST — HTTP Request 变量
-
$_SESSION — Session 变量
-
$_ENV — 环境变量
-
$_COOKIE — HTTP Cookies
-
$php_errormsg — 前一个错误信息
-
$HTTP_RAW_POST_DATA — 原生POST数据
-
$http_response_header — HTTP 响应头
-
$argc — 传递给脚本的参数数目
-
$argv — 传递给脚本的参数数组
超全局变量
-
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们
-
超全局变量:$ GLOBALS、$ _SERVER、$ _GET、$ _POST、$ _FILES、$ _COOKIE、$ _SESSION、$ _REQUEST、$_ENV
9、传值和传引用的区别
传值导致对象生成了一个拷贝,传引用则可以用两个变量指向同一个内容
10、构造函数和析构函数
-
构造函数:PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作
-
析构函数:PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行
11、魔术方法
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke() 等方法在 PHP 中被称为"魔术方法"(Magic methods)
12、public、protected、private、final 区别
对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承
13、客户端/服务端 IP 获取,了解代理透传 实际IP 的概念
客户端IP: $_SERVER[‘REMOTE_ADDR’]
服务端IP: $_SERVER[‘SERVER_ADDR’]
客户端IP(代理透传): $_SERVER[‘HTTP_X_FORWARDED_FOR’]
14、类的静态调用和实例化调用
-
占用内存
-
静态方法在内存中只有一份,无论调用多少次,都是共用的
-
实例化不一样,每一个实例化是一个对象,在内存中是多个的
-
-
不同点
-
静态调用不需要实例化即可调用
-
静态方法不能调用非静态属性,因为非静态属性需要实例化后,存放在对象里
-
静态方法可以调用非静态方法,使用 self 关键字。php 里,一个方法被 self:: 后,自动转变为静态方法
-
调用类的静态函数时不会自动调用类的构造函数
-
15、PHP 不实例化调用方法
静态调用、使用 PHP 反射方式
16、php.ini 配置选项
- 配置选项
名字 | 默认 | 备注 |
---|---|---|
short_open_tag | “1” | 是否开启缩写形式(<? ?>) |
precision | “14” | 浮点数中显示有效数字的位数 |
disable_functions | “” | 禁止某些函数 |
disable_classes | “” | 禁用某些类 |
expose_php | “” | 是否暴露 PHP 被安装在服务器上 |
max_execution_time | 30 | 最大执行时间 |
memory_limit | 128M | 每个脚本执行的内存限制 |
error_reporting | NULL | 设置错误报告的级别 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED |
display_errors | “1” | 显示错误 |
log_errors | “0” | 设置是否将错误日志记录到 error_log 中 |
error_log | NULL | 设置脚本错误将被记录到的文件 |
upload_max_filesize | “2M” | 最大上传文件大小 |
post_max_size | “8M” | 设置POST最大数据限制 |
php -ini | grep short_open_tag //查看 php.ini 配置
- 动态设置
ini_set(string $varname , string $newvalue);
ini_set('date.timezone', 'Asia/Shanghai'); //设置时区
ini_set('display_errors', '1'); //设置显示错误
ini_set(<