[目录]
1.语法基础
2.面向对象编程(OOP)
3.超全局变量交互
4.文件与目录
5.数据库编程
6.PHP内置函数参考
============================================
1.语法基础
界定符: 尾界定符前自动添加分号;
(默认)
/*块注释*/ ?>(php.ini:short_open_tag=On)
<% %>(php.ini:asp_tags=On)
文件流合并: 加_once后缀保证不重复导入;通过[物理路径]导入.html,.php;
include "path/file"; 文件不存在不会终止运行;
require("path/file") 文件不存在终止运行;require_once "path/file";
*PHP元素只对变量,常量大小写敏感;
数据类型:(变量不能声明类型,可以强制转换 $x = (type)$x ,转换规则基于自然思想 )
基本类型:integer(7,07,0x7),float,boolean,string(函数参数不可指定基本类型);
符合类型:array,object;
特殊类型:resource,NULL($x=NULL,清空$x);
伪类型:mixed,number,callback
关于string: 输出变量会强转string(boolean:""|"1",number:"[0-9.]",array:"Array")
纯字符串使用单引号'string',含变量用"\$a is $a val"或"{$a}val";
常量: define("CONST_VAR" [,12.3 [,true] ] );
省略2,3参数可判断常量是否定义,添加参数3为true表示对大小写不敏感;
*系统常量: __FILE__当前文件物理路径,__LINE__当前行号,__FUNCTION__当前函数,PHP_VERSION/PHP_OS系统相关信息
变量:
全局变量(定义在函数外)是$GLOBALS数组中的一对键值,作用域为整个脚本;
在函数内部无法直接使用(可声明global $x再使用或直接$GLOBALS['x']);
局部变量: 函数内定义,整个块可见,(无闭包时)执行结束释放
静态局部: static $x;只执行一次初始化,函数执行完并不释放;
变量引用: $b = &$a ; 此时ab共享同一内存空间;
*量的可变性:若$x = '变量名|函数名|类名',可通过$x调用: $$x|$x()|new $x();
表达式:
算术表达式(+-*/%): 算术表达式中所有量都会转型成number(integer,float)类型;
串连接式(.): 所有量转换成串;
复合赋值: $x *= $y <=> $x=$x*($y); 其中*可为 算术运算符,连接符,位运算符;
恒等比较: !== 与 === ,先判断值相等,再判断类型相同;
逻辑运算:优先级别( ! > xor > && > || > and > or ), 异或运算"同假异真"
执行运算符: echo `cmd`; 在shell中执行,返回输出结果; (IIS中不可用)
数组运算符: +(合并运算,不覆盖相同键), ==/!=或<>(是否同键值对), ===(同键值对,同类型,同顺序),
迭代器FOREACH
foreach($array as [$key=>] $val); #取数组$array[键:$key]值:$val
数组:
创建: $a = array('key'=>$val) 或 $a['key']=$val;
删除: $a = NULL; unset($a['key']);
复制: $b = $a(互不干扰); $b = &$a(共享空间);
函数:
参数传递: function f(User $x); function f(array &$x);
可变参数: function f(){ $cnt = func_num_args();$args = func_get_args();}
默认参数: function f($a , $b = 2){ #从右边往左 }
!匿名函数与闭包:
(1)仿JS的闭包:
function user(){
$name = 'admin';
return array(
'getName'=>function() use(&$name){
return $name;
},
'setName'=>function($x='') use(&$name){
$name = $x;
}
);
}
$u = User();
$u['setName']('user');
echo $u['getName']();
(2)对象管理: $x = function(){ return new MyClass();}
对于多个MyClass的实例( $x(); ),对象创建延迟到使用时,使用后立即销毁;
2.面向对象编程(OOP)
定义类: class U extends M{ #若M类有final声明,则不可被继承
public或var/protected/private $name = 'visitor';
访问修饰 function pwd(){...}
#Magic方法,提供给PHP调用
function __construct(){ #构造方法 }
function __destruct(){ #析构方法不能有参数 }
function __get($x){ return $this->$x=NULL; }
function __set($x,$val){$this->$x = $val; }
function __clone(){ #克隆时调用 }
function __toString(){ #转型时 }
//function __call($f_name , $params){}
//function __callStatic($f_name,$params){}
//function __invoke(){}
}
命名空间:
类文件第一行声明: namespace X\Y;
使用类的文件 use X\Y\类名;
自动加载: 定义魔术方法
function __autoload($className){
require_once ucfirst($className)."class.php";
}
静态调用: ClassName::静态量; 在类中 self::静态量; parent::静态量;
动态调用: (new ClassName())->name; 在类中 $this->name; parent::f();//非静态量
多态判断: (new U()) instanceof M ===true;
对象克隆: $a = clone $b; #函数传递对象都是引用传值,全等符 === 会先判断存储位置;
接口:
interface I{ public function f($x); }
class C implements I{ /*实现接口方法*/ }
抓捕异常:
try{
throw new Exception("message");
}catch(Exception $e){
$e['message'];
}
3.超全局变量(都是$GLOBALS数组的成员)
$REQUEST(从$_POST,$_GET,$COOKIE中取);
$_SERVER: 服务器信息
HTTP_REFERER:跳转到本页面的前一地址;
SCRIPT_NAME: 当前页面相对根目录的路径[同PHP_SELF]
QUERY_STRING: GET方式访问页面?后面的参数串
REQUEST_METHOD: 请求方式
REQUEST_TIME: 请求开始时间
DOCUMENT_ROOT: 根目录的 物理路径
$_SESSION: session_id存在cookie,随请求头发送给服务器,根据session_id找到session对象
session_start(); #开始会话;若没有Session对象则创建;必须保证此行代码前没有任何字符输出到Client
session_id(md5("")) #若手动设置sessionid,必须保证每个sessionid唯一;参数为空返回sessionid;
Session会话: php.ini: session.gc_maxfiletime=1440; 24分钟
代码配置Session:
ini_set('session.save_path',$SERVER['DOCUMENT_ROOT'].'tmp/'); #tmp文件夹不存在需要创建
ini_set('session.gc_maxfiletime',60*30); #单位/秒
session_start(); #省略这行会删除客户端sessionid
setcookie(session_name(),session_id(),time()+60*30,"/");
关闭会话:关闭client会使cookie失效,丢失sessionid,但session对象并未删除
<1>删除cookie: setcookie(session_name(),session_id(),time()-60,"/");
<2>清空内容: session_unset(); 或 $_SESSION=array(); 或 unset($_SESSION);
<3>删除对象: session_destroy(); #删除对象,session_id文件,不能清空对象内容
$_COOKIE: 每个cookie小于4KB,不超过20个,通常用于记录访问次数,访问历史等;
创建:
setcookie("name","value"[,expire [,path="/",domain,secure]]); #若未设置expire过期时间,则cookie保留在内存中,退出即销毁
header("Set-Cookie:name=value;expires=".gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT"),time()+30*30);
保存数组:
setcookie("user[name]",'userName',time()+30*30); #name索引不用加引号 $user = $_COOKIE['user'];
删除:
a. 设置对应键值为空,不加过期时间(客户端会删除硬盘文件,转cookie为内存临时cookie)
b. 设置对应键值过期时间为过去的时间(直接删除cookie文件,不可访问)
#响应头 void header("key:val;key2:val2" [,is_replace [,resp_code] ]);
响应文档格式: header("Content-Type:text/html;charset:utf-8")
客户端重定向: header("Location: __URL__ "); 其中__URL__可为相对路径,绝对路径,远程URI,?arg=val本页面
延迟刷新跳转: header("Reflesh:3;url= __URL__ ");
禁用缓存:
header("Expires:".date("D, d M 2000 00:00:00 ")."GMT");#过期时间标志为过去
header("Last-Modified:".date("D, d M Y H:i:s ")."GMT");#gmdate("D, d M Y H:i:s");
header("Cache-Control: no-store,no-cache,must-revalidate");
header("Pragma: no-cache");
强制文件下载:
$filename = "index.html";
header("Content-Type:text/html"); #MIME类型在 $apache$/conf/mime.types
header("Content-Disposition:attachment;filename=\"$filename\"");
header("Content-Length:".filesize($filename));
readfile($filename);
#JSON处理:
$json = array( array(“key”=>”val”) , array() ) ;
$txt = json_encode($json); #数组|对象转json文本;
$json = json_decode($txt , true); #参数2 true:array,false:object(默认)
#输出缓冲区: 默认PHP的输出缓冲是关闭的,打开缓冲后,先输出到缓冲,等脚本执行完毕再输出到client
ob_start(); #这行代码以后打开缓冲;
ob_get_length/contents(); #获取缓冲字节长度/字符内容
ob_get_clean/flush(); #返回内容, 清空缓冲/输出到Client,并关缓冲;
ob[_end]_clean/ob[_end]_flush() #清空缓冲/输出到Client ,有end表示关闭缓冲,没有则不关闭;
flush(); #输出缓冲内容和非缓冲内容
*含get表示返回,含clean表清空,flush表输出,end表关闭
4.文件与目录
文件上传:超全局变量 $_FILES
在_FILES中:
name: 原文件名,tmp_name: 临时文件名, size:字节数, type:MIME类型
error:
0 上传成功
1 文件大小超过php.ini:upload_max_filesize
2 文件大小超过隐藏域 MAX_FILE_SIZE 指定的大小
3 上传被客户端中断,只有部分上传
4 没有选择文件
6 找不到临时文件(临时文件夹php.ini:upload_tmp_dir[绝对物理路径]写入权限?)
7 临时文件写入失败(临时文件夹写入权限?)
8 上传被php拓展中断
移动文件: $tmp_name = $_FILES['ufile']['tmp_name']; $dir = $_SERVER['DOCUMENT_ROOT']."/upload/"; $fname = $_FILES['ufile']['name'];
if($_FILES['ufile']['error']===0){
if(!file_exits($dir))mkdir($dir);
$filename = $dir.time().substr($fname,strpos($fname,"."));
move_upload_file($tmp_name,$filename);
}
服务器文件目录API
打开: $file = fopen(url,mode); 返回文件指针|false; 其中url文件 物理路径 或 网络路径(http只读,ftp只读或只写); mode="r|w|a[+]";
关闭: fclose($file);
获取文件信息:参数为文件名字符串,'a.txt'="./a.txt"; {说明:$file代表文件资源对象(文件指针),$filename代表文件路径名}
file为前缀 : filesize|type|ctime|mtime|atime():字节数|'file'或'dir'|创建时间戳|修改时间戳|访问时间戳
realpath($filename): 返回绝对物理路径
dirname|basename|pathinfo(): 所在文件夹现对当前路径的地址|文件名.后缀|文件信息数组(dirname,basename,extension,filename);
读取文件:feof($file)判断是否是文件尾
文件指针读取:fgets和fgetss都读取一行,后者去除html,php标记
fread($file,filesize(realpath($file)));
fgets($file[,len]);
fgetss($file[,len]);
fgetc($file); 读取一个字符(可读二进制文件)
文件名读取: 文件名都是物理路径/文件名.后缀 [php中路径分隔符可统一使用 / ]
file_get_contents($filename);返回内容串
file($filename);返回数组,没个元素是一行内容,(可读二进制文件)
readfile($filename); 读取文件并输出,返回读取到的字节数
写入文件:
fwrite($file,$str[,$len]); 取str的len个字节写入到$file资源中
file_put_contents($filename,$str [,FILE_APPEND]);返回写入字节数
#随机读写:改变文件指针位置
rewind($file): 移动到文件头
ftell($file): 返回文件指针位置(相对于文件头偏移字节数);
fseek($file,offset [,orign]);offset是字节数,现对与orign位置,其值可选{SEEK_SET:0文件头,SEEK_CUR:1当前,SEEK_END:2文件尾}默认文件头;!注意:本函数返回0代表移动成功
文件操作: is_file($filename),is_dir($filename);这些谓词会先判断文件是否存在!
unlink($filename);删除文件
copy($filename,$filename_new);复制文件
rename($filename_old,$filename_new): 重命名/移动; !此方法可对目录使用
file_exits($filename);判断是否存在;!此方法可对目录使用
目录操作: PHP把目录和文件视为同一类型(组合模式); 注: 删除非空目录,复制目录,统计目录大小 都需要递归操作
mkdir($filename); 创建目录
rmdir($filename); 删除空目录
读取目录:
<1> $file = opendir($filename); # 打开目录 ,使用完后需要 closedir($dir)释放资源
while(($filename = readdir($file))!=false) var_dump($filename); # .和..也读取进来了
rewind($file); #读取完毕再次读取需要重置目录读取指针
<2> scandir($filename[,1]); #返回目录下文件名的数组,添加第二个参数1表示对文件名排降序 "."是最后一个元素
当前路径操作:
getcwd(); 返回当前物理路径,路径分隔符不区分/和\,PHP会自动转换;
chdir($filename); 形同shell下cd 命令
5.数据库编程
<1>面向过程 mysql_*();
$conn = mysql_connect("localhost:3306","root",""); #mysql_query("set names utf8");
mysql_select_db("dbname",$conn);
$res = mysql_query($sql,$conn); #快速操作: $res = mysql_db_query('dbname',$sql,$conn);
mysql_num_rows($res); #返回结果集中的行数
while($row = mysql_fetch_*($res)){ # 其中* 可选 row|assoc|array|object :索引(默认),关联,混合数组;对象
# $row 是结果集中的一行
}
释放: mysql_free_result($res); mysql_close($conn);
对于query操作:
insert时: mysql_insert_id() 返回自增id
delete,update时: mysql_affected_rows() 返回影响的行数 (若$sql中无where子句,恒返回0)
<2>面向对象 mysqli; php.ini: extension = php_mysqli.dll ;mysqli有与OOP对应的过程化函数
$conn = new mysqli("localhost:3306","root","","dbname");
mysqli类的方法: $conn->*(); 属性insert_id返回上一条insert语句的自增ID;
connect(url,user,pwd,[,dbname]); # $conn.close();
select_db($dbname);
set_charset("utf8");
$res = query($sql); #返回mysqli_result对象
mysqli_result类方法: 关闭结果集 $res->close();
fetch_row|assoc|array|object(); #返回一行|null
num_rows; #这是一个属性,代表结果集中的行数
data_seek(n); #结果集游标移位
*多语句查询: $conn->multi_query($sql.";".$sql2); 此方法返回boolean值,只反映第一个$sql运行状况
while($conn->more_results()){
$res = $conn->store_result(); #取出一条$sql执行的结果集
$conn->next_result();# 下一个结果集
}
<3>面向接口 PDO: PDO用于访问非微软数据库,ADO用于访问微软数据库(PDO+ODBC也可访问微软数据库)
打开PDO拓展php.ini:
extension=php_pdo.dll;
extension=php_pdo_mysql.dll #mysql
extension=php_pdo_oci.dll #oracle
extension=php_pdo_mssql.dll # 加上下面的odbc拓展访问微软数据库
extension=php_pdo_odbc.dll
$pdo = new PDO(dsn,user,pwd [,options]);
dsn串: driver:arg=val;arg2=val2;
"mysql:host=localhost:3306;dbname=test";
"oci:dbname=//localhost:1521/test";
options: 对驱动传递的一些参数
array(PDO::ATTR_PERSISTENT=>true);以长连接建立数据库连接
PDO类方法:
query($sql)/exec($sql); 执行读/写sql语句,返回PDOStatement结果集对象|影响的记录数
lastInsertId(); 返回上一条insert语句的自增ID
prepare($sql); 返回预编译PDOStatement结果查询对象
PDOStatement类方法说明
setFetchMode(PDO::FETCH_ASSOC); #设置行返回类型,0混合数组(默认),1|2关联数组,3索引数组
fetch([PDO::FETCH_ASSOC]); #返回一行|false
fetchAll() #返回二维数组,游标移动到结果集末尾
rowCount() #影响的行数,仅对prepare()和query()执行非SELECT语句有效
columnCount() #列数统计
预编译查询:对于同结构的sql语句,无需多次分析编译提高速度,也防止sql注入
$sql="...?,?..."或$sql="... :one,:two..." #符号占位或命名占位
$stmt = $conn->prepare($sql);
$stmt->bindValue(1,"常量");bindParam(":one",$val);#绑定参数, 变量绑定中,变量改变参数值跟随改变(引用)
$stmt->execute([array("符号绑定1","符号绑定2")| array(":one"=>"参数1",":two"=>$two) ])
*经过了execute的方法后,$stmt已经可使用PDOStatement类公开的方法获取数据了;
6.PHP内置函数参考
<1>操作数组
range('D','A'): 快速创建一个数字/字符数组;
count($arr): 返回数组长度
min/max/array_sum($arr): 返回最值/和值
array_count_values($arr): 返回关联数组,为$arr中每个值出现的次数
explore(",",s,5): 用","分割字符串s,最多返回5个元素构成一个数组
implode(",",arr): 用","合并数组arr,构成一个字符串
排序: *shuffle($arr)改变键值对关系,随机乱序
*sort/rsort($arr): 升/降序,改变键值对关系
asort/arsort($arr): 排序并保持原键值关系
natsort/natcasesort($arr): 保持 [a-zA-Z]和数字 的自然顺序,img2操作字符串(mb_前缀方法用于处理gb2312的字符集)#大括号中的方法为不区分大小写的操作;
strlen(s): 返回串的字节长度(utf8的常用中文占3个字节)
ltrim/rtrim/trim(s): 去掉左|右|两端空格
substr(s,start,len): 从start位置开始,截取len个字符,start为负数表示从末尾开始数,len为负数截取到倒数第len个字节[省略直到尾]
str_replace(x,y, s [,cnt]): {str_ireplace} 把s中x->y,cnt统计替换了几处;
strtr(s,x,y): 等量替换,x,y去最短的,从左到右字符一一对应,在s中全部替换;
substr_replace(s,y,start[,len]):把s中从start开始取len长度的串替换成y
strtok(s,sep): 用sep串把s分割,返回s中sep的前部分
strpos(s,x[,start]): {stripos} 从start位置开始搜索,返回x在s中第一次出现的位置|false
strstr|strchr(s,x): {stristr} 返回s中x及后面的串,若x在s中不存在,返回false
strcmp(x,y): {strcasecmp} 分别返回-1,0,1表示xy;
strrev(s): 返回翻转的s
str_repeat(s,n): 返回重复了n次的s;
nl2br(s): 把s中的\n替换成
chr(n): 返回n代表的ASCII字符
strtolower/strtoupper(s): 转为小/大写
ucfirst/ucwords(s): 返回第一个字符大写/单词首字母大写 的串;
explode(",",s,5): 用","分割字符串s,最多返回5个元素构成一个数组
implode(",",arr): 用","合并数组arr,构成一个字符串
strip_tags(s): 去除s中的html,xml,php标记
htmlspecialchars(s)/htmlspecialchars_decode(s): Html字符实体化|逆实体化
<3>操作时间
date(format [,stamp]): 返回格式化后的时间;
格式化占位: 默认使用UTC时间,php.ini:date.timezone=PRC; 或 date_default_timezone_set("Asia/Shanghai");
年: Y,y 4位|2位显示
月: m,n,M 2位补0|不补0|英文缩写
日: d,j 2位补0|不补0
星期: w,D,l 数字0-6|英文缩写|英文全称
时: H,G,h,g 大写表示24小时,h补0,g不补0
分: i 2位补0
秒: s 2位补0
t: 该日期所在月有几天
z: 该日为该年第几天
T: 本地时区
L: 判断是否闰年1|0;
getdate(): 返回时间信息数组
time(): 返回当前时间戳/秒 60*60*24
mktime(时,分,秒,月,日,年): 自动校正越界输入,返回时间戳,当前时间差计算:mktime(0,0,0,date('m'),date('d')+99,date('Y'));
checkdate(月,日,年): 判断是否为有效日期true|false
<4>数学函数
ceil(x)/floor(x)/round(x,precision)/intval(s): 上/下/舍入/截 取整
abs(x)/sqrt(x)/pow(x,y): |x|,平方根,x^y
exp(x),log(n,base=e): e^x 以base为底N的对数
rand(x,y): 返回[x,y]之间的随机数
max/min(args...): 返回最值
decbin/bindec(x): 十进制 <-> 二进制
dechex/decoct(x): 十进制 -> 十六/八 进制
base_convert(x,frombase,tobase): 把x从from转换到to进制
<5>其他工具
isset($x): 如果变量被定义 且 值不为NULL 返回true;
empty($x): 如果变量为定义 或 值为 "","0",0,NULL,false,空数组,没任何成员的对象;
unset($x): 取消当前域中的变量(global $x 外面的$x不会被取消)
is_*($x): 判断变量类型,其中*: string,int,float,bool,null,array,object,numeric,resource,integer,long,real;
settype($x,"*"): 把$x转型成*类型;
eval("php"): 以极低的效率执行脚本,应该禁用该函数保持服务器安全