首页  >  文章  >  后端开发  >  php中一些重要的php知识点分享

php中一些重要的php知识点分享

小云云
小云云原创
2018-03-16 16:08:195427浏览

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

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

如何发现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;
}

相关推荐:

PHP中的运算符及PHP知识基础

关于PHP知识点的详细介绍

对PHP知识的有关介绍介绍

以上是php中一些重要的php知识点分享的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn