作为php程序员你应该了解php知识点

1. 简述php中的autoload

在PHP中使用类时,我们必须在使用前加载进来,不管是通过  require 的方式还是  include 的方式,但是会有两个问题影响我们做出加载的决定。首先是不知道这个类文件存放在什么地方,另外一个就是不知道什么时候需要用到这个文件。特别是项目文件特别多时,不可能每个文件都在开始的部分写很长一串的 require … 
Autoload 的加载机制, 当通过 new 来实例化一个类时,PHP会通过定义的autoload 函数加载相应的文件,如果这个类文件使用了 extends 或者 implements 需要用到其他的类文件,php会重新运行 autoload 去进行类文件的查找和加载,如果发生了两次对同一类文件的请求,就会报错。
 2. 静态变量及有什么优缺点?
静态局部变量的特点: 1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。2.静态局部变量只会初始化一次。3.静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。4.当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜.
3. strtr 和 str_replace 有什么区别,两者分别用在什么场景下?
  • str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)
  • strtr() 函数转换字符串中特定的字符。
5.6版本 str_replace 比 strtr 效率高10+倍, 7.0版本效率基本相同, 但5.6的 str_replace 竟比 7.0高 3倍
4. 魔术方法
  • __construct():类的默认构造方法,如果__construct()和与类同名的方法共同出现时,默认调用__construct()而不是同类名方法。
  • __call():当调用不存在或者不可访问的方法时,会调用__call($name, $arguments)方法。
  • __toString():当打印对象时会被直接调用。如echo $object;
  • __clone():当对象被拷贝时直接调用。
  • __isset():对不存在或者不可访问的属性使用isset()或者empty()时,__isset()会被调用;
  • __destruct():类的析构函数,当该对象的所有引用都被删除,或者对象被显式销毁时执行。
5. 如下所示,会输出什么结果?
foreach ($array as $key => $item) {
            $array[$key + 1] = $item + 2;
            echo "$item";
        }
        print_r($array);

结果示例: $array = [3,6,7,8];

3678 //echo 输出数组内元素的值
Array
(
    [0] => 3  //$key 保持不变
    [1] => 5 //每次的$eky + 1,对应的值加2,
    [2] => 8
    [3] => 9
    [4] => 10
)

laravel

  1. laravel和其他框架对比的优缺点
  • laravel

    • 优点: 使用人数全球第一,文档齐全,框架结构组织清晰,大量第三方扩展包供引用,适合大型网站协同开发,提供的artisan开发工具开发效率高。composer扩展自动加载,中间件
    • 缺点:稍复杂,上手比一般框架要慢;大量引用第三方包,但某些场景下我们只使用类中的部分方法,代码显得有些冗余
  • ThinkPHP

    • 优点:是一个快速、简单的基于MVC和面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开发体验和易用性,并且拥有众多的原创功能和特性,为WEB应用开发提供了强有力的支持。简单明了方便快捷,上手快
    • 缺点:缺少面向对象的设计,5的版本基本面向对象,框架社区相关的辅助工具少

Mysql

1. Mysql中,int(10)和int(11)的区别
  • BIT[M]位字段类型,M表示每个值的位数,范围从1到64,如果M被忽略,默认为1
  • TINYINT [(M)] [UNSIGNED] [ZEROFILL] M默认为4。很小的整数。带符号的范围是-128到127。无符号的范围是0到255。
  • SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M默认为6。小的整数。带符号的范围是-32768到32767。无符号的范围是0到65535。
  • MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M默认为9。中等大小的整数。带符号的范围是-8388608到8388607。无符号的范围是0到16777215。
  • INT[(M)] [UNSIGNED] [ZEROFILL] M默认为11。普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。
  • BIGINT[(M)] [UNSIGNED] [ZEROFILL] M默认为20。大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。
