php遇到的问题汇总


php遇到的问题汇总


1 缓冲查询和非缓冲查询(Buffered and Unbuffered queries)

PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。 这样给了PHP程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。 但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。

另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存, 但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。

非缓冲查询方法:




// 1  mysqli
 
    <?php
    $mysqli = new mysqli("localhost", "user", "passwd", "db1");
    $uresult = $mysqli->query("SELECT * FROM Table1", MYSQLI_USE_RESULT);
      
    if ($uresult) {
      while ($row = $uresult->fetch_assoc()) {
        echo $row['Id'] . PHP_EOL;
      }
    }
    $uresult->close();
    ?>
    
    
// 2  mysqli
 
    <?php
    $pdo = new PDO("mysql:host=localhost;dbname=db1", 'user', 'passwd');
    $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
      
    $uresult = $pdo->query("SELECT * FROM Table1");
    if ($uresult) {
      while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
        echo $row['Id'] . PHP_EOL;
      }
    }
    ?>

// 3  mysql
    
    <?php
    $conn = mysql_connect("localhost", "user", "passwd");
    $db  = mysql_select_db("world");
      
    $uresult = mysql_unbuffered_query("SELECT * FROM Table1");
    if ($uresult) {
      while ($row = mysql_fetch_assoc($uresult)) {
        echo $row['Id'] . PHP_EOL;
      }
    }
    ?>


2 PHP 时间转换


    <?php
        strtotime( " 2018-02-12 00:01:02" );  //  字符串转成 时间戳
    
        date('Y-m-d H:i:s',$timestamp )   //  时间戳 转换成 字符串形式的
    ?>


3 PHP 正则匹配

    <?php
        preg_match('/(\d{4})(\d{2})/i',$ori_month,$ori_month_arr);     
    //        >> preg_match( re规则, 匹配的字符, 得到的结果)
               
            
            var_dump($ori_month_arr); 
    //        ==>>   $ori_month_arr   array(3) { [0]=> string(6) "201708" [1]=> string(4) "2017" [2]=> string(2) "08" }
    ?>


4 php 向数组中添加元素的两种方法

    1  array_push() 
    
    $arr = array();
    $arr.array_push(1,2,3,....)
    
    
    
    
    
    2  $arr[]
    
    $arr = array();
    $arr[] = 1;
    $arr[] = 2;
    $arr[] = 3;
    ...


5 PHP 中引入文件的方式

include 与 require 区别:

二者在 性能 和 如何处理包含失败 之外,其他完全一样
  • 二者在性能方面相差的并不是很多

  • 在处理包含错误方面

    在包含失败 时:

      include()产生一个警告并继续执行,
        
      而require()则导致一个致命错误。
    

    换句话说,如果想在遇到丢失文件时停止处理页面就用 require(),否则就用include()。

once 可以在脚本运行期间保证 同一个文件只被包含一次

避免函数的重复定义,变量的重复赋值


6 PHP 中遍历数组的方式



      
    //    第一种遍历方式,只适用于  索引数组。PHP数组在没有指明key的情况下,默认是索引数组  
    
        for ($i = 0; $i < sizeof($data); $i++) {  
            echo $indexData[$i] . "1" . "<br>";  
        }  
      
      
    //   第二种   遍历方式。可同时用于索引数组和关联数组,取出key和value  
    
        foreach ($data as $key => $value) {  
            echo $value . "2" . "<br>";  
        }  
      
      
    //  第三种遍历方式,   可同时用于索引数组和关联数组,只取出value。(会改变数组当前指针)  
        
        foreach ($data as $value) {  
            echo $value . "3" . "<br>";  
        }  
      


6 PHP 回调函数 call_user_func_array 方法

call_user_func_array ( callable $callback , array $param_arr )

1 动态传参 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数


    function A($fName, $content) { 
    echo $fName.$content.
    }
    
    function B ($fName, $content, $country) { 
    echo $content . $country; echo "<br>";
    }
    
    call_user_func_array ('A', '我是', '中国人')
    call_user_func_array ('B', 'Chinese',"sdsd","sdsa")

2 不需要判断函数类型,无论是普通函数,类的静态方法或者类的方法,均直接调用



    class A { 
    public static function sayChinese($fName, $content, $country) { 
    echo '你好' } } 
    
    function say() { 
    $args = func_get_args(); 
    call_user_func_array(array('A', 'sayChinese'), $args);
    
    A ::sayChinese是类的静态方法  通过call_user_func_array依然可以调用


7 PHP匿名函数与闭包

PHP5.3版本以上

匿名函数 也叫 闭包函数(closures), 允许临时创建一个没有指定名称的函数,最常用作 回调函数( callback 的参数)

1 匿名函数没有名字,如果要使用他,需要将它返回给一个变量

    $func = function(){
    };  		  //  带有结束符
    
    $var = $func	
    
    var_dump($var);     //   object(Closure)#1 (0) { }
    
    这时候匿名函数 变量 是一个内置的closure对象

2 PHP闭包主要是用过 匿名函数来实现

 匿名函数在普通函数中当作参数传入,也可以被返回,这就实现了一个简单的闭包
 
 子函数可以使用父函数中的局部变量,这种行为就是闭包  


闭包的两个特点:

    1   作为函数变量的一个引用,当函数返回的时候,处于激活状态。
    2   一个闭包就是当一个函数返回的时候,一个没有释放的栈区

3 连接闭包与外界变量的关键字 USE

    
    <?php
    date_default_timezone_set("Asia/Shanghai");
    function demo(){
        $a = 10;
        $b = 20;
        $one = function($str) use ($a,$b){    // 使用父函数的局部变量
            echo $str."<br>";
            echo $b."<br>";
        };
        return $one;           //  返回闭包函数
    }
    $var = demo();
    $var("hello world");
    ?> 	


4 小结:

闭包外层是一个函数
闭包内部都有函数
闭包会return 内部函数
执行闭包之后,闭包内部的变量会存在,而闭包内部函数的内部变量不会存在

应用场景:

    1   保护函数的变量安全
    2    在内存中维持一个变量


8 PHP 变量函数 (类似于反射)

如果将一个 函数名称(字符串) 给一个变量, 然后在这个变量后边加上括号,就会调用这个变量对应的函数


    <?php
    
    date_default_timezone_set("Asia/Shanghai");
    
    function add($a,$b){
       return $a + $b;
    }
    function plus($a,$b){
       return $a * $b;
    }
    $var = "add";
    $var = "plus";
    echo $var(2,3);
    
    ?> 
    


9 PHP 可变个数参数的函数(不传参数)

通常用户定义函数的时候,设置的参数是有限的,如果希望函数可以接受任意个数的参数

需要使用

func_get_args()

func_get_arg()

func_num_args()         

来获取实际的参数

    
    //  实例    
    function demo(){
        echo "hello";
        $args = func_get_args();
        print_r($args);
        for($i=0;$i<func_num_args();$i++){
            echo "第".$i."个元素是".func_get_arg($i)."<br>";
        }
    }
    
    demo(1,2,3,4)
Buy me a 肥仔水!