美文网首页
搜藏经典

搜藏经典

作者: 塞外务农 | 来源:发表于2018-01-27 18:57 被阅读0次

    PHP 16个魔术方法

    __construct()         类的构造函数
    __destruct()           类的析构函数
    __call()                  在对象中调用一个不可访问方法时调用
    __callStatic()         用静态方式中调用一个不可访问方法时调用
    __get()                  获得一个类的成员变量时调用
    __set()                   设置一个类的成员变量时调用
    __isset()                当对不可访问属性调用isset()或empty()时调用
    __unset()              当对不可访问属性调用unset()时被调用
    __sleep()               执行serialize()时,先会调用这个函数
    __wakeup()           执行unserialize()时,先会调用这个函数
    __toString()           类被当成字符串时的回应方法
    __invoke()             调用函数的方式调用一个对象时的回应方法
    __set_state()         调用var_export()导出类时,此静态方法会被调用
    __clone()               当对象复制完成时调用
    __autoload()          尝试加载未定义的类
    __debugInfo()        打印所需调试信息
    

    PHP 数组函数

    array_merge()   合并多个数组
    array_column()  获取数组中指定的单列字段
    array_unique()  去掉数组中重复的值
    array_keys()    获取数组中所有的键名
    asort()         对关联数组按键值进行升序排序
    

    PHP 字符串函数

    substr("Hello world",6);                        截取字符串
    mb_substr('测试', 0, 1, 'utf-8');               截取字符串
    
    substr_replace($str, 'shanghai', 6);            把字符串的一部分替换为另一个字符串
    str_replace('world', 'boy', 'hello world');     把字符串的一部分替换为另一个字符串
    
    substr_count('hello world', 'l');               统计子串出现的次数
    strtolower();                                   转小写
    strtoupper();                                   转大写
    
    explode(' ', 'hello world');                    把字符串打散为数组
    strip_tags()                                    剥离html标签
    
    将1234567890转成1,234,567,890样式
    ltrim(strrev(chunk_split(strrev($str),3,',')),',')
    

    PHP 超全局变量

    $_POST
    $_GET
    $_COOKIE
    $_SESSION
    $_FILES
    $_SERVER
    $GLOBALS
    

    PHP 面向对象的理解以及三大特征

    万事万物都是一个对象,有自己的属性、行为
    封装、继承、多态
    

    PHP 常见的设计模式

    单例模式、工厂模式、观察者模式

    单例模式
    一个类只有唯一对象实例问题   常用于数据库类设计,只连接一次数据库,防止打开多个数据库连接
    
    class database
    {
            private static $_instance;  必须声明为静态的私有变量,用来实例保存对象
            private function __construct() {}  构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
            private function __clone() {}  阻止复制对象实例
            public static function get_instance()  此函数必须设为公有的,必须调用此方法以返回实例的一个引用
            {
                      if (!isset(self::$_instance)) {
                                  self::$_instance = new self();
                      }
                      return self::$_instance;
            }
    }
    
    $db1 = database::get_instance();
    $db2 = database::get_instance();
    
    工厂模式
    用一个公用的封装类去批量生成对象
    class factoryModel
    {
        public static function produce($className)
        {
            $classObj = new $className();
            return $classObj;
        }
    }
    
    class tom {}
    class kit {}
    
    $tomObj = factoryModel::setFunc("tom");
    $kitObj = factoryModel::setFunc("kit");
    

    PHP的重载、重写

    因为PHP属于弱类型,无法实现严格的OOP函数重载
    

    PHP的常用算法

    冒泡排序
    对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。
    对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数
    http://www.cnblogs.com/wgq123/p/6529450.html
    
    function bubble_sort($array)
    {
        $len = count($array);
        for ($i = 0; $i < $len - 1; $i++) {
            for ($j = 0; $j < $len - 1 - $i; $j++) {
                if ($array[$j] > $array[$j + 1]) {
                    $tmp = $array[$j + 1];
                    $array[$j + 1] = $array[$j];
                    $array[$j] = $tmp;
                }
            }
        }
        return $array;
    }
    
    $array = array(1, 5, 2, 7, 8, 0);
    
    print_r(bubble_sort($array));
    
    快速排序
    找到当前数组中的任意一个元素作为标准,新建两个空数组,遍历整个数组元素;
    如遍历到的元素比当前的元素小,就放到左边的数组,否则放到右面的数组,然后再对新数组进行同样的操作;
    这里符合递归的原理,所以我们可以用递归来实现;
    使用递归,则需要找到递归点和递归出口:
      递归点:如果数组的元素大于1,就需要再进行分解,所以我们的递归点就是新构造的数组元素个数大于1
      递归出口:我们什么时候不需要再对新数组不进行排序了呢?就是当数组元素个数变成1的时候,所以这就是我们的出口。
    
        $array = array(5, 2, 7, 4, 8);
        function quick_sort($array) {
            if (count($array) <= 1) return $array;
            $left = $right = array();
    
            for ($i = 1; $i < count($array); $i++) {
                if ($array[$i] < $array[0]) {
                    $left[] = $array[$i];
                } else {
                    $right[] = $array[$i];
                }
            }
    
            $left = quick_sort($left);
            $right = quick_sort($right);
            return array_merge($left, array($array[0]), $right);
        }
    
        print_r(quick_sort($array));
    
    二分查找
    二分查找前提:数组是一个有序的数组;
    首先取得初始下标、结束下标,然后获取中间一个值的下标,然后中间的值跟需要查找的数做对比;
    如果中间的值大于需要查找的值,说明需要查找的值在前一段,需要再次二分,所以此时结束下标为中间值下标-1,反之初始下标为中间值下标+1;
    function binary_search($needle, $array) {
        $start = 0;
        $end = count($array) - 1;
        while ($start <= $end) {
            $middle = floor(($start + $end) / 2);
            if ($array[$middle] == $needle) return '下标为:' . $middle;
            if ($array[$middle] > $needle) $end = $middle - 1;
            if ($array[$middle] < $needle) $start = $middle + 1;
        }
        return '没有找到';
    }
    
    $array = array(1, 2, 3, 4, 5, 6);
    print_r(binary_search(4, $array));
    

    支付宝、微信、第三方托管 接口开发中需要注意的安全点

    • 严格遵照接口文档进行开发
    • 验证用户是否支付成功、支付金额
    • 验证支付签名、支付平台来源
    • 合理化设置订单生成规则

    myisam innodb 区别

    myisam:
    1. 表锁
    2. 非聚集索引,数据与索引分离的 
    3. 支持全文索引,查询效率高,适合select 读取快
    
    innodb:
    1. 行锁
    2. 事务
    3. 外键
    4. 聚集索引,数据与索引存放在一起
    5. 适合大量的update delete insert操作
    

    mysql 多列索引 单列索引 的使用

    • 多列索引(复合索引)主要是为了解决单列索引(普通索引)在使用 where 条件的时候 and 关键字带来的多个索引的效率问题
      select * from course where aid = 10 and unit_id = 12 and chapter_id = 213;
      aid、unit_id、chapter_id 最好建立多列索引 而不是建立 多个单列索引

    memcache redis 区别

    memcache:
        单一的数据结构key - value
    
    redis:
        丰富的数据结构string、list、has、set、sorted set
        数据持久化,支持RDB、AOF两种方式
        支持主从复制
    

    什么是事务

    事务:是一系列的数据库操作,是数据库应用的基本逻辑单位
    
    事务特性:
    1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
    2)一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态
    3)隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
    4)持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
    
    事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
    

    什么是锁

    数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
    加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
    
    基本锁类型:锁包括行级锁和表级锁
    

    遍历文件夹

    function scan_dir($dir)
    {
        $array = array();                                           // 定义一个空数组,用于存放遍历的目录
        $resource = opendir($dir);                                  // 打开目录,并返回目录句柄
        while (($file = readdir($resource)) !== false) {            // 当能够读取目录时,执行以下循环
            if ($file != '.' && $file != '..') {                    // 排除此两个目录
                if (is_dir($dir . '/' . $file)) {                   // 如果目录下仍是目录,递归执行
                    $array[$file] = scan_dir($dir . '/' . $file);
                } else {
                    array_push($array, $file);                      // 将文件加入列表数组
                }
            }
        }
        closedir($resource);                                        // 关闭目录句柄
        return $array;                                              // 返回结果数组
    }
    
    echo "<pre>";
    print_r(scan_dir('F:\www.exam2.com\app'));     
    echo "</pre>";
    

    在不使用第三个变量的条件下,交换两个变量值

    方法1: 使用list()函数
    $a = 1;
    $b = 2;
    
    list($b, $a) = array($a, $b);
    
    方法2: 使用数学方法
    $a = 1;
    $b = 2;
    
    $a = $a + $b;
    $b = $a - $b;
    $a = $a - $b;
    

    PHP开发中,禁用cookie之后,如何使用session?

    方法一:可以启用url传值的方式来使用

    index.php 存储session值
    
    <?php
      session_start();
      $_SESSION['username34'] = 123456789;
    ?>
    <a href="text.php?PHPSESSID=<?php echo session_id() ?>">另一个页面</a>
    
    text.php 获取session值
    
    <?php
      session_id($_GET['PHPSESSID']);
      session_start();
      echo $_SESSION['username34'];
    ?>
    

    方法二:可以启用<input type="hidden" value="xxx">的方式来使用

    HTTP协议理解

    引用:

    1. 域名解析
      域名解析检查顺序为:
      >> 浏览器自身DNS缓存
      >> 系统自身的DNS缓存
      >> 读取host文件
      >> 本地域名服务器
      >> 权限域名服务器
      >> 根域名服务器
      如果有且没有过期,则结束本次域名解析。域名解析成功之后,进行后续操作
    2. tcp 3次握手建立连接
    3. 客户端发起http请求,服务器响应http请求
    4. 客户端获取http请求内容,然后解析html内容,然后请求html中的静态资源
    5. 客户端渲染html内容
    • http主要请求分为两种方式:get、post

    • http是一个基于请求和响应模式的,无状态的应用层超文本传输协议

    • http因为是无状态的会话服务,所以引入cookie、session会话机制来解决此种无状态问题

    • http请求由三部分组成:请求行、请求头、请求体

    • http响应由三部分组成:响应行、响应头、响应体

    请求行:请求方法  请求资源路径            http协议版本
            GET     /resources/images/     HTTP/1.1
    
    响应行:http协议版本  状态码  状态码描述            
           HTTP/1.1     200     OK
    
    • http响应状态码
      1xx 指示信息
      2xx 成功
      3xx 重定向
      4xx 客户端信息
      5xx 服务端信息

    shell 编程

    step=1
    
    for (( i = 0; i < 60; i=(i+step) )); do
            curl http://www.runpicture141.com/index.php
            sleep $step
    done
    
    exit 0
    
    crontab -e
    * * * * * /bin/sh /home/shell/index.sh >/dev/null 2>&1
    

    TCP与UDP协议的区别

    tcp:打电话
    udp: 写信

    int(10) 与 int(11) 有什么区别?

    • int(10)、int(11) 只是在显示效果上不一样,存储长度上没有区别都只能存储10个字符
    • int(M) M只代表MySQL的一些交互工具用来显示字符的个数,存储长度取决于是否设置为unsigned

    相关文章

      网友评论

          本文标题:搜藏经典

          本文链接:https://www.haomeiwen.com/subject/haqoaxtx.html