PHP面试题整理

PHP部分:

一 : oop面向对象编程思想             

面向对象部分:(https://www.cnblogs.com/-shu/p/4600987.html

                             https://www.cnblogs.com/-shu/p/4600995.html             https://www.cnblogs.com/-shu/p/4601002.html

      1:面向对象可以帮助我们解决以下问题:1:方便扩展:代码的重构和重用   2:允许方法和成员变量隐藏,可控制哪些变量不允许被访问  3:使用设计模式,可以解决常见的设计问题   4:让代码调试更容易,可维护,效率更高。

       2:面向对象的特征:

            封装:封装是面向对象结合在一起的机制,代码和操纵数据,并防止外界干扰和误用,包装好的数据和方法到一个类作为封装。

            继承:通过扩展派生一个对象成为一个新对象的过程称为继承。当你从另一个对象继承时,子类即继承派生的所有的属性和方法的超类。

            多态性:对象可以来自父类或者保留父类的一部分属性。

       3:public,private,protected权限修饰符

             public:    修饰的属性或方法可以被其他类在外部访问。

             protected:   修饰的成员变量或方法表示允许对象内部和子类的对象访问。

             private :     只能由类本身的方法访问。

             static :    静态方法虽然隶属于某个类,但他不受该类的束缚,不需要生命对象实例就可以直接被外部访问和存取

             abstruct:  抽象方法不能直接使用,必须经过实现implement才可以使用。

             final: 不能再重新声明,也不能被重写。

       4: 魔术方法

           __construct()   构造方法是在创建对象实例时自动执行的方法      __destruct()     销毁一个对象或相关的工作。

           autoload()     自动加载                            toString()      将类的实例转化为字符串

            __set()        __get()     

            __sleep()序列化一个实例的时候     __wakeup()反序列化一个实例的时候

            unset()      删除私有属性时

      5:设计模式

            单例模式

class Single {
    private $name;//声明一个私有的实例变量
    private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
    
    }

    static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
    static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
        if(!self::$instance) self::$instance = new self();
        return self::$instance;
    }

    public function setname($n){ $this->name = $n; }
    public function getname(){ return $this->name; }
}


$oa = Single::getinstance();
$ob = Single::getinstance();
$oa->setname('hello world');
$ob->setname('good morning');
echo $oa->getname();//good morning
echo $ob->getname();//good morning

        6:MVC的特点,各种好与不好的原因

             Model - 数据模型层:通常情况下对数据进行加工,进行一些其他的处理,与数据相关的一些操作都在 Model层 操作。
             View - 视图层:跟用户进行交互的一些界面上的东西。
             Controllear - 控制层:用来处理业务逻辑的

              1、 MVC的优点 
        (1) 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。 
        (2) 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。 
        (3) 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。 
        (4) 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。 
            2、 MVC的不足之处 
        (1) 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 
        (2) 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 
        (3) 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。 
        (4) 目前,一般高级的界面工具或构造器不支持MVC模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。

        7:变量的传值和传引用

             传值:在函数范围内,改变变量值得大小,都不会影响到函数外边的变量值.
             传引用:在函数范围内,对值得任何改变,在函数外部也有所提现,因为传引用传的是内存地址.

        8:php类型转换和判断类型的方法

              is_numberic:检验变量 是不是为数码或者数码字符串
              is_bool:检验变量是不是布尔型
              is_float:检验测定变量是不是浮点型  
              is_int(整形) is_string(是不是字符串) is_object(是不是对象)  is_array(是不是数组)   is_null(是否为空)

             getType(获取变量类型)

        9:php运算符的优先级

        10:php数组函数,预定义数组(array_map使用场景,array_merge()合并数组后键名的变化)

        11:正则表达式,每个标号含义,邮箱、网址、标签匹配,正则函数。

        12:PHP异常处理(级别,错误日志,控制错误输出)。

                php.ini或者error_reporting();

         13:php时间函数(php得到前一天的2015-08-24 10:20的函数)

                 date("Y-m-d H:i:s",strtotime("-1 day"));

          14:session与cookie的区别,怎么解决分布式session共享的问题(cookie存session,nosql解决办法)

                   区别与联系:

                   使用session_start()调用session,服务器端在生成session文件的同时生成session ID哈希值和默认值为PHPSESSID                 的session name,并向客户端发送变量为PHPSESSID(session name)(默认)值为一个128位的哈希值。服务器端将通                   过该cookie与客户端进行交互,session变量的值经php内部系列化后保存在服务器 机器上的文本文件中,和客户端的                   变量名默认情况下为PHPSESSID的cookie进行对应交

互,即服务器自动发送了http 头:header(‘Set-Cookie:                                   session_name()=session_id(); path=/’);即setcookie(session_name(),session_id());当从该页跳转到的新页面并调用                       session_start()后,PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到则新建一个数据集。

               共享方案:

              1:使用数据库保存session, 使用数据库来保存session,就算服务器宕机了也没事,session照样在。问题:程序需要定制;每次请求都进行数据库读写开销不小,另外数据库是一个单点,可以做数据库的hash来解 决这个问题。   

               2:使用 memcached来保存session, 这种方式跟数据库类似,内存存取性能比数据库好很多。问题:程序需要定制,增加 了工作量;存入memcached中的数据都需要序列化,效率较低,断电或者重启电脑容易丢失数据;

               3: 通过加密的cookie,在A服务器上登录,在用户的浏览器上添加加密的cookie,当用户访问B服务器时,检查有无Session,如果没有,就检验 Cookie是否有效,Cookie有效的话就在B服务器上重建session。简单,高效, 服务器的压力减小了,因为session数据不存在服务器磁盘上。根本就不会出现session读取不到的问题。