注意:这里的M代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存储11个长度的数字,这是大错特错的。其实当我们在选择使用int的类型的时候,不论是int(3)还是int(11),它在数据库里面存储的都是4个字节的长度,在使用int(3)的时候如果你输入的是10,会默认给你存储位010,也就是说这个3代表的是 默认的一个长度,当你不足3位时,会帮你不全,当你超过3位时,就没有任何的影响。
**int(M) M指示最大显示宽度。最大有效显示宽度是255。该可选显示宽度规定用于 显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。
2.索引左原则:
  • like,匹配字符串时,不以通配符开头,左侧必须固定,该字段索引才会起作用
  • 复合索引,左侧的字段固定时,在索引匹配时,右侧的索引才有效。因为复合索引关键字排序,按照左边字段进行排序,如果左边字段相同,才依据右边字段。
3.索引创建的优缺点:
  • 优点:

    • 创建索引可以大大提高系统的性能
    • 通过唯一性索引,可以保证数据库表中每一行数据的唯一性
    • 大大加快检索速度
    • 加速表与表之间的连接
    • 使用分组和排序子句进行数据检索时,减少查询中分组和排序的时间
    • 通过使用索引,可以在查询过程中,使用优化隐藏器,提高系统性能
  • 缺点:

    • 创建索引和维护索引要耗费时间,随数据量的增加而增加
    • 索引占用物理空间
    • 对表中的数据进行增删改的时候,索引需动态维护,降低了数据的维护速度
4. 请描述一下mysql主从服务器之间是如何同步数据的,什么样的sql会造成主从无法正确同步?
  • 网络的延迟
由于mysql主从复制是基于binlog的一种异步复制,通过网络传送binlog文件,理所当然网络延迟是主从不同步的绝大多数的原因,特别是跨机房的数据同步出现这种几率非常的大,所以做读写分离,注意从业务层进行前期设计。
  • 主从两台机器的负载不一致
由于mysql主从复制是主数据库上面启动1个io线程,而从上面启动1个sql线程和1个io线程,当中任何一台机器的负载很高,忙不过来,导致其中的任何一个线程出现资源不足,都将出现主从不一致的情况。
  • max_allowed_packet设置不一致
主数据库上面设置的max_allowed_packet比从数据库大,当一个大的sql语句,能在主数据库上面执行完毕,从数据库上面设置过小,无法执行,导致的主从不一致。
  • key自增键开始的键值跟自增步长设置不一致引起的主从不一致。
  • mysql异常宕机情况下,如果未设置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出现binlog或者relaylog文件出现损坏,导致主从不一致。
  • mysql本身的bug引起的主从不同步。
  • 版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数据库上面不支持该功能
5.有一个order表,如下,求购买次数最多的两个用户
order_id user_id goods
100000 100 苹果
100001 100 苹果
100002 101 橘子
100003 102 苹果
100004 102 香蕉

sql

SELECT order_id,user_id,COUNT(order_id) AS count FROM order GROUP BY user_id ORDER BY  count DESC  limit 2






Linux

  1. 如何发现web服务慢
  • top:查看系统性能
  • Nginx:最后一个字段加入$request_time
列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条
cat access.log|awk '($NF > 1 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
  • 代码中实现,开头写入时间,结尾写入时间

综合

1. AES和RSA的区别:
  • RSA是非对称加密,公钥加密,私钥解密, 反之亦然。缺点:运行速度慢,不易于硬件实现。常私钥长度有512bit,1024bit,2048bit,4096bit,长度越长,越安全,但是生成密钥越慢,加解密也越耗时。
  • AES对称加密,密钥最长只有256个bit,执行速度快,易于硬件实现。由于是对称加密,密钥需要在传输前通讯双方获知。
  • AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥 长度不足时,会补齐)
总结 采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
RBAC:基于角色的访问控制
  • 一个用户属于多个角色
  • 角色拥有多个动作的权限
  • 用户是否具有某些动作的权限

表:用户表、角色表、动作表,用户角色关联表、角色动作关联表


MongoDB

MongoDB数据类型:
  • String(字符串): mongodb中的字符串是UTF-8有效的。
  • Integer(整数): 存储数值。整数可以是32位或64位,具体取决于您的服务器。

* Boolean(布尔): 存储布尔(true/false)值。

  • Double(双精度): 存储浮点值。
  • Min/ Max keys(最小/最大键): 将值与最低和最高BSON元素进行比较。
  • Arrays(数组): 将数组或列表或多个值存储到一个键中。
  • Timestamp(时间戳): 存储时间戳。
  • Object(对象): 嵌入式文档。
  • Null (空值): 存储Null值。
  • Symbol(符号): 与字符串相同,用于具有特定符号类型的语言。
  • Date(日期): 以UNIX时间格式存储当前日期或时间。
  • Object ID(对象ID) : 存储文档ID。
  • Binary data(二进制数据): 存储二进制数据。
  • Code(代码): 将JavaScript代码存储到文档中。
  • Regular expression(正则表达式): 存储正则表达式

算法

1. 排序算法

* 快速排序

快速排序是十分常用的高效率的算法,其思想是:我先选一个标尺,用它把整个队列过一遍筛选,以保证其左边的元素都不大于它,其右边的元素都不小与它
function quickSort($arr){

  // 获取数组长度
  $length = count($arr);

  // 判断长度是否需要继续二分比较
  if($length <= 1){
    return $arr;
  }

  // 定义基准元素
  $base = $arr[0];

  // 定义两个空数组,用于存放和基准元素的比较后的结果
  $left = [];
  $right = [];

  // 遍历数组
  for ($i=1; $i < $length; $i++) { 

    // 和基准元素作比较
    if ($arr[$i] > $base) {
      $right[] = $arr[$i];
    }else {
      $left[] = $arr[$i];
    }

  }

  // 然后递归分别处理left和right
  $left = quickSort($left);
  $right = quickSort($right);

  // 合并
  return array_merge($left,[$base],$right);
  
}

  • 冒泡排序
思路:法如其名,就像冒泡一样,每次从数组中冒出一个最大的数
比如:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4
function bubbleSort($arr){

  // 获取数组长度
  $length = count($arr);

  // 第一层循环控制冒泡轮次
  for ($i=0; $i < $length-1; $i++) { 
    
    // 内层循环控制从第0个键值和后一个键值比较,每次冒出一个最大的数
    for ($k=0; $k < $length-$i; $k++) { 
      if($arr[$k] > $arr[$k+1]){
        $tmp = $arr[$k+1];
        $arr[$k+1] = $arr[$k];
        $arr[$k] = $tmp;
      }
    }
  }

  return $arr;
}
  • 选择排序
思路:每次选择一个相应的元素,然后将其放到指定的位置
function selectSort($arr){
   
  // 实现思路
  // 双重循环完成,外层控制轮数,当前的最小值,内层控制比较次数

  // 获取长度
  $length = count($arr);
  
  for ($i=0; $i < $length - 1; $i++) { 
    // 假设最小值的位置
    $p = $i;
  
    // 使用假设的最小值和其他值比较,找到当前的最小值
    for ($j=$i+1; $j < $length; $j++) { 
      // $arr[$p] 是已知的当前最小值
  
      // 判断当前循环值和已知最小值的比较,当发下更小的值时记录下键,并进行下一次比较
      if ($arr[$p] > $arr[$j]) {
        $p = $j; // 比假设的值更小
      }
    }
  
    // 通过内部for循环找到了当前最小值的key,并保存在$p// 判断 日光当前$p 中的键和假设的最小值的键不一致增将其互换
    if ($p != $i) {
      $tmp = $arr[$p];
      $arr[$p] = $arr[$i];
      $arr[$i] = $tmp;
    }
  }
  // 返回最终结果
  return $arr;
}

文章来源:学什么技术好

猜你喜欢

转载自blog.csdn.net/aide315/article/details/79580978
今日推荐