收集与遇到的PHP面试题

1、PHP语言的一大优势是跨平台,什么是跨平台?

PHP的运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以叫跨平台

2、web开发中数据提交方式有几种?有什么区别?

get与post两种方式
区别:
1. get从服务器获取数据,post向服务器传送数据
2. get传值在url中可见,post在url中不可见
3. get传值一般在2KB以内,post传值的大小可以在php.ini中进行设置
4. get安全性较低,post安全性较高,执行效率却比post高
建议:
1、get安全性较post要差些,如果包含机密信息建议用post提交数据;
2、做数据查询建议用get;做数据添加、修改或删除建议用post;

3、安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?

1.防远程提交;2.防SQL注入,对特殊代码进行过滤;3.防止注册机灌水,使用验证码;

4、在系统的开发中,如何提高系统的运行效率?

1.优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询;

2.数据表中创建索引;

3.对系统中经常用到的数据生成缓存;

5、print、echo、print_r有什么区别?

1.echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出echo会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用。
2.print 是打印字符串
3.print_r 则是打印复合类型 如数组 对象

6、SESSION与COOKIE的区别?

1.存储位置:session存储于服务器,cookie存储于浏览器
2.安全性:session安全性比cookie高
3.session为‘会话服务’,在使用时需要开启服务,cookie不需要开启,可以直接用

7、在PHP中,单引号和双引号所包围的字符串的区别是(    )。

A.单引号解析其中\r\t等转义字符,而双引号不解析

B.双引号速度快,单引号速度慢

C.单引号速度快,双引号速度慢

D.双引号解析其中以$开头的变量,而单引号不解析

参考答案:D。

分析:双引号是可以解析$符开头的变量和转义字符的,而单引号不解析也不转义字符。所以,选项A错误,选项D正确。

对于选项B和选项C,由于题目中明确说了引号内包含的是字符串,因此不需要对变量进行解析,在这种情况下双引号和单引号的效率是相同的。选项B和选项C都是错误的。

8、在PHP中,自定义一个类的方式是(    )。

A.

B.

C.

D.

参考答案:B。

分析:定义一个类是使用class关键字加类名来定义的,定义格式为:class 类名{}。实例化一个类的格式为:$object=new 类名();

9、获得实例化对象所属类名字的函数是(    )。

A.get_class() B.get_object_vars()

C.get_class_methods() D.get_classname()

参考答案:A。

分析:对于选项A,get_class()函数用于返回一个对象的类的名称。所以,选项A正确。

对于选项B,get_object_vars()函数用于得到给定对象的属性。所以,选项B错误。

对于选项C,get_class_methods()函数用于获取类方法的名字。所以,选项C错误。

对于选项D,PHP中没有该方法。所以,选项D错误。

10、以下有关PHP面向对象的说法中,不正确的是(    )。

A.要实现一个接口,使用 implements操作符,类中必须实现接口中定义的所有方法,否则会报一个致命错误

B.类名可以是任何非 PHP保留字的合法标签,汉字也可以作为PHP的类名

C.如果PHP的子类中定义了构造函数,则创建子类的对象时,会隐式地调用其父类的构造函数

D.序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字

参考答案:C。

分析:子类定义的构造函数会覆盖父类的构造函数,如果要子类的构造函数执行,同时也执行父类的构造函数,那么必须显式地使用parent::__construct();去调用。所以,选项C错误。

11、下面关于PHP抽象类的描述中,错误的是(    )。

A.PHP中抽象类使用abstract关键字定义

B.没有方法体的方法叫抽象方法,包含抽象方法的类必须是抽象类

C.抽象类中必须有抽象方法,否则不叫抽象类

D.抽象类不能实例化,也就是不可以new成对象

参考答案:C。

分析:抽象类可以是个空类,也就是不一定需要有抽象方法。但抽象方法只能存在抽象类中。所以,选项C错误。

12.关于线程的,说法错误的是()

A、线程是进程的一个实体,是CPU调度和分派的基本单位
B、它是比进程更小的能独立运行的基本单位
C、线程和进程一样拥有系统资源
D、线程自己基本上不拥有系统资源
参考答案:C
答案解析:
线程是指进程内的一个执行单元,也是进程内的可调度实体。线程自己基本上不拥有系统资源

13.InnoDB的共享锁和排他锁的设置写法

共享锁:SELECT ...  LOCK IN SHARE MODE;

排他锁:SELECT ... FOR UPDATE;

14.编写获得文件目录以及目录下文件的函数

';
        // 循环读取句柄信息
        while (false !== $file = readdir($pathResource)) {
            if (in_array($file,[".",".."])){
                continue;
            }
            echo "
  • $file
  • "; // 读取目录下的子文件或目录,判断是否为目录,目录则进行调用方法 $sonDir = $path . '/' . $file; if (is_dir($sonDir)) { getAllFiles($sonDir); } } echo ''; closedir($pathResource); } } // 调用 getAllFiles("/");

    15.如何解决多进程高并发对同一文件进行读写?(参考文档:https://blog.csdn.net/daiyan_csdn/article/details/51524781)

    1.对文件进行加锁时,设置一个超时时间。

    2.不使用flock函数,借用临时文件来解决读写冲突的问题

    3.对操作的文件进行随机读写,以降低并发的可能性。

    4.将所有要操作的进程放入一个队列中。

    16.授权是什么?

    17.秒杀的解决场景

    QPS(并发量)在1500以下的情况,使用redis的乐观锁即可

    connect('127.0.0.1',6379);
    
    $redis->watch('seckill_num'); // 乐观锁,监听秒杀销售数量
    $seckillNum = $redis->get('seckill_num'); // 获取销售数量
    
    $stock = 100; // 需要销售的库存数
    if ($seckillNum >= $stock) {
        exit('秒杀活动结束');
    }
    
    $redis->multi(); // 开启事务
    $redis->incr('seckill_num'); // 秒杀销售数量+1
    $redis->exec(); // 提交事务

    QPS(并发量)更高的情况,使用redis队列+crontab定时器防止超卖(借鉴:https://blog.csdn.net/weixin_40325128/article/details/89378834)

    你可能感兴趣的:(后端,PHP,PHP面试)