问题:网络请求占用很多。每次请求时,客户端都要通过cookie发送session数据给服务器,session中数据不能太多,浏览器对cookie 的大小存在限制。不适合高访问量的情况,因为高访问量的情况下

          15:get与post的区别

          16:http与https的区别(https怎么保准安全ssl)

                 1、HTTP是超文本传输协议,信息是明文传输,HTTPS是具有安全性的SSL加密传输协议。

            2、HTTPS协议需要ca申请证书,一般免费证书少,因而需要一定费用。

            3、HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样。前者是80,后者是443。

            4、HTTP连接是无状态的,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,安全性高于HTTP协议。

 

          17:判断null的函数,变量是否存在的函数,是否为空的函数

                  1、当变量未定义时,is_null() 和“参数本身”是不允许作为参数判断的,会报Notice警告错误;

                  2、empty , isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!

                 3、isset():仅当null和未定义,返回false;

                 4、empty():""、0、"0"、NULL、FALSE、array(),未定义,均返回true;

                 5、is_null():仅判断是否为null,未定义报警告;

                 6、变量本身作为参数,与empty()一致,但接受未定义变量时,报警告;

           18:网络状态码含义,常用(204,304, 404, 504,502)。

                  200 - 服务器成功返回网页

                  204 (无内容) 服务器成功处理了请求,但没有返回任何内容。

                  301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。

                  302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

                  303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。

                  304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。

                  404 - 请求的网页不存在

                  403 (禁止) 服务器拒绝请求。

                  503 - 服务不可用

                  504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。

           19:PHP安全处理,过滤函数。

                   PDO

                   htmlspecialchars

                   htmlentitles

           20:php字符串函数

           21:网络各种攻击的名词含义(SQL攻击、XSS、CSRF、DDos),防止措施。

           22:Apache配置文件,PHP配置文件,各个含义字段的含义。查看apacache端口号80的命令

           23:url的处理函数,得到url指定的部分。

                  提取url,要求从”< a href=’sina.com.cn’>sina“中提取url部分(要求使用两种方法)

           24:浏览器输入url到页面呈现经过的过程,域名解析的过程

  1. 要通过dns解析(浏览器是不能识别url地址的,需解析成ip地址),
  2. 返回相对应的IP地址,
  3. 建立tcp连接,(tcp三次握手)
  4. 发送Http请求,
  5. 服务器进行处理并返回Http报文,
  6. 浏览器渲染页面,
  7. 断开连接(tcp四次挥手)

          25:int(10)与int(11)de 区别,char与varchar()的区别,int与bigint的区别

          26:第三方登录和第三方支付的原理

          27: 接口和抽象类的区别

                 抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。抽象类是通过关键字abstract 来声明的。
                 抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法,抽象方法                   没有方法体,该方法天生就是要被子类重写的。
                 抽象方法的格式为:abstract function abstractMethod();

                 接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可以不写关键字 public,接口中                   的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。
                 抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。
                子类继承抽象类使用 extends,子类实现接口使用 implements。

           28:smarty模板引擎的特点:

                 速度快,编译型,缓存技术,插件机制,强大的表现逻辑

                 smarty是一个模板引擎,使用smarty主要是为了实现逻辑和外在内容的分离,如果不使用模板的话,通常的做法就是php代码和html代码混编。使用了模板之后,则可以将业务逻辑都放到php文件中,而负责显示内容的模板则放到html文件中。
Smarty在执行display方法的时候,读取模板文件,并进行数据替换,生成编译文件,之后每次访问都会直接访问编译文件,读取编译文件省去了读取模板文件,和字符串替换的时间,所以可以更快,编译文件里时间戳记录模板文件修改时间,如果模板被修改过就可以检测到,然后重新编译(编译是把静态内容保存起来,动态内容根据传入的参数不同而不同)。
如果启用了缓存,则会根据编译文件生成缓存文件,在访问的时候如果有缓存文件并且缓存文件没有过期,则直接访问缓存文件。

          29:   写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名,例如:http://www.sina.com.cn/abc/de/fg.php?id=1需要取出php或.php                 

function getExt($url)
{

      $url=basename($url);

      $post1=strpos($url,'.');
      
      $post2=strpos($url,'?');

      if(strst($url,'?')){
          return substr($url,$post1+1,$post2-$post1-1);
      }else{
           return substr($url,$post1+1);
      }   
                      
}

$path = "http://www.sina.com.cn/abc/de/fg.php?id=1";
echo getExt2($path);

Mysql部分(https://www.cnblogs.com/-shu/p/4600985.html)

           1:存储引擎,常用的几个,优缺点,差别,原理

           2:数据库索引使用的那种数据结构,画出数据结构,为什么使用这种数据结构

           3:索引建立的原则:最左原则,原因??

           4:数据库的sql优化,哪些sql语句执行会忽略索引

           5:mysql的字段类型,使用场景int(10)与int(11)

           6:   事务

           7:sql注入的解决办法

           8:mysql的函数

Nosql部分

            1:memcache呀redis的区别(印象笔记)

             2:redis的消息队列来解决高并发的问题

Linux部分:(https://www.cnblogs.com/-shu/p/4600997.html)

             1:linux的命令

                    top/ps/mv/find/df/cat/chmod/chgrp/grep/wc

              2:  linux查看80端口的命令

              3:查看php-fpm进程的linux命令

              4:Shell的使用,命令操作。

版本控制器:

              1:SVN与GIT的区别,常用命令

数据结构:(https://www.cnblogs.com/-shu/p/4600992.html)

              1:排序算法,时间复杂度(快速排序)

              2:二分法查找的思想,时间复杂度

秒杀问题

https://www.cnblogs.com/zyf-zhaoyafei/p/4828358.html
https://app.yinxiang.com/shard/s49/nl/10640374/b9595138-748f-4796-a9d8-1069a037f23a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值