代码回忆录:PHP随笔

来源:互联网 发布:linux怎么查看gpu型号 编辑:程序博客网 时间:2024/05/22 00:48
[目录]1.语法基础2.面向对象编程(OOP)3.超全局变量交互4.文件与目录5.数据库编程6.PHP内置函数参考============================================1.语法基础界定符: 尾界定符前自动添加分号;<?php //,#行注释 ?>(默认)<script language="php" /><? /*块注释*/ ?>(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中不可用)数组运算符: +(合并运算,不覆盖相同键), ==/!=或<>(是否同键值对), ===(同键值对,同类型,同顺序),迭代器FOREACHforeach($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对象则创建;必须保证此行代码前没有任何字符输出到Clientsession_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();#省略这行会删除客户端sessionidsetcookie(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.typesheader("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的输出缓冲是关闭的,打开缓冲后,先输出到缓冲,等脚本执行完毕再输出到clientob_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<form action="upload.php" method="POST" enctype="multipart/form-data"><input type="hidden" name='MAX_FILE_SIZE' value="1024" /> <!-- 最大字节数 --><input type="file" name="files[]" accept="image/*" multiple /></form>在_FILES中:name: 原文件名,tmp_name: 临时文件名, size:字节数, type:MIME类型error: 0 上传成功1 文件大小超过php.ini:upload_max_filesize2 文件大小超过隐藏域 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() 返回自增iddelete,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();#返回一行|nullnum_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#mysqlextension=php_pdo_oci.dll#oracleextension=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语句的自增IDprepare($sql); 返回预编译PDOStatement结果查询对象PDOStatement类方法说明setFetchMode(PDO::FETCH_ASSOC);#设置行返回类型,0混合数组(默认),1|2关联数组,3索引数组fetch([PDO::FETCH_ASSOC]);#返回一行|falsefetchAll()#返回二维数组,游标移动到结果集末尾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<img10;保持原键值关系ksort/krsort($arr): 根据键值排序,保持原键值关系;array_reverse($arr): 翻转数组array_unique($arr): 对数组值去重(连带键会被删除)搜索:in_array($e,$arr): 判断$e是否是$arr中的某个值array_key_exists($k,$arr): 判断$arr中是否存在键$k;array_search($e,$arr): 返回$e的 索引 或 false;array_keys($arr [,$val]): 返回键名数组 或 $val的键名数组array_values($arr): 返回值数组;list($var1,$var2)=$arr; : 把 索引数组 $arr按顺序赋值给一些变量;extract($arr): 根据关联数组生成一些变量 , 键为变量名;compact('var1','var2','var3'): 根据一些变量生成关联数组,键为变量名;数组指针: PHP会为数组维护一个指针,提供了指针操作APIkey()/current(): 返回当前指向的键值(初始为第一个)prev()/next(): 移动并返回值 或 false;reset()/end(): 移动到 首尾 并返回其值;each();返回一个描述当前指向元素的数组描述;<2>操作字符串(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长度的串替换成ystrtok(s,sep): 用sep串把s分割,返回s中sep的前部分strpos(s,x[,start]):{stripos} 从start位置开始搜索,返回x在s中第一次出现的位置|falsestrstr|strchr(s,x):{stristr} 返回s中x及后面的串,若x在s中不存在,返回falsestrcmp(x,y):{strcasecmp} 分别返回-1,0,1表示x<y,x===y,x>y;strrev(s): 返回翻转的sstr_repeat(s,n): 返回重复了n次的s;nl2br(s):把s中的\n替换成<br/>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,j2位补0|不补0星期: w,D,l 数字0-6|英文缩写|英文全称时:H,G,h,g 大写表示24小时,h补0,g不补0分:i2位补0秒:s2位补0t:该日期所在月有几天z:该日为该年第几天T:本地时区L:判断是否闰年1|0;getdate(): 返回时间信息数组time(): 返回当前时间戳/秒 60*60*24mktime(时,分,秒,月,日,年): 自动校正越界输入,返回时间戳,当前时间差计算: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^yexp(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"): 以极低的效率执行脚本,应该禁用该函数保持服务器安全


原创粉丝点击