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)