某 游戏公司 php 面试题

1。实现未知宽高元素的水平垂直居中,至少两种方法。

<div, class="father">
<div class="son"></div>
</div>
//1
.father{
position:relative;
}
.son{
margin:auto;
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
}
//2
.father{
display:-webkit-flex;
align-items:center;
justify-content:center;
}
.son{
margin:auto;
}

https://www.jianshu.com/p/9206cf198c33

 

2。vue有哪些生命周期有哪些阶段?

一共8个阶段
1、beforeCreate(创建前)
2、created(创建后)
3、beforeMount(载入前)
4、mounted(载入后)
5、beforeUpdate(更新前)
6、updated(更新后)
7、beforeDestroy(销毁前)
8、destroyed(销毁后)

 

3。在vue中,父子组件之间如何进行通信。

https://blog.csdn.net/qq_25479327/article/details/81022339
1.父组件传递数据给子组件
父组件:
//这里必须要用 - 代替驼峰
data(){ return { msg: [1,2,3] }; }
子组件通过props来接收数据:
props: ['childMsg']
2.子组件与父组件通信
子组件: <div @click="up">
methods: { up() { this.$emit('upup','hehe'); //主动触发upup方法,'hehe'为向父组件传递的数据 } }
父组件:
//监听子组件触发的upup事件,然后调用change方法
methods: { change(msg) { this.msg = msg; } }

 

4。什么是SQL注入和XSS攻击,如何避免。

SQL注入:用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。
防止:
使用mysql_real_escape_string()过滤数据
手动检查每一数据是否为正确的数据类型
使用预处理语句并绑定变量
参数化SQL:是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@或?来表示参数。
XSS攻击 :跨站点脚本攻击,由用户输入一些数据到你的网站,其中包括客户端脚本(通常JavaScript)。如果你没有过滤就输出数据到另一个web页面,这个脚本将被执行。
防止:为了防止XSS攻击,使用PHP的htmlentities()函数过滤再输出到浏览器。

 

5。简单阐述一下,什么是横向分表和纵向分表,各自有什么优缺点。

横向分表
是把大的表结构,横向切割为同样结构的不同表,如,用户信息表,user_1,user_2,表结构是完 全一样,根据某些规则来划分表,如根据用户id划分。
分表理由:根据数据量的规模来划分,保证单表的容量不会太大,从而来保证单表的查询等处理能力。
纵向分表
将本来可以在同一个表的内容,人为划分为多个表。
分表理由:根据数据的活跃度进行分离

 

6。MYSQL把一个大表拆分多个表后,如何解决跨表查询效率问题。

大表分表后每个表的结构相同,可以用sql的union
比如a,b表结构相同可以通过union来联接
select * from a
union all
select * from b
where
。。。。
https://www.wandouip.com/t5i146798/

 

 7。有如下成绩表(表1),现需将其转换成如表2所示的结构,请写出sql语句。

表1

表2
SELECT name,
max(case when subject='语文' then score else 0 end) as 语文,
max(case when subject='数学' then score else 0 end) as 数学,
max(case when subject='英语' then score else 0 end) as 英文,
sum(score) as 总分
FROM `chengji` group by name

 

8。请简述memcached、redis、mongodb的区别和联系。


都是非关系型数据库,性能都非常高,但是mongoDB和memcache、redis是不同的两种类型。后两者主要用于数据的缓存,前者主要用在查询和储存大数据方面,是最接近数据库的文档型的非关系数据库。
从数据存储位置上来分,memcache的数据存在内存中,而redis既可以存储在内存中,也可以存储的到磁盘中,达到持久化存储的功能,memcache一旦断电,数据全部丢失,redis可以利用快照和AOF把数据存到磁盘中,当恢复时又从磁盘中读取到内存中,当物理内存使用完毕后,可以把数据写入到磁盘中。
从存储数据的类型上来分,memcache和redis存储的方式都是键值对,只不过redis值的类型比较丰富,有string(字符串),hash(哈希),list(列表),set(集合)zset(有序集合),而memcache主要存储的是字符串。

 

9。面向对象有哪些特性?并请简述private、protected、public修饰符的访问权限。


三大特性:封装,继承,多态。
https://www.cnblogs.com/xuan584521/p/6395923.html
https://blog.csdn.net/benpaodelulu_guajian/article/details/77508405
private : 私有成员, 在类的内部才可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。

 

10。什么是抽象类和接口,有什么区别。


http://www.php.cn/php-weizijiaocheng-372186.html
https://www.cnblogs.com/vinter/p/8716685.html
抽象类:是基于类来说,其本身就是类,只是一种特殊的类,不能直接实例,可以在类里定义方法,属性。类似于模版,规范后让子类实现详细功能。
接口:主要基于方法的规范,有点像抽象类里的抽象方法,只是其相对于抽象方法来说,更加独立。可让某个类通过组合多个方法来形成新的类。
抽象类与接口的相同点:
1、都是用于声明某一种事物,规范名称、参数,形成模块,未有详细的实现细节。
2、都是通过类来实现相关的细节工作
3、语法上,抽象类的抽象方法与接口一样,不能有方法体,即{}符号
4、都可以用继承,接口可以继承接口形成新的接口,抽象类可以继承抽象类从而形成新的抽象类
抽象类与接口的不同点:
1、抽象类可以有属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量
2、抽象类内未必有抽象方法,但接口内一定会有“抽象”方法
3、语法上有不同
4、抽象类用abstract关键字在类前声明,且有class声明为类,接口是用interface来声明,但不能用class来声明,因为接口不是类。
5、抽象类的抽象方法一定要用abstract来声明,而接口则不需要
6、抽象类是用extends关键字让子类继承父类后,在子类实现详细的抽象方法。而接口则是用implements让普通类在类里实现接口的详细方法,且接口可以一次性实现多个方法,用逗号分开各个接口就可

 

11。__autoload()方法的作用是什么,请简述它的工作原理。


通过定义这个函数来启用类的自动加载。
使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。包括new(实例化类)的时候,也包括extends的时候。甚至反序列化的时候,也会调用__autoload函数。__autoload要与require函数相结合。
这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时,就提示错误。

 

12。如何判断一个文件或一个目录是否绝对可写。


在PHP中,可用is_writable()函数来判断一个 文件/目录 是否可写
bool is_writable ( string $filename )
如果文件存在并且可写则返回 TRUE。($filename 参数可以是一个目录名,即检查目录是否可写。 )
https://www.cnblogs.com/52php/p/5665458.html

 

13。请编写至少2个自定义函数获取指定文件的后缀名。


1.$file = 'x.y.z.png';
echo substr(strrchr($file, '.'), 1);
解析:strrchr($file, '.')
strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符

2.$file = 'x.y.z.png';
echo substr($file, strrpos($file, '.')+1);
解析:strrpos($file, '.')
查找 "." 在字符串中最后一次出现的位置,返回位置 substr()从该位置开始截取
https://blog.csdn.net/wuxianbing2012/article/details/79656724

 

14。strtolower()和strtoupper()函数可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换。

 

function str_toupper($str)
{
if(!is_string($str))
{
return $str;
}
$strOut = '';
$strArr = str_split($str,1);
foreach($strArr as $val)
{
if(ord($val) >= ord('a') && ord($val) <= ord('z'))
{ 
$strAsc = ord($val);
$strAsc += ord('A') - ord('a'); 
$val = chr($strAsc);
}
$strOut .= $val;
}
return $strOut;
}
function str_tolower($str)
{
if(!is_string($str))
{
return $str;
}
$strOut = '';
$strArr = str_split($str,1);
foreach($strArr as $val)
{
if(ord($val) >= ord('A') && ord($val) <= ord('Z'))
{ 
$strAsc = ord($val);
$strAsc += ord('a') - ord('A'); 
$val = chr($strAsc);
}
$strOut .= $val;
}
return $strOut;
}

https://blog.csdn.net/MiracleC/article/details/78886168

 

15。请编写一个自定义函数,获取一个目录的最简形式,(例:输入:/a/b/c/../../x/y/ 输出:/a/x/y/)

 

16。什么是nginx的平滑重启,请简述其工作原理。


在服务器开发过程中,难免需要重启服务加载新的代码或配置,如果能够保证server重启的过程中服务不间断,那重启对于业务的影响可以降为0。
https://mp.weixin.qq.com/s?__biz=MzIxNzg5ODE0OA==&mid=2247483660&idx=1&sn=b78b07de401eb7c08b6b7ba70c68cf00&chksm=97f38cc7a08405d18ecca5cf9af523b1d2f3294a603a08d810664aa4986b481eda82eee78626&utm_medium=hao.caibaojian.com

 

17。linux环境下,如何更改文件名同时将文件移到其它指定目录。


mv /old_path/file1 /new_path/file2

 

19。如何同步远程服务器上的指定目录到本地服务器。


使用git,svn,ftp

 

20。GIT如何查看当前分支,如何切换分支,以及如何解决冲突。


1. 查看远程分支
git branch -a
带有“*”号的表示当前分支
2. 查看本地分支
git branch
3. 切换分支命令
git checkout -b v1 origin/v1
# 切换回master
git checkout master
4.解决冲突
情景一:多个分支代码合并到一个分支时;
在当前分支上,直接修改冲突代码--->add--->commit。
情景二:多个分支向同一个远端分支推送代码时;
在本地当前分支上,修改冲突代码--->add--->commit--->push

 

posted @ 2019-07-02 11:06  路闻man  阅读(731)  评论(0编辑  收藏  举报