100个常见的php面试题

2020-05-01

如何通过引用传递变量?

可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。

function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a is 6 here

整数 12 和字符串 “13” 的比较在 PHP 中是否有效?

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。

如何在 PHP 中强制转换类型?

PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型。

$foo = 10;   // $foo is an integer
$bar = (boolean) $foo;   // $bar is a boolean
  • (int), (integer) - 转换为整形 integer
  • (bool), (boolean) - 转换为布尔类型 boolean
  • (float), (double), (real) - 转换为浮点型 float
  • (string) - 转换为字符串 string
  • (array) - 转换为数组 array
  • (object) - 转换为对象 object
  • (unset) - 转换为 NULL (PHP 5)

条件语句何时以 endif 结尾?

PHP 提供了一些流程控制的替代语法,包括 ifwhileforforeachswitch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;endwhile;endfor;endforeach; 以及 endswitch;

if ($a == 5):
    echo "a equals 5";
    echo "...";
elseif ($a == 6):
    echo "a equals 6";
    echo "!!!";
else:
    echo "a is neither 5 nor 6";
endif;

PHP 中如何使用三元条件运算符?

函数 func_num_args () 的作用是什么?

func_num_args — Returns the number of arguments passed to the function

function test()
{
    var_dump(func_get_args());
}

test(1, 2, 3);

如果变量 $ var1 设置为 10,而 $ var2 设置为字符 var1,那么 $$ var2 的值是多少?

通过::访问类意味着什么?

声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

方法或属性为静态方法或静态属性

在 PHP 中,对象是按值传递还是按引用传递?

在php5 的对象编程经常提到的一个关键点是"默认情况下对象是通过引用传递的"。但其实这不是完全正确的。

PHP 的引用是别名,就是两个不同的变量名字指向相同的内容。在 PHP 5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。

是否在类构造函数中隐式调用了 Parent 构造函数?

如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。

与其它方法不同,当 __construct() 被与父类 __construct() 具有不同参数的方法覆盖时,PHP 不会产生一个 E_STRICT 错误信息。

class P{
    public function __construct()
    {
        echo 'P构造方法';
    }
}

class S extends P{
    public function __construct()
    {
        echo 'S构造方法';
    }
}

$s = new S();

__sleep 和__wakeup 有什么区别?

__sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。

serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。

与之相反,unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

class Test
{
    protected array $data;
    protected int $age;
    protected string $name;

    public function __construct($name, $age, $data)
    {
        $this->name = $name;
        $this->age = $age;
        $this->data = $data;
    }

    public function __sleep()
    {
        return ['name', 'age'];
    }

    public function __wakeup()
    {
        var_dump($this->name);
    }
}

$test = new Test('张三', 23, [1, 2, 3]);

$res = serialize($test);
echo $res;
unserialize($res);

会话的定义是什么?

会话支持在 PHP 中是在并发访问时由一个方法来保存某些数据.从而使你能够构建更多的定制程序 从而提高你的 web 网站的吸引力.

一个访问者访问你的 web 网站将被分配一个唯一的 id, 就是所谓的会话 id. 这个 id 可以存储在用户端的一个 cookie 中,也可以通过 URL 进行传递.

会话支持允许你将请求中的数据保存在超全局数组$_SESSION中. 当一个访问者访问你的网站,PHP 将自动检查(如果 session.auto_start 被设置为 1)或者在你要求下检查(明确通过 session_start() 或者隐式通过 session_register()) 当前会话 id 是否是先前发送的请求创建. 如果是这种情况, 那么先前保存的环境将被重建.

如何在 PHP 中启动会话?

session_start — 启动新会话或者重用现有会话

如何传播会话 ID?

一个访问者访问你的 web 网站将被分配一个唯一的 id, 就是所谓的会话 id. 这个 id 可以存储在用户端的一个 cookie 中,也可以通过 URL 进行传递.

永久性 Cookie 的含义是什么?

永久性 cookie 永久存储在浏览器计算机上的 cookie 文件中。默认情况下,cookies 是临时的,如果我们关闭浏览器,cookies 将被删除。

会话何时结束?

session.cookie_lifetime 以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示"直到关闭浏览器"。默认为 0

session_unregister() 和 session_unset() 有什么区别?

session_unregister — Unregister a global variable from the current session

本函数已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除

session_unset — 释放所有的会话变量

请不要使用unset($_SESSION)来释放整个$_SESSION, 因为它将会禁用通过全局$_SESSION去注册会话变量

$GLOBALS 是什么意思?

$GLOBALS — 引用全局作用域中可用的全部变量

一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

与所有其他超全局变量不同,$GLOBALS在PHP中总是可用的。

$ _SERVER 是什么意思?

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目

$ _FILES 是什么意思?

通过 HTTP POST 方式上传到当前脚本的项目的数组

$ _FILES ['userfile'] ['name' ] 和 $ _FILES ['userfile'] ['tmp_name'] 有什么区别

$ _FILES ['userfile'] ['name'] 表示客户端文件的原始名称,

$_FILES['userfile']['tmp_name'] 表示服务器上存储的文件的临时文件名。

上传文件出问题时,如何获取错误信息

$_FILES['userfile']['error'] 包括了与上传文件有关的错误代码。

如何更改要上传的文件大小的最大值?

如果 post_max_size 设置的值太小,则较大的文件会无法被上传。因此,请保证 post_max_size 的值足够的大。

MAX_FILE_SIZE 设置的值,不能大于 ini 设置中 upload_max_filesize 选项设置的值。其默认值为 2M 字节。

$ _ENV 是什么意思?

通过环境方式传递给当前脚本的变量的数组。

这些变量被从 PHP 解析器的运行环境导入到 PHP 的全局命名空间。很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能运行着不同种类的 Shell,所以不可能有一份确定的列表。请查看你的 Shell 文档来获取定义的环境变量列表。

其他环境变量包含了 CGI 变量,而不管 PHP 是以服务器模块还是 CGI 处理器的方式运行。