Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP面试题汇总 #1

Open
ycrao opened this issue Apr 21, 2015 · 11 comments
Open

PHP面试题汇总 #1

ycrao opened this issue Apr 21, 2015 · 11 comments

Comments

@ycrao
Copy link
Owner

ycrao commented Apr 21, 2015

部分题目收集自网络,里面可能会穿插一些MySQL与HTML相关问题。

1. echo(),print(),print_r()的区别?

echoprint 不是一个函数,是一个语言结构;
print(string $arg) 只有一个参数;
echo arg1,arg2 可以输出多个参数,返回 void
echoprint 只能打印出string,不能打印出结构;
print_r能打印出结构。比如:

$arr = array("key"=>"value");
print_r($arr);

2. 语句include和require的区别是什么?

在失败的时候:
include 产生一个 warning ,而 require 直接产生错误中断;
require 在运行前载入;
include 在运行时载入;
require_onceinclude_once 可以避免重复包含同一文件。

3. php中传值与传引用有啥区别?

&表示传引用;
函数中参数传引用会将参数进行改变;
一般在输出参数有多个的时候可以考虑使用引用。

$num = 10
function multiply($num){
    $num = $num * 10;
}
multiply($num);
echo $num;

4. 下面哪项没有将john添加到users数组中?

(a) $users[] = 'john';
(b) array_add($users,'john');
(c) array_push($users,'john');
(d) $users ||= 'john';

答案为bd,php 里面无 array_add 函数,d项为语法错误的表达。

5. HTTP协议中几个状态码的含义。

200 : 请求成功,请求的数据随之返回。
301 : 永久性重定向。
302 : 暂时行重定向。
401 : 当前请求需要用户验证。
403 : 服务器拒绝执行请求,即没有权限。
404 : 请求失败,请求的数据在服务器上未发现。
500 : 服务器错误。一般服务器端程序执行错误。
503 : 服务器临时维护或过载。这个状态时临时性的。

6. 写出一些php魔术方法。

__construct() 实例化类时自动调用。
__destruct() 类对象使用结束时自动调用。
__set() 在给未定义的属性赋值的时候调用。
__get() 调用未定义的属性时候调用。
__isset() 使用isset()或empty()函数时候会调用。
__unset() 使用unset()时候会调用。
__sleep() 使用serialize序列化时候调用。
__wakeup() 使用unserialize反序列化的时候调用。
__call() 调用一个不存在的方法的时候调用。
__callStatic()调用一个不存在的静态方法是调用。
__toString() 把对象转换成字符串的时候会调用。比如 echo。
__invoke() 当尝试把对象当方法调用时调用。
__set_state() 当使用var_export()函数时候调用。接受一个数组参数。
__clone() 当使用clone复制一个对象时候调用。

7. MySQL存储引擎 MyISAM 和 InnoDB 的区别。

a. MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.
b. MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快.
c. InnoDB不支持FULLTEXT类型的索引.
d. InnoDB中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可.
e. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
f. DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
g. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用.
h. MyISAM支持表锁,InnoDB支持行锁。

8. 说出一些MySQL优化方法?

a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
c. mysql库主从读写分离。
d. 找规律分表,减少单表中的数据量提高查询速度。
e. 添加缓存机制,比如memcached,apc等。
f. 不经常改动的页面,生成静态页面。
g. 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

9. 下面$a的结果是:

<?php
$a = in_array('01', array('1')) == var_dump('01' == 1);
?>

A true
B false

答案为B

10. 说下php中empty()和isset()的区别。

isset 用于检测变量是否被设置,使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE
empty 如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE

如果变量为 0 ,则empty()会返回TRUEisset()会返回TRUE
如果变量为空字符串,则empty()会返回TRUE,isset()会返回TRUE
如果变量未定义,则empty()会返回TRUEisset()会返回FLASE

注意:isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined() 函数。
当要 判断一个变量是否已经声明的时候 可以使用 isset 函数;
当要 判断一个变量是否已经赋予数据且不为空 可以用 empty函数;
当要 判断 一个变量 存在且不为空 先 isset 函数 再用 empty 函数;

@JimChenWYU
Copy link

第九题,亲测

环境:win10 php5.6.7 php-cli

答案是false

@c9n
Copy link

c9n commented May 18, 2017

var_dump('01' == 1) // return NULL
in_array('01', array('1')) // return true

$a // false

@ycrao
Copy link
Owner Author

ycrao commented May 18, 2017

@JimChenWYU 部分面试题来自网络,难免以讹传讹,已修改。

@anpingzhaoyu
Copy link

面试了两家公司 都是这些问题

@ycrao
Copy link
Owner Author

ycrao commented Jun 19, 2017

@anpingzhaoyu 面前刷一下

@ansonli1988
Copy link

为什么我第9题的结果是true呢?

环境:Ubuntu 14.04 LTS php5.5.9

@Qinjianbo
Copy link

Qinjianbo commented Jul 29, 2017

@ansonli1988 是false

echo "var_dump('01'==1):";
var_dump('01' == 1); // bool(true)
echo PHP_EOL;
echo "in_array('01', array('1')):";
var_dump(in_array('01', array('1'))); // bool(true) 但是var_dump 返回 null
echo PHP_EOL;
$a = in_array('01', array('1')) == var_dump('01' == 1); //true == null 所以false
var_dump($a);
$b = in_array('01', array('1')) == ('01' == 1); true == true 所以true
var_dump($b);

@ansonli1988
Copy link

@Qinjianbo
我在自己的测试环境里跑了第九题结果是true啊,这可如何是好?

@Qinjianbo
Copy link

Qinjianbo commented Jul 29, 2017

@ansonli1988 额!~~~
$a = in_array('01', array('1')) == var_dump('01' == 1); //true == null 所以false
var_dump($a);
你运行这个打印出来的是true ?
你仔细看一下,输出结果应该是
bool(true)
bool(false)
这两个,注意这里有两个var_dump
你输出的true 应该是 var_dump('01' == 1) 这个输出的!~~

@verdana
Copy link

verdana commented Mar 29, 2018

还要注意 in_array 的第三个参数,如果第三个参数是 true,要检查类型的:

var_dump(in_array('01', [1], true));  // false
var_dump(in_array('01', ['1'], true));  // false

@gh0sthx
Copy link

gh0sthx commented Apr 9, 2018

这问题也太简单了吧,面试如果问这些文件也意味着这个公司很垃圾

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants