【PHP】PHP入门基础

[目录]
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中不可用)
		数组运算符: +(合并运算,不覆盖相同键), ==/!=或<>(是否同键值对), ===(同键值对,同类型,同顺序),

	迭代器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
		<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_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<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会为数组维护一个指针,提供了指针操作API
		key()/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长度的串替换成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表示x<y,x===y,x>y;
	strrev(s): 						返回翻转的s
	str_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,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"): 		以极低的效率执行脚本,应该禁用该函数保持服务器安全
	

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值