PHP系列学习教程

PHP系列学习教程

【转载】PHP语言里一些危险的预定义函数

编程Kyhvedn 发表了文章 • 2 个评论 • 639 次浏览 • 2016-09-22 18:06 • 来自相关话题

phpinfo()
功能描述:输出PHP环境信息以及相关的模块、WEB环境等信息。
危险等级:中

passthru()
功能描述:允许执行一个外部程序并回显输出,类似于 exec()。
危险等级:高

exec()
功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。
危险等级:高

system()
功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。
危险等级:高

chroot()
功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式
PHP 时才能工作,且该函数不适用于 Windows 系统。
危险等级:高

scandir()
功能描述:列出指定路径中的文件和目录。
危险等级:中

chgrp()
功能描述:改变文件或目录所属的用户组。
危险等级:高

chown()
功能描述:改变文件或目录的所有者。
危险等级:高

shell_exec()
功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。
危险等级:高

proc_open()
功能描述:执行一个命令并打开文件指针用于读取以及写入。
危险等级:高

proc_get_status()
功能描述:获取使用 proc_open() 所打开进程的信息。
危险等级:高

error_log()
功能描述:将错误信息发送到指定位置(文件)。
安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,
执行任意命令。
危险等级:低

ini_alter()
功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。
具体参见 ini_set()。
危险等级:高

ini_set()
功能描述:可用于修改、设置 PHP 环境配置参数。
危险等级:高

ini_restore()
功能描述:可用于恢复 PHP 环境配置参数到其初始值。
危险等级:高

dl()
功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。
危险等级:高

pfsockopen()
功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。
危险等级:高

syslog()
功能描述:可调用 UNIX 系统的系统层 syslog() 函数。
危险等级:中

readlink()
功能描述:返回符号连接指向的目标文件内容。
危险等级:中

symlink()
功能描述:在 UNIX 系统中建立一个符号链接。
危险等级:高

popen()
功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。
危险等级:高

stream_socket_server()
功能描述:建立一个 Internet 或 UNIX 服务器连接。
危险等级:中

putenv()
功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数
修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。
危险等级:高

assert()
功能描述:如果按照默认值来,在程序的运行过程中调用assert()来进行判断表达式,遇到false时程序也是会继续执行的,跟eval()类似,不过eval($code_str)只是执行符合php编码规范的$code_str。assert的用法却更详细一点。
危险等级:高

禁用方法如下:
打开/etc/php.ini文件,
查找到 disable_functions ,添加需禁用的函数名,如下:
phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen,assert
 
温馨提示:php的eval函数并不是系统组件函数,因此我们在php.ini中使用disable_functions是无法禁止它的,所以说使用disable_functions禁止掉eval的方法都是错误的。但是eval()对于php安全来说具有很大的杀伤力。
如果想禁掉eval可以用php的扩展 Suhosin:
安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on即可。
php的eval函数在php中是无法禁用的,因此我们也只有使用插件了。
 
原文地址:http://www.jb51.net/article/29750.htm
          http://www.jb51.net/article/51670.htm
 
白衣行侠,轻剑快马 查看全部
phpinfo()
功能描述:输出PHP环境信息以及相关的模块、WEB环境等信息。
危险等级:中

passthru()
功能描述:允许执行一个外部程序并回显输出,类似于 exec()。
危险等级:高

exec()
功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。
危险等级:高

system()
功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。
危险等级:高

chroot()
功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式
PHP 时才能工作,且该函数不适用于 Windows 系统。
危险等级:高

scandir()
功能描述:列出指定路径中的文件和目录。
危险等级:中

chgrp()
功能描述:改变文件或目录所属的用户组。
危险等级:高

chown()
功能描述:改变文件或目录的所有者。
危险等级:高

shell_exec()
功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。
危险等级:高

proc_open()
功能描述:执行一个命令并打开文件指针用于读取以及写入。
危险等级:高

proc_get_status()
功能描述:获取使用 proc_open() 所打开进程的信息。
危险等级:高

error_log()
功能描述:将错误信息发送到指定位置(文件)。
安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,
执行任意命令。
危险等级:低

ini_alter()
功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。
具体参见 ini_set()。
危险等级:高

ini_set()
功能描述:可用于修改、设置 PHP 环境配置参数。
危险等级:高

ini_restore()
功能描述:可用于恢复 PHP 环境配置参数到其初始值。
危险等级:高

dl()
功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。
危险等级:高

pfsockopen()
功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。
危险等级:高

syslog()
功能描述:可调用 UNIX 系统的系统层 syslog() 函数。
危险等级:中

readlink()
功能描述:返回符号连接指向的目标文件内容。
危险等级:中

symlink()
功能描述:在 UNIX 系统中建立一个符号链接。
危险等级:高

popen()
功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。
危险等级:高

stream_socket_server()
功能描述:建立一个 Internet 或 UNIX 服务器连接。
危险等级:中

putenv()
功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数
修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。
危险等级:高

assert()
功能描述:如果按照默认值来,在程序的运行过程中调用assert()来进行判断表达式,遇到false时程序也是会继续执行的,跟eval()类似,不过eval($code_str)只是执行符合php编码规范的$code_str。assert的用法却更详细一点。
危险等级:高

禁用方法如下:
打开/etc/php.ini文件,
查找到 disable_functions ,添加需禁用的函数名,如下:
phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen,assert
 
温馨提示:php的eval函数并不是系统组件函数,因此我们在php.ini中使用disable_functions是无法禁止它的,所以说使用disable_functions禁止掉eval的方法都是错误的。但是eval()对于php安全来说具有很大的杀伤力。
如果想禁掉eval可以用php的扩展 Suhosin:
安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on即可。
php的eval函数在php中是无法禁用的,因此我们也只有使用插件了。
 
原文地址:http://www.jb51.net/article/29750.htm
          http://www.jb51.net/article/51670.htm
 
白衣行侠,轻剑快马

php学习笔记

编程Kyhvedn 发表了文章 • 4 个评论 • 636 次浏览 • 2016-09-17 15:20 • 来自相关话题

0x00 PHP简介
定义:
1)服务器端的语言
只会在服务器端运行。
2)嵌入到HTML中的语言
在HTML中嵌入PHP需要在服务器中先运行完成,如果执行后有输出,则输出的结果字符串会嵌入到原来PHP代码处,和HTML代码一起响应给客户端(浏览器)去解析。
3)脚本语言
脚本语言又称为动态语言。脚本通常以文本形式保存,只在被调用时进行解释或编译。
PHP保存在服务器端的,收到请求时才由Web服务器中安装的PHP应用模块解析,并从上到下一步步执行程序。

环境搭建
XAMPP 多系统+Apache+mysql+PHP+perl 一键搭建工具

0x01 PHP的作用
1.收集表单数据
2.生成动态网页
3.字符串处理
4.动态输出图像
5.处理服务器端文件系统
6.*编写数据库支持的网页
7.会话跟踪控制 cookie
8.处理XML文件
9.支持利用大量的网络协议
0.服务器端的其他相关操作

0x02 基本语法
PHP语言标记
<?php ...... ?>
<? ...... ?>——简写方式
指令分隔符——每一条语句后面使用";"结束

注释
//单行注释
/ 多行注释 / 注释掉的内容会变成一个空格,可以充当空格
/* /多行文档注释 方便PHPDocument生成文档

0x03 变量和变量类型
PHP中最基本的数据存储单元就是变量和常量,可以存储不同类型的数据。
PHP是弱类型语言,变量类型由空间里的值决定。
定义:$name=value或var name=value

变量命名规则:
1-数字 字母 下划线组成
2-不能以数字开头
3-不能使用默认关键字
4-见名知意
5-驼峰命名法

引用赋值
类似C语言的指针,相当于给一个变量起一个别名,通过这两个名字访问到的是同一块内存。
$a=10;
$b=&$a;
$a=20; //此时b的值是20,如果没有引用赋值b的值仍为10。

变量类型
局部变量(从定义开始到函数结束)
全局变量(从定义开始到脚本运行结束) 关键字是global
静态变量(使用static声明,作用域不变但生命周期变长)

0x04 数据类型
标量:布尔型(true or false)、整型、浮点型、字符串
复合类型:数据、对象
特殊类型:resource、NULL
标量:
1.布尔型——以下值会被认为false
——布尔值false
——整型值0
——浮点值0.0
——空白字符串和字符串“0”
——没有成员的变量数组
——没有单元的对象(仅仅适用php4)
——NULL
2.整型
十进制整数、八进制整数如010、十六进制整数如0x10。
php不支持无符号整数。
整型变量的最大值和OS(操作系统)有关。
3.浮点型
表示方式:1.234、1.2e3、7E-10
浮点型存储在内存中是近似值
永远不要去比较两个浮点数的大小!
4.字符串
单引号:
单引号里不能嵌套单引号,要表达一个单引号自身,需要在前面加个反斜线<\>来转义。
要表达一个反斜线自身,则要用两个反斜线(\\)。
在单引号中的变量转义不能被解析,会原样输出。
定义简单的不带变量的字符串使用单引号效率更高。
双引号:
可以使用转义字符,可以解析变量。
界定符
格式:<<<EOT   EOT
界定标记也要遵循命名规范
第一个界定符(EOT)后面不能跟空白符,第二个界定符前面也不能有空白符。
伪类型
伪类型不是PHP的基本数据类型,因为PHP是弱类型语言,所以在一些函数中一个参数可以接受多种类型的数据,还可以接受别的函数作为回调函数。

#数据转换
——自动转换类型
——强制转换类型
int() 整型
bool() 布尔型
float() 浮点型
string() 字符串
array() 数组
object() 对象
——变量类型检测函数
is_*()

0x05 常量
格式:define(name,value)
defined() 函数检查某常量是否存在
define() 函数定义一个常量 
constant() 函数返回常量的值
只能通过define()定义,不能语句赋值。
一旦被定义就不能重新定义或者取消定义,直到脚本运行结束。
常量只能是标量。
对大小写敏感,但以大写居多。
系统预定义常量都是大写。
常量可以在任何地方定义和访问。
常见系统预定义常量:PHP_OS、PHP_VERSION、TRUE、FALSE、NULL、M_PI(π)
变量

魔术常量
这五个变量会根据他们使用的位置而改变。
__FILE__(当前文件名)、__LINE__(当前行数)、__FUNCTION__(当前函数名)、__CLASS__(当前类名)、__METHOD__(当前对象的方式名)

0x06 运算符
算数运算符:+、-、*、/、%(取余)
取余运算符使用时所有参数都是整型
赋值运算符:=、+=、-=、*=、/=、%=
字符串运算符:.(串接)、.=(串接赋值)
递增递减运算符:++$a/$a++(前递增/后递增——运算返回的顺序不同)、--$a/$a--(前递减/后递减)
比较运算符:==、===(全等)、!=、<>(不等于,等同于!=)、!==(完全不等)、>、<、>=、<=
逻辑运算符:and、or、xor(异或)、&&、||、!

0x07 分支与循环结构
分支结构
if、elseif、switch、while if、do while
循环结构
for do
是否存在顺序、分支、循环结构是判定为一门语言的标准。

0x08 函数
函数是被命名的,每个函数都有唯一的名称。
函数调用指的是在程序的其他部分使用该名称可以执行函数中的语句。
函数是独立的,无需程序其他部分干预,可以独立执行。
函数可以将一个返回值返回给调用它的程序。

常用函数
empty():判断一个变量是否为空
isset():检测一个变量是否设置
unset():释放指定变量
exit():函数输出一条消息,并退出当前脚本

自定义函数
语法
function {
    函数本体;
    return 返回值;
}

函数调用:
无参数无返回
函数名();
有参数无返回
函数名(参数);
无参数有返回
$result=函数名();
有参数有返回
$result=函数名(参数);

func_num_args()   返回被调用函数的传入参数个数,类型是整型
func_get_arg()    返回指定的参数值
func_get_args()   返回全部参数的值,类型是数组

var_dump()
判断一个变量的类型与长度,并输出变量的数值,如果变量有值输出的是变量的值并返回数据类型。
此函数显示关于一个或多个表达式的结构,包括表达式的类型与值。数组将会递归展开,通过缩进显示其结构。
print_r($arr1)  输出数组 

include_('test2.php');  调用文件
include_once('test2.php');  仅调用一次,不会出现重复调用的错误

#require和include的区别
require 的使用方法如 require("file.php"); 
通常放在PHP程序的最前面,程序执行前就会先读入require所指定引入的文件,使它变成PHP程序网页的一部份。常用的函数亦可以这个方法将它引入网页中。
include 使用方法如 include("file.php"); 
一般是放在流程控制的处理部分中。PHP程序网页在读到include的文件时,才将它读进来。这种方式可以把程序执行的流程简单化。
_once 后缀表示已加载过的部分不加载。
require之所以放在最前是因为出错就停止运行代码,而include会报错并继续执行。
 
0x09 数组
PHP创建数组不需要指定大小和类型
数组键既可以用系统顺序,也可以自行定义。

数组分类
索引数组:键值为整型。
关联数组:键值为字符串。

数组定义
PHP中定义数组有两种方式:
1)直接为数组元素赋值——比如$array[0]="张三";$array[1]="男";$array["age"]=10;
2)使用array()函数声明——比如$arr1=array(1,2,'name'=>'zhangsan'......);
如果不使用符号"=>"默认为索引数组。
数组打印:使用print_r()或者var_dump()

0x0a 数组遍历
1-使用for循环结构遍历数组
前提是必须是键值连续的索引数组
for($i=0;$i<count($array);i++){} 
count($array) 输出数组元素个数

2-使用foreach语句遍历数组
第一种语法:
foreach($arr as $value){}
第二种语法:
foreach($arr as $key=>$value){} 变量的值与名字没有任何关系,只与所处位置有关,特定位置决定特定值

3-联合使用list()、each()、while循环遍历
each()
需要传递一个数组作为参数,返回数组中当前元素的键值对,并向后移动数组指针到下一个元素的位置。
键值对被返回的是带有四个元素的关联和索引混合的数组,键名为0、1、key、value,0、key的值相同,1、value的值相同。
list()
它并不是真正的函数而是PHP的语言结构。
list仅能用于以数字为键的数组并且假定从0开始。
语法:list($key,$value)=$arr
综合:while(list($key,$value)=each($arr)){}
再次使用之前要调用reset()

4-使用数组的内部指针控制函数遍历数组
数组内部指针是数组内部机制,指向数组的某个元素。
默认指向第一个元素,通过移动或改变指针的位置,可以做到访问数组中的任意元素。
next($arr1)  指针位置后移一个单位
prev($arr1)  指针位置前移一个单位
end($arr1)   指针位置移到最后
reset($arr1) 指针无条件移到第一个单位
current($arr1)  读取当前指向的值
key($arr1)      指针指向的内容的键

0x0b 预定义数组
$_GET   通过HTTP GET(URL请求)提交到脚本的变量 
$_POST  通过HTTP POST提交到脚本的变量 
$_REQUEST  通过GET、POST和Cookie机制提交到脚本的变量 
$_FILES  通过HTTP POST文件上传提交到脚本的变量 
$_COOKIE 通过HTTP Cookie提交到脚本的变量
$_SESSION  当前注册脚本会话的变量
$_SERVER 由WEB服务器设定,或直接和当前脚本的执行环境关联的变量 
$GLOBALS 当前脚本有效的变量都会显示,全局脚本

0x0c 数组的键值操作
array_values()  返回数组中所有的值,取出来形态为一个数组
array_keys()    返回数组中所有的键名,取出来形态为一个数组
in_array()      检查数组中是否存在指定的值,参数1为指定的值,参数2为被检查的数组,参数3为如果设置为true——区分大小写、判断是否值与类型都相等
array_search()  在数组中搜索给定的值,如果成功则返回相应的键名
array_flip()    交换数组中的键名和对应的键值
array_reverse() 将原数组中的元素顺序翻转,创建为新的数组并返回,参数1为数组名,参数2如果为true的话键名不变,否则键名丢失

0x0d 统计数组元素个数和唯一性
count()   返回数组中元素的数目
array_count_values()   统计数组中所有值出现的次数
array_unique()   删除数组中重复的值

0x0e 使用回调函数处理数组
array_filter()  用回调函数过滤数组中的元素,参数1为被操作的数组,参数2为定义一个回调函数
回调函数格式:
array_filter($arr1,function fun($value){          //回调函数的参数为数组的值
                            if(判断条件){
                                return true;
                                }
                                return false;});

array_walk()    对数组中的每一个元素使用回调函数,参数1为被操作的数组,参数2为定义一个回调函数(遍历数组里的元素),参数3为给回调函数的额外一个值(若echo,紧跟回调函数结果后面)
回调函数格式:
array_walk($arr1,function fun($value,$kay,$var3){      //回调函数的参数-$value为数组的值,$key为数组的键,$var3为array_walk()的参数3
    echo $value;
    echo $kay;
    echo $var3;
},'abc');  

array_map()     将自定义函数应用给定数组的每个值并返回新的值,参数1为回调函数名,从参数2开始为被操作的数组名(至少一个数组)
回调函数格式:
array_map(function fun($a,$b){   //回调函数的参数即是被操作的数组
            return $a*$b;
    },$a,$b);
0x00 对数组的操作
拆分、合并、分解和接合
array_slice()  截取某个范围的元素
示例-array_slice($arr1,2,3,false);  参数1为原数组,参数2为以此开始的元素序号,参数3为长度(0表示无元素,1表示本身,从2开始从参数2本身往后数的元素个数,负数是从后往前数到本身为止),参数4为是否保留键名(布尔值true-保留 or false-从0开始)
array_splice()  替换选中的元素
示例-array_splice($arr1,1,-1,$arr3);  参数1为原数组,参数2为以此开始的元素序号,参数3为长度(0表示无元素,1表示本身,从2开始从参数2本身往后数的元素个数,负数是从后往前数到本身为止),参数4为进行替换的数(也可以为数组)
array_combine()  合并两个数组为一个新的数组,参数1为作为key的数组,参数2为作为value的数组(如果参数为关联数组的话会使用值而不使用键)
array_merge()    把一个或多个数组合并为一个数组  参数1-n为数组名
array_intersect()  多个数组的交集
array_diff()       多个数组的差集(反交集)

0x0f 数组和数据结构
栈的实现——先进后出
array_push()  将元素放入数组尾部 参数1为数组名,参数2-n为入栈元素
array_pop()   从数组尾部删除元素 参数1为数组名

队列的实现——先进先出
array_shift($arr);  从头部删除元素
array_unshift($arr); 从头部添加元素

其他函数
range(0,123456,2);   返回一个包含指定范围的数组 参数1为最小值,参数2为最大值,参数3为元素值的间隔大小(步长)
array_rand()  从数组中随机选出一个或多个元素 参数1为数组名,参数2为随机元素的个数

0x02 字符串
字符串string:一个字符串由一系列的字符组成,每个字符等同于一个字节。这就意味着PHP只能支持256种的字符集,因此不支持Unicode。
定义一个字符串的最简单的方法是用单引号把它包围起来。
格式:$string='';

常用字符串
ltrim()  删除字符串左侧的空格符或其他的预定义字符
rtrim()  删除字符串右侧的空格符或其他的预定义字符
trim()   删除字符串两侧的空格符或其他的预定义字符
str_pad($str1,10,'x',STR_PAD_BOTH)  将字符串填充为新的长度,参数1为原字符串,参数2为处理后的长度,参数3为要填充的字符(不填默认为空格符),参数4位填补方向-STR_PAD_BOTH/LEFT/RIGHT
strtolower()  字符串转小写
strtoupper()  字符串转大写
strcmp()      比较两个字符串
ucfirst()  字符串首字母大写
ucwords()  字符串每个单词首字母转大写(以空格符分隔)
number_format 数字千位分割
strrev()  翻转字符串
md5()  字符串MD5加密

0x10 正则表达式
正则表达式作为一个字符串匹配的模板,是由元字符、特殊功能字符和模式修正符三部分组成。

界定符
格式:/  /,但除了字母、数字和反斜线以外,任何字符都可以作为界定符,如# ! {} ||

元字符
元字符是正则表达式的最基本组成单位。
*!所有的表示形式都是匹配一个字符。
类型有:普通字符(0-9、a-z、A-Z)、一些特殊字符(任何一个字符都可以作为元字符,但是前提是有特殊意义的字符要使用转义字符反斜线)、非打印字符或自定义元字符表。
非打印元字符
\cx     匹配由x指示的控制字符。如\cM指匹配回车符(Control-M)。x范围是A-Z或a-z之间。如果不在该范围之内,则指代“c”本身。
\f   换页符匹配。等效\x0c和\cL。
\n     换行符匹配。等效\x0a和\cJ。
\r     匹配一个回车符 。等效于\x0d和\cM。
\t     制表符匹配。等效\x09和\cI。
\v     垂直制表符匹配。等效\x0b和\cK。
\s   匹配任何空白字符,相当于[\f\n\r\t\v] 。
\S   匹配任何非空白字符,相当于[^\f\n\r\t\v]-[^\s]
\d   匹配0到9之间的单个数字,相当于[0-9]
\D   匹配非0到9的一个字符,相当于 [^0-9]-[^\d]
\w   匹配a到z、A到Z及数字0到9以及下划线之间的任意一个字符,相当于 [a-zA-Z0-9_] 
\W   匹配非a到z、A到Z及数字0到9以及下划线的任意一个字符,相当于 [^a-zA-Z0-9_]-[^\w]
自定义元字符表-格式为[suiyi]。

限定符
加在元字符后面可以同时匹配多个字符。
*  匹配0到多个,相当于 {0,n} 
?  匹配0到1个,相当于 {0,1} 
+  匹配至少1个,相当于 {1,n} 
\b 匹配单词边界 
^ 字符串必须以指定的字符开始 
$ 字符串必须以指定的字符结束 
{n}  匹配n个
{n,} 匹配至少n个
{m,n} 匹配m到n个
 
0x11 面向对象
对象概念是面向对象技术的核心。
在显示世界里我们所面对的事情都是对象,如计算机、键盘、显示屏等。
在面向对象的程序设计中,对象是一个由信息和对信息进行处理的动作所组成的整体。

0x12 面向对象模型
什么是类:
类是具有相同属性和方法的一组对象的集合。
静态特征称为属性(变量),动态行为称为方法(函数)。
类为属于该类的对象做了一个统一的抽象描述,编程语言中类是一个单独的程序,命名类时(见名知意)应包括属性的说明和行为。

什么是对象:
对象是系统中描述客观事件的一个实体,是构成系统的一个基本单位。
一个对象由一组属性和对属性进行操作的一组行为组成。
从抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象。
对象反映该事物在系统中保存的信息和发挥的作用,它是一组属性和对这些属性操作的行为的一个封装体。
客观世界是由对象和对象之间的联系组成的。

对象的主要三个特性
对象的行为:可以对对象施加的操作。
对象的形态:当施加方法的时候对象如何响应。
对象的表示:对象的表示是唯一表示,具体区分在相同的属性与行为下有什么不同。

类和对象的关系:
类与对象的关系就如模具和铸件的关系,类的实例化就是对象,而对对象的抽象就是类,类描述了一组具有相同属性和行为的对象。
对象是实际存在的,占有动态资源。类是对象的集合,可能占有静态资源,属性占有动态资源。

0x13 定义类和对象
定义类:
class name [可选属性]{
$property=value;  //类的属性
......
function name($arg){   //类的方法
......} 
}
方法的参数可以是基本数据类型、数组和类对象。
基本数据类型和数组:值参传递
类对象:引用传递

生成对象(类的实例化):$对象名=new classname( );
直接调用类方法/变量:class::$name/function

0x14 访问类型
public 公共的(公共修饰符)  类内部与类外部都可以访问
private 私有的(私有修饰符) 只能在类内部访问
protected 受保护的(保护成员修饰符) 子类可以访问,类外部不可以访问
一般来说将类private更符合现实的逻辑。
内部类可以访问类外部的任何成员,包括private成员也可。 
类外部访问内部类成员需要创建内部类的对象,之后可以访问内部类的任何成员。

静态属性和方法
关键字static,用来声明静态属性和静态方法。
在类内部生成一个静态变量或方法能够被所有类的实例化,也就是说静态成员在类第一次被加载的时可以让堆内存里面的每个对象所共享。
静态属性必须在内部就被赋值。
内部声明方法:self::$name/name(属性/方法)
示例:
class name{
public static $name='Kevin';
public static function class(){
    echo "I am".self::$country;
    self::PI;    //访问常量
    //echo $this->name;X 在静态方法中只能操作静态属性
    //self::p();X
}
}
外部调用:类::$静态属性、类::静态方法
需要注意的是非静态类内部不能有静态成员。 

0x15 构造函数和析构函数
构造函数:在类中起到初始化的作用。
构造函数的生成方法与其他函数一样,只是其名称必须是__construct().
语法:
function __construct($name,$size......){
$this->name=$name;
$this->size=$size;
......
}
对象使用类的属性
在一个类中,可以利用特殊指针$this。
在类的内部访问属性时用$this->name=$name
$this指代对象(调用者)本身,此做法可以对调用者进行过滤和控制。

析构函数
当对象脱离其作用域时(例如对象所在的方法已调用完毕),系统自动执行析构函数。
一般应在结束前在析构函数中释放内存、关闭文件、释放结果集等等。
析构函数没有任何参数。
语法:
function __destruct(){
    ......
    } 

三个重要特性————封装、继承和多态​
0x16 封装
封装性:封装性就是把对象的属性和行为综合成一个独立的单位。
封装一个类需要两步,第一步是将类私有化,第二步是用__set和__get进行读取和赋值的操作。
好处是:隐藏类的具体细节,方便加入逻辑控制,限制对属性的不合理操作,便于修改和增强代码的可维护性。

__get与__set
这两个函数都是系统预定义,进行读取与赋值操作。
__set 设置值通常是域的值
__get 获取值通常是域的值
__call 调用一个对象中不存在的方法时,就会产生错误,用call()处理这种情况。

0x17 继承
概述
子类B的对象拥有父类A的全部属性和方法,叫做B类对A类的继承。
假如一个类从多个类中继承了属性与服务,此为多继承。
通常称继承类为子类,被继承类为父类。
PHP中只有单继承,但一个父类可以被多个子类继承,一个子类只能有一个父类,但是允许关联继承。

extends声明继承关系
语法:
class B extends A{}   B类继承A类
类的外部访问对子类是有效的。
final表示这个类是最终版本,也就是说它不能再被子类调用。

子类与父类
子类继承父类的所有内容,但父类中的private部分不能直接访问。
子类中新增加的属性和方法是对父类的扩展。
子类中定义的与父类的同名的属性和方法是对父类属性和方法的覆盖。

重写的方法
在子类中,使用parent访问父类中的被覆盖的属性和方法。
parent::__construce();
parent::$name;
parent::fun();

对象比较
==  比较两个对象的内容。
=== 比较对象的句柄,即引用地址。

0x18 多态性
多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的方法。
这种特性使得同一个属性或方法在父类及其各个子类中具有不同的含义。
也就是说同一种方法在子类与父类中执行的结果不同。
instanceof 用来判断对象是否属于某一个类的类型,如果属于返回true,不属于返回false
示例:
class A {
function info(){
echo "A info";
}
}
class B extends A {
function info(){
echo "B info";
}
}
class C extends A {
function info(){
echo "C info";
}
}
function printinfo($obj){
if($obj instanceof A)
$obj->info();
}
$a=new A();
$b=new B();
$c=new C();
printinfo($a); //输出A INFO
printinfo($b); //输出B INFO
printinfo($c); //输出C INFO

0x19 抽象类和接口
抽象类
抽象方法是作为子类的模板使用。
语法:
abstract class Person{
public $name;
abstract function getInfo();
}
抽象类不能被实例化,一个抽象类中必须有一个抽象方法。
任何一个类,如果至少有一个方法是被声明为抽象的,那么这个类就必须也被声明为抽象的。
但是抽象类中可以定义动态函数。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。

接口
当一个类继承了一个接口之后,它要覆盖接口的所有方法。
接口只能声明常量,接口的方法必须定义为共有public,否则无法继承,接口可以与多个接口间继承。
接口的方法不能有函数体。
接口不能实例化。
抽象类和接口都是为继承做准备的。
语法:
interface PCI{
const TYPE="PCI";
function start();
function stop();
}
接口中的方法可以声明为static
interface A{
    function a();
}
interface B{
    function b();
}
interface C extends A{ 
    function c();
}
class D implements B,C{
function a(){}
function b(){}
function c(){}
}
implements是一个类继承一个接口用的关键字,用来实现接口中定义的抽象方法。

抽象类和接口的区别:
接口可以被多重implements,而抽象类只能被单一extends。
接口只有定义,抽象类可以有定义和实现。
接口的字段定义默认为:public、static、final, 抽象类字段默认是"protected"。
 
0x1a 文件系统处理
概述
任何数据都是在程序运行期间才加载到内存中的,不能永久保存。
需要将数据长久保存通常有两种方式:保存到普通文件中或者数据库中。
文件(资源——可以存入数据库,存入的数据为资源路径)、数据库(信息资源-数据-内容巨大)

——文件类型
php是以UNIX的文件系统为模型的。
文件后缀名无关紧要(都可以运用对应的软件打开),重要的是本身的内容。
在Windows只能获取file,dir和unknow三种类型。
在Linux/Unix下,可以获取block,char,dir,fifo,file,link,unknown7种。

block:块设置文件,如磁盘分区、软驱、光驱cd-rom等。
char:字符设备,I/O(输入输出)传输过程中以字符为单位进行传输的设备,例如键盘、打印机等。
dir:目录类型,目录也是文件的一种/目录文件。
fifo:信息管道,常用于将信息从一个进程传输到另一个进程。
file:普通文件类型,如文本文件、可执行文件等。
link:符号链接,指向文件的指针,相当于windows下的快捷方式。
unknown:未知类型。
php可以使用filetype()函数来获取文件类型。
判断是否为某类文件:is_file()、is_dir()、is_link......

0x1b 文件属性
1)文件属性处理函数
file_exists()    判断文件是否存在,存在返回true,不存在返回false
filesize()       返回文件大小,返回文件大小的字节数,出错返回false。目录文件不会返回文件大小,返回值为0。
is_readable()    判断文件是否可读,存在且可读返回true
is_writeable()   判断文件是否可写,存在且可写返回true
is_executable()  判断文件是否可执行,存在且可执行返回true
filectime()      返回文件创建时间,unix时间戳(从1970年1月1日开始至今所经过的秒数)
filemtime()      返回文件修改时间,unix时间戳
fileactime()     返回文件最后访问时间,unix时间戳
stat()           返回关于文件的信息的数组,出错返回 false,并且发出一条警告。

bool rename(string $oldname,string $newname,[resource $context])
尝试把$oldname重命名为$newname。成功时返回TRUE,失败则返回 FALSE。
例如:rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");

0x1c 目录的基本操作
使用php脚本可以方便地对服务器中目录进行操作,包括创建、遍历、复制、删除等操作。

解析目录路径(url)
绝对路径
$filePath='C:/xampp/htdocs/php/re01.txt';
相对路径
$filePath='./re01.txt';

路径属性
basename(url,[扩展名])   返回路径中的文件基本名,不加参数2返回文件的完整名
dirname(url)    返回去掉文件名的路径
pathinfo(url)   返回一个包括给定路径中目录、基本名、扩展名的关联数组

遍历目录
opendir()    用于打开指定目录,接收一个目录的路径及目录名作为参数,函数返回值为可供其他目录函数使用的目录句柄。若目录不存在或者没有权限则返回false
readdir()    利用目录句柄遍历目录,第一个和第二个运行结果分别为.和..,之后是各个文件
closedir()   关闭目录句柄,无返回值
rewinddir()  将目录句柄重置

#配置文件php.ini--open_basedir 
将PHP所能打开的文件限制在指定的目录树,包括文件本身。
注意用open_basedir指定的限制实际上是前缀,而不是目录名。 
举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是 可以访问的。
所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成: "open_basedir = /dir/user/"。
 
#计算目录大小
统计目录的大小只能建立递归函数把目录下的所有文件大小都加起来。
代码示例:function dirSize($directory){
$total=0; //所有文件大小的加和
if($handle=opendir($directory)){ //获取文件句柄
while($file=readdir($handle)){
//排除两个特殊目录.and..
if($file!='.'&&$file!='..'){
$subFile=$directory.'/'.$file; //拼接路径
//如果为文件
if(is_file($subFile)){
$total += filesize($subFile);
}
//如果为目录
if(is_dir($subFile)){
//递归
$total += dirSize($subFile);
}
}
}
closedir($handle);
return $total;
}
}
$a='../download';
echo round(dirSize($a)/pow(1024,2))."MB"; //round()对浮点数进行四舍五入 round([数字],[小数点后位数]) pow(x,y) 函数返回y的x次方。
建立和删除目录
mkdir()   建立目录
rmdir()   删除空目录
unlink()  删除文件
rename()  重命名文件,参数1旧文件名,参数2新文件名
删除非空目录只能自己建立递归函数。
文件夹也是文件的一种。

#删除整个目录
代码示例:function delDir($directory){
if(file_exists($directory)){ //判断给定路径是否存在
//获取句柄
if($handle=opendir($directory)){
//遍历目录
while($file=readdir($handle)){
//剔除特殊路径
if($file!='.'&&$file!='..'){
//拼接路径
$subFile=$directory.'/'.$file;
//如果为文件
if(is_file($subFile)){
unlink($subFile);
}
//如果为路径
if(is_dir($subFile));
delDir($subFile);
}
}
//关闭句柄 删除空的文件夹
rmdir($directory);
closedir($handle);
}
}
}
delDir('./re03');
#复制整个目录
代码示例:<?php
function cpDir($dir1,$dir2){
if(file_exists($dir1)&&file_exists($dir2)){
$dir3="./$dir2/$dir1";
mkdir("$dir3");//组合两个参数,本例中$dir3为"./test/./file1",即在目标文件夹里创建要被复制的文件夹
if($handle=opendir($dir1)){
while($file=readdir($handle)){
if($file!='.'&&$file!='..'){
$subFile=$dir1.'/'.$file;
if(is_file($subFile)){
copy($subFile,"$dir3/$file"); //若为文件,则将文件复制到$dir3中
}
if(is_dir($subFile)){
cpDir("$dir1/$file","$dir2");//若为文件夹,则返回
}
}
}
closedir($handle);
}
}
}
cpDir('./file1','./test');//写程序不要拘泥于参数的多少,先实现要求,再根据经验缩减代码冗余部分
?>
复制文件 
可以在复制过去后重命名
copy('./re01.txt','./re02/re02.txt'); //参数1源文件 参数2目的文件(不能为路径)
目录是不能复制的,只能找到后拷贝。

0x1d 文件的基本操作
文件的打开与关闭
处理文件内容之前,通常需要建立与文件资源的连接即打开文件,同理结束对该资源的操作之后应当关闭资源连接。

文件指针
fopen()   参数1为文件的url,参数2为文件模式。
fclose()  参数为fopen返回的文件指针。
文件模式字符
r   只读
r+    读写
w   只写,从头开始,删除原来的内容。文件不存在就创建
w+  读写,从头开始,删除原来的内容。文件不存在就创建
x   创建并以只写方式打开,将文件指针指向文件头。如果文件存在则打开失败。
x+  创建并以读写方式打开,将文件指针指向文件头。如果文件存在则打开失败。
a   只写,追加方式
a+  读写,追加方式
b   二进制

打开文件有三种选择:
1.打开一个文件为了只读、只写或者读写。
2.如果写文件,可以覆盖所有已有文件内容或者追加。
3.在一个区分二进制文件和纯文本文件的系统上写文件必须执行采取的方式。

写入文件
fwrite()  将字符串写入文件,返回写入字节数。参数1为文件指针,参数2为写入内容,参数3为写入长度。
代码示例:
$f=fopen('./re01.txt','w');
fwrite($f,'abcdefg',888);

读取文件内容
fread() 读取指定长度的字符串,返回读取到的字符串,参数1为文件指针,参数2为读取的长度
fgets() 从文件中读取一行,返回读取到的字符串,参数1为文件指针,参数2填写后返回填写的长度-1个字节
计算机判断一行的标准为回车符(换行符)。

file()
不需要使用fopen()打开文件,将整个文件读到一个数组中。
数组中每个元素对应文件中每一行。
每个元素的值由原文件的换行符分割。
换行符依然在每个元素的值的尾部。
readfile()
此函数可以读取指定的整个文件并立即输出到输出缓冲区,并返回读取到的字节数。
这种方式不需要使用fopen打开文件。

移动文件指针
在对文件进行读写过程中,有时需要指针在文件中跳转,从不同位置读取以及将数据写入不同的位置。
int frell(resource handle(文件指针))  获取文件指针的当前位置
int fseek(resource handle, int offset [SEEK_CUR/SEEK_END/SEEK_SET])  移动文件指针到指定位置
SEEK_CUR 设置指针位置为当前位置加上第二个参数提供的偏转字节
SEEK_END 设置指针位置为EOF加上偏转字节
SEEK_SET 设置指针位置为偏转字节处
bool rewind(resource handle)  移动文件指针到文件开头

0x1e 文件的上传与下载
文件上传
HTTP协议实现了文件上传机制,可以将客户端的文件通过浏览器上传到服务器指定的目录存放。

1)客户端上传设置
浏览器页面
form表单通过<input type="file" name="myfile">标记本地文件。
    标签属性enctype="multipart/form-data" method="POST"
设置上传文件大小<input type="hidden" name="MAX_FILE_SIZE" value=100000>

2)服务器端通过php脚本处理上传
设置php配置文件(php.ini) 等于号后都是默认值
file_uploads=On    确定服务器上的php脚本是否可以接收http的文件上传
upload_max_filesize=2M    限制php脚本处理上传文件大小的最大值,必须小于post_max_size
post_max_size=8M    限制通过POST方法接收信息的最大值,应该大于upload_max_filesize,因为除了文件还有其他信息传递
upload_tmp_dir=NULL  上传文件时临时文件(tmp_name)存放的路径,可以是一个绝对路径

php脚本代码
$_FILES多维数组:用于存储各种与上传文件有关的信息,其他的数据用$_POST接收。
$_POST用于收集来自method="post"的表单中的值。
$_FILES数组中的["myfile"]代表<input type="file" name="myfile">中的name值。
$_FILES["myfile"]["name"]     客户端上传的文件原名称,包括扩展名
$_FILES["myfile"]["size"]      上传的文件大小,单位为字节
$_FILES["myfile"]["tmp_name"] 文件上传后服务器端存储的临时文件名,这是存储在临时目录中的文件名。
$_FILES["myfile"]["error"]    文件上传时的错误:0表示成功,1表示大小超过upload_max_filesize的限制,2表示大小超过表单中MAX_FILE_SIZE的限制,3表示文件只被部分上传,4表示没有上传任何文件
$_FILES["myfile"]["type"]       获取从客户端上传文件的MIME类型
示例:
<?php
print_r($_FILES);
copy($_FILES['myfile']['tmp_name'],'./'.$_FILES['myfile']['name']);  //将缓存文件保存下来
?>

文件下载
定义一个变量$filename,值为要被下载的文件名。
利用head()函数向客户端发送原始的http报文头。
一般为三个参数——Content-Type(MIME类型)、Content-Disposition:attachment;filename=$filename、'Content-Length:'.filesize($filename)
然后利用readfile()函数输出这个文件。
示例:
<?php
$filename="up.txt";
header('Content-Type:text/plain');
header("Content-Disposition:attachment;filename='.$filename");
header('Content-Length:'.filesize($filename));
readfile($filename);
?>
 
0x1f php连接数据库
代码示例:<?php

//连接数据库
$link=mysql_connect('127.0.0.1','root',''); //主机名、用户名、密码
if($link){
echo "数据库连接成功";
}else{
echo "Error!";
die('数据库连接失败');
}
//mysql_query() 函数执行一条MySQL查询
//设置字符集
mysql_query("SET NAMES 'utf8'");

//进行操作
$createDB="create database phpDB2"; //创建数据库
//执行sql语句
$result=mysql_query($createDB);
if($result){
echo "数据库创建成功";
}else{
echo "数据库创建失败";
}
//mysql_query() 函数执行一条MySQL查询
//选择数据库
mysql_select_db('tmp3',$link) or die('选择数据库失败'); //代码短路

//创建表
$createTable="create table test(name varchar(30))";
if(mysql_query($createTable)){
echo "创建表成功";
}else{
echo "创建表失败";
}

//删除行(记录)
mysql_select_db('tmp3',$link) or die('Error!');
$delete="delete from employee where e_id='1'";
if(mysql_query($deleteTable)){
echo "finished";
}

//修改行
mysql_select_db('tmp3',$link) or die('Error!');
$update="update employee set e_pay='4000' where e_id='2'";
if(mysql_query($update)){
echo "修改成功";
}

//查询数据库
mysql_select_db('tmp3',$link);
$select="select * from employee";
$result=mysql_query($select);
while($row=mysql_fetch_row($result)){ // mysql_fetch_row() 从参数(指定表)中取得一行作为数组元素
print_r($row);
echo "<br/>";
}

//关闭数据库连接
mysql_close($link);
?> 
整合了上课老师讲的知识和pdf,也包括自己的理解,一些代码小实例。
白衣行侠,轻剑快马。 查看全部
0x00 PHP简介
定义:
1)服务器端的语言
只会在服务器端运行。
2)嵌入到HTML中的语言
在HTML中嵌入PHP需要在服务器中先运行完成,如果执行后有输出,则输出的结果字符串会嵌入到原来PHP代码处,和HTML代码一起响应给客户端(浏览器)去解析。
3)脚本语言
脚本语言又称为动态语言。脚本通常以文本形式保存,只在被调用时进行解释或编译。
PHP保存在服务器端的,收到请求时才由Web服务器中安装的PHP应用模块解析,并从上到下一步步执行程序。

环境搭建
XAMPP 多系统+Apache+mysql+PHP+perl 一键搭建工具

0x01 PHP的作用
1.收集表单数据
2.生成动态网页
3.字符串处理
4.动态输出图像
5.处理服务器端文件系统
6.*编写数据库支持的网页
7.会话跟踪控制 cookie
8.处理XML文件
9.支持利用大量的网络协议
0.服务器端的其他相关操作

0x02 基本语法
PHP语言标记
<?php ...... ?>
<? ...... ?>——简写方式
指令分隔符——每一条语句后面使用";"结束

注释
//单行注释
/ 多行注释 / 注释掉的内容会变成一个空格,可以充当空格
/* /多行文档注释 方便PHPDocument生成文档

0x03 变量和变量类型
PHP中最基本的数据存储单元就是变量和常量,可以存储不同类型的数据。
PHP是弱类型语言,变量类型由空间里的值决定。
定义:$name=value或var name=value

变量命名规则:
1-数字 字母 下划线组成
2-不能以数字开头
3-不能使用默认关键字
4-见名知意
5-驼峰命名法

引用赋值
类似C语言的指针,相当于给一个变量起一个别名,通过这两个名字访问到的是同一块内存。
$a=10;
$b=&$a;
$a=20; //此时b的值是20,如果没有引用赋值b的值仍为10。

变量类型
局部变量(从定义开始到函数结束)
全局变量(从定义开始到脚本运行结束) 关键字是global
静态变量(使用static声明,作用域不变但生命周期变长)

0x04 数据类型
标量:布尔型(true or false)、整型、浮点型、字符串
复合类型:数据、对象
特殊类型:resource、NULL
标量:
1.布尔型——以下值会被认为false
——布尔值false
——整型值0
——浮点值0.0
——空白字符串和字符串“0”
——没有成员的变量数组
——没有单元的对象(仅仅适用php4)
——NULL
2.整型
十进制整数、八进制整数如010、十六进制整数如0x10。
php不支持无符号整数。
整型变量的最大值和OS(操作系统)有关。
3.浮点型
表示方式:1.234、1.2e3、7E-10
浮点型存储在内存中是近似值
永远不要去比较两个浮点数的大小!
4.字符串
单引号:
单引号里不能嵌套单引号,要表达一个单引号自身,需要在前面加个反斜线<\>来转义。
要表达一个反斜线自身,则要用两个反斜线(\\)。
在单引号中的变量转义不能被解析,会原样输出。
定义简单的不带变量的字符串使用单引号效率更高。
双引号:
可以使用转义字符,可以解析变量。
界定符
格式:<<<EOT   EOT
界定标记也要遵循命名规范
第一个界定符(EOT)后面不能跟空白符,第二个界定符前面也不能有空白符。
伪类型
伪类型不是PHP的基本数据类型,因为PHP是弱类型语言,所以在一些函数中一个参数可以接受多种类型的数据,还可以接受别的函数作为回调函数。

#数据转换
——自动转换类型
——强制转换类型
int() 整型
bool() 布尔型
float() 浮点型
string() 字符串
array() 数组
object() 对象
——变量类型检测函数
is_*()

0x05 常量
格式:define(name,value)
defined() 函数检查某常量是否存在
define() 函数定义一个常量 
constant() 函数返回常量的值
只能通过define()定义,不能语句赋值。
一旦被定义就不能重新定义或者取消定义,直到脚本运行结束。
常量只能是标量。
对大小写敏感,但以大写居多。
系统预定义常量都是大写。
常量可以在任何地方定义和访问。
常见系统预定义常量:PHP_OS、PHP_VERSION、TRUE、FALSE、NULL、M_PI(π)
变量

魔术常量
这五个变量会根据他们使用的位置而改变。
__FILE__(当前文件名)、__LINE__(当前行数)、__FUNCTION__(当前函数名)、__CLASS__(当前类名)、__METHOD__(当前对象的方式名)

0x06 运算符
算数运算符:+、-、*、/、%(取余)
取余运算符使用时所有参数都是整型
赋值运算符:=、+=、-=、*=、/=、%=
字符串运算符:.(串接)、.=(串接赋值)
递增递减运算符:++$a/$a++(前递增/后递增——运算返回的顺序不同)、--$a/$a--(前递减/后递减)
比较运算符:==、===(全等)、!=、<>(不等于,等同于!=)、!==(完全不等)、>、<、>=、<=
逻辑运算符:and、or、xor(异或)、&&、||、!

0x07 分支与循环结构
分支结构
if、elseif、switch、while if、do while
循环结构
for do
是否存在顺序、分支、循环结构是判定为一门语言的标准。

0x08 函数
函数是被命名的,每个函数都有唯一的名称。
函数调用指的是在程序的其他部分使用该名称可以执行函数中的语句。
函数是独立的,无需程序其他部分干预,可以独立执行。
函数可以将一个返回值返回给调用它的程序。

常用函数
empty():判断一个变量是否为空
isset():检测一个变量是否设置
unset():释放指定变量
exit():函数输出一条消息,并退出当前脚本

自定义函数
语法
function {
    函数本体;
    return 返回值;
}

函数调用:
无参数无返回
函数名();
有参数无返回
函数名(参数);
无参数有返回
$result=函数名();
有参数有返回
$result=函数名(参数);

func_num_args()   返回被调用函数的传入参数个数,类型是整型
func_get_arg()    返回指定的参数值
func_get_args()   返回全部参数的值,类型是数组

var_dump()
判断一个变量的类型与长度,并输出变量的数值,如果变量有值输出的是变量的值并返回数据类型。
此函数显示关于一个或多个表达式的结构,包括表达式的类型与值。数组将会递归展开,通过缩进显示其结构。
print_r($arr1)  输出数组 

include_('test2.php');  调用文件
include_once('test2.php');  仅调用一次,不会出现重复调用的错误

#require和include的区别
require 的使用方法如 require("file.php"); 
通常放在PHP程序的最前面,程序执行前就会先读入require所指定引入的文件,使它变成PHP程序网页的一部份。常用的函数亦可以这个方法将它引入网页中。
include 使用方法如 include("file.php"); 
一般是放在流程控制的处理部分中。PHP程序网页在读到include的文件时,才将它读进来。这种方式可以把程序执行的流程简单化。
_once 后缀表示已加载过的部分不加载。
require之所以放在最前是因为出错就停止运行代码,而include会报错并继续执行。
 
0x09 数组
PHP创建数组不需要指定大小和类型
数组键既可以用系统顺序,也可以自行定义。

数组分类
索引数组:键值为整型。
关联数组:键值为字符串。

数组定义
PHP中定义数组有两种方式:
1)直接为数组元素赋值——比如$array[0]="张三";$array[1]="男";$array["age"]=10;
2)使用array()函数声明——比如$arr1=array(1,2,'name'=>'zhangsan'......);
如果不使用符号"=>"默认为索引数组。
数组打印:使用print_r()或者var_dump()

0x0a 数组遍历
1-使用for循环结构遍历数组
前提是必须是键值连续的索引数组
for($i=0;$i<count($array);i++){} 
count($array) 输出数组元素个数

2-使用foreach语句遍历数组
第一种语法:
foreach($arr as $value){}
第二种语法:
foreach($arr as $key=>$value){} 变量的值与名字没有任何关系,只与所处位置有关,特定位置决定特定值

3-联合使用list()、each()、while循环遍历
each()
需要传递一个数组作为参数,返回数组中当前元素的键值对,并向后移动数组指针到下一个元素的位置。
键值对被返回的是带有四个元素的关联和索引混合的数组,键名为0、1、key、value,0、key的值相同,1、value的值相同。
list()
它并不是真正的函数而是PHP的语言结构。
list仅能用于以数字为键的数组并且假定从0开始。
语法:list($key,$value)=$arr
综合:while(list($key,$value)=each($arr)){}
再次使用之前要调用reset()

4-使用数组的内部指针控制函数遍历数组
数组内部指针是数组内部机制,指向数组的某个元素。
默认指向第一个元素,通过移动或改变指针的位置,可以做到访问数组中的任意元素。
next($arr1)  指针位置后移一个单位
prev($arr1)  指针位置前移一个单位
end($arr1)   指针位置移到最后
reset($arr1) 指针无条件移到第一个单位
current($arr1)  读取当前指向的值
key($arr1)      指针指向的内容的键

0x0b 预定义数组
$_GET   通过HTTP GET(URL请求)提交到脚本的变量 
$_POST  通过HTTP POST提交到脚本的变量 
$_REQUEST  通过GET、POST和Cookie机制提交到脚本的变量 
$_FILES  通过HTTP POST文件上传提交到脚本的变量 
$_COOKIE 通过HTTP Cookie提交到脚本的变量
$_SESSION  当前注册脚本会话的变量
$_SERVER 由WEB服务器设定,或直接和当前脚本的执行环境关联的变量 
$GLOBALS 当前脚本有效的变量都会显示,全局脚本

0x0c 数组的键值操作
array_values()  返回数组中所有的值,取出来形态为一个数组
array_keys()    返回数组中所有的键名,取出来形态为一个数组
in_array()      检查数组中是否存在指定的值,参数1为指定的值,参数2为被检查的数组,参数3为如果设置为true——区分大小写、判断是否值与类型都相等
array_search()  在数组中搜索给定的值,如果成功则返回相应的键名
array_flip()    交换数组中的键名和对应的键值
array_reverse() 将原数组中的元素顺序翻转,创建为新的数组并返回,参数1为数组名,参数2如果为true的话键名不变,否则键名丢失

0x0d 统计数组元素个数和唯一性
count()   返回数组中元素的数目
array_count_values()   统计数组中所有值出现的次数
array_unique()   删除数组中重复的值

0x0e 使用回调函数处理数组
array_filter()  用回调函数过滤数组中的元素,参数1为被操作的数组,参数2为定义一个回调函数
回调函数格式:
array_filter($arr1,function fun($value){          //回调函数的参数为数组的值
                            if(判断条件){
                                return true;
                                }
                                return false;});

array_walk()    对数组中的每一个元素使用回调函数,参数1为被操作的数组,参数2为定义一个回调函数(遍历数组里的元素),参数3为给回调函数的额外一个值(若echo,紧跟回调函数结果后面)
回调函数格式:
array_walk($arr1,function fun($value,$kay,$var3){      //回调函数的参数-$value为数组的值,$key为数组的键,$var3为array_walk()的参数3
    echo $value;
    echo $kay;
    echo $var3;
},'abc');  

array_map()     将自定义函数应用给定数组的每个值并返回新的值,参数1为回调函数名,从参数2开始为被操作的数组名(至少一个数组)
回调函数格式:
array_map(function fun($a,$b){   //回调函数的参数即是被操作的数组
            return $a*$b;
    },$a,$b);
0x00 对数组的操作
拆分、合并、分解和接合
array_slice()  截取某个范围的元素
示例-array_slice($arr1,2,3,false);  参数1为原数组,参数2为以此开始的元素序号,参数3为长度(0表示无元素,1表示本身,从2开始从参数2本身往后数的元素个数,负数是从后往前数到本身为止),参数4为是否保留键名(布尔值true-保留 or false-从0开始)
array_splice()  替换选中的元素
示例-array_splice($arr1,1,-1,$arr3);  参数1为原数组,参数2为以此开始的元素序号,参数3为长度(0表示无元素,1表示本身,从2开始从参数2本身往后数的元素个数,负数是从后往前数到本身为止),参数4为进行替换的数(也可以为数组)
array_combine()  合并两个数组为一个新的数组,参数1为作为key的数组,参数2为作为value的数组(如果参数为关联数组的话会使用值而不使用键)
array_merge()    把一个或多个数组合并为一个数组  参数1-n为数组名
array_intersect()  多个数组的交集
array_diff()       多个数组的差集(反交集)

0x0f 数组和数据结构
栈的实现——先进后出
array_push()  将元素放入数组尾部 参数1为数组名,参数2-n为入栈元素
array_pop()   从数组尾部删除元素 参数1为数组名

队列的实现——先进先出
array_shift($arr);  从头部删除元素
array_unshift($arr); 从头部添加元素

其他函数
range(0,123456,2);   返回一个包含指定范围的数组 参数1为最小值,参数2为最大值,参数3为元素值的间隔大小(步长)
array_rand()  从数组中随机选出一个或多个元素 参数1为数组名,参数2为随机元素的个数

0x02 字符串
字符串string:一个字符串由一系列的字符组成,每个字符等同于一个字节。这就意味着PHP只能支持256种的字符集,因此不支持Unicode。
定义一个字符串的最简单的方法是用单引号把它包围起来。
格式:$string='';

常用字符串
ltrim()  删除字符串左侧的空格符或其他的预定义字符
rtrim()  删除字符串右侧的空格符或其他的预定义字符
trim()   删除字符串两侧的空格符或其他的预定义字符
str_pad($str1,10,'x',STR_PAD_BOTH)  将字符串填充为新的长度,参数1为原字符串,参数2为处理后的长度,参数3为要填充的字符(不填默认为空格符),参数4位填补方向-STR_PAD_BOTH/LEFT/RIGHT
strtolower()  字符串转小写
strtoupper()  字符串转大写
strcmp()      比较两个字符串
ucfirst()  字符串首字母大写
ucwords()  字符串每个单词首字母转大写(以空格符分隔)
number_format 数字千位分割
strrev()  翻转字符串
md5()  字符串MD5加密

0x10 正则表达式
正则表达式作为一个字符串匹配的模板,是由元字符、特殊功能字符和模式修正符三部分组成。

界定符
格式:/  /,但除了字母、数字和反斜线以外,任何字符都可以作为界定符,如# ! {} ||

元字符
元字符是正则表达式的最基本组成单位。
*!所有的表示形式都是匹配一个字符。
类型有:普通字符(0-9、a-z、A-Z)、一些特殊字符(任何一个字符都可以作为元字符,但是前提是有特殊意义的字符要使用转义字符反斜线)、非打印字符或自定义元字符表。
非打印元字符
\cx     匹配由x指示的控制字符。如\cM指匹配回车符(Control-M)。x范围是A-Z或a-z之间。如果不在该范围之内,则指代“c”本身。
\f   换页符匹配。等效\x0c和\cL。
\n     换行符匹配。等效\x0a和\cJ。
\r     匹配一个回车符 。等效于\x0d和\cM。
\t     制表符匹配。等效\x09和\cI。
\v     垂直制表符匹配。等效\x0b和\cK。
\s   匹配任何空白字符,相当于[\f\n\r\t\v] 。
\S   匹配任何非空白字符,相当于[^\f\n\r\t\v]-[^\s]
\d   匹配0到9之间的单个数字,相当于[0-9]
\D   匹配非0到9的一个字符,相当于 [^0-9]-[^\d]
\w   匹配a到z、A到Z及数字0到9以及下划线之间的任意一个字符,相当于 [a-zA-Z0-9_] 
\W   匹配非a到z、A到Z及数字0到9以及下划线的任意一个字符,相当于 [^a-zA-Z0-9_]-[^\w]
自定义元字符表-格式为[suiyi]。

限定符
加在元字符后面可以同时匹配多个字符。
*  匹配0到多个,相当于 {0,n} 
?  匹配0到1个,相当于 {0,1} 
+  匹配至少1个,相当于 {1,n} 
\b 匹配单词边界 
^ 字符串必须以指定的字符开始 
$ 字符串必须以指定的字符结束 
{n}  匹配n个
{n,} 匹配至少n个
{m,n} 匹配m到n个
 
0x11 面向对象
对象概念是面向对象技术的核心。
在显示世界里我们所面对的事情都是对象,如计算机、键盘、显示屏等。
在面向对象的程序设计中,对象是一个由信息和对信息进行处理的动作所组成的整体。

0x12 面向对象模型
什么是类:
类是具有相同属性和方法的一组对象的集合。
静态特征称为属性(变量),动态行为称为方法(函数)。
类为属于该类的对象做了一个统一的抽象描述,编程语言中类是一个单独的程序,命名类时(见名知意)应包括属性的说明和行为。

什么是对象:
对象是系统中描述客观事件的一个实体,是构成系统的一个基本单位。
一个对象由一组属性和对属性进行操作的一组行为组成。
从抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象。
对象反映该事物在系统中保存的信息和发挥的作用,它是一组属性和对这些属性操作的行为的一个封装体。
客观世界是由对象和对象之间的联系组成的。

对象的主要三个特性
对象的行为:可以对对象施加的操作。
对象的形态:当施加方法的时候对象如何响应。
对象的表示:对象的表示是唯一表示,具体区分在相同的属性与行为下有什么不同。

类和对象的关系:
类与对象的关系就如模具和铸件的关系,类的实例化就是对象,而对对象的抽象就是类,类描述了一组具有相同属性和行为的对象。
对象是实际存在的,占有动态资源。类是对象的集合,可能占有静态资源,属性占有动态资源。

0x13 定义类和对象
定义类:
class name [可选属性]{
$property=value;  //类的属性
......
function name($arg){   //类的方法
......} 
}
方法的参数可以是基本数据类型、数组和类对象。
基本数据类型和数组:值参传递
类对象:引用传递

生成对象(类的实例化):$对象名=new classname( );
直接调用类方法/变量:class::$name/function

0x14 访问类型
public 公共的(公共修饰符)  类内部与类外部都可以访问
private 私有的(私有修饰符) 只能在类内部访问
protected 受保护的(保护成员修饰符) 子类可以访问,类外部不可以访问
一般来说将类private更符合现实的逻辑。
内部类可以访问类外部的任何成员,包括private成员也可。 
类外部访问内部类成员需要创建内部类的对象,之后可以访问内部类的任何成员。

静态属性和方法
关键字static,用来声明静态属性和静态方法。
在类内部生成一个静态变量或方法能够被所有类的实例化,也就是说静态成员在类第一次被加载的时可以让堆内存里面的每个对象所共享。
静态属性必须在内部就被赋值。
内部声明方法:self::$name/name(属性/方法)
示例:
class name{
public static $name='Kevin';
public static function class(){
    echo "I am".self::$country;
    self::PI;    //访问常量
    //echo $this->name;X 在静态方法中只能操作静态属性
    //self::p();X
}
}
外部调用:类::$静态属性、类::静态方法
需要注意的是非静态类内部不能有静态成员。 

0x15 构造函数和析构函数
构造函数:在类中起到初始化的作用。
构造函数的生成方法与其他函数一样,只是其名称必须是__construct().
语法:
function __construct($name,$size......){
$this->name=$name;
$this->size=$size;
......
}
对象使用类的属性
在一个类中,可以利用特殊指针$this。
在类的内部访问属性时用$this->name=$name
$this指代对象(调用者)本身,此做法可以对调用者进行过滤和控制。

析构函数
当对象脱离其作用域时(例如对象所在的方法已调用完毕),系统自动执行析构函数。
一般应在结束前在析构函数中释放内存、关闭文件、释放结果集等等。
析构函数没有任何参数。
语法:
function __destruct(){
    ......
    } 

三个重要特性————封装、继承和多态​
0x16 封装
封装性:封装性就是把对象的属性和行为综合成一个独立的单位。
封装一个类需要两步,第一步是将类私有化,第二步是用__set和__get进行读取和赋值的操作。
好处是:隐藏类的具体细节,方便加入逻辑控制,限制对属性的不合理操作,便于修改和增强代码的可维护性。

__get与__set
这两个函数都是系统预定义,进行读取与赋值操作。
__set 设置值通常是域的值
__get 获取值通常是域的值
__call 调用一个对象中不存在的方法时,就会产生错误,用call()处理这种情况。

0x17 继承
概述
子类B的对象拥有父类A的全部属性和方法,叫做B类对A类的继承。
假如一个类从多个类中继承了属性与服务,此为多继承。
通常称继承类为子类,被继承类为父类。
PHP中只有单继承,但一个父类可以被多个子类继承,一个子类只能有一个父类,但是允许关联继承。

extends声明继承关系
语法:
class B extends A{}   B类继承A类
类的外部访问对子类是有效的。
final表示这个类是最终版本,也就是说它不能再被子类调用。

子类与父类
子类继承父类的所有内容,但父类中的private部分不能直接访问。
子类中新增加的属性和方法是对父类的扩展。
子类中定义的与父类的同名的属性和方法是对父类属性和方法的覆盖。

重写的方法
在子类中,使用parent访问父类中的被覆盖的属性和方法。
parent::__construce();
parent::$name;
parent::fun();

对象比较
==  比较两个对象的内容。
=== 比较对象的句柄,即引用地址。

0x18 多态性
多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的方法。
这种特性使得同一个属性或方法在父类及其各个子类中具有不同的含义。
也就是说同一种方法在子类与父类中执行的结果不同。
instanceof 用来判断对象是否属于某一个类的类型,如果属于返回true,不属于返回false
示例:
class A {
function info(){
echo "A info";
}
}
class B extends A {
function info(){
echo "B info";
}
}
class C extends A {
function info(){
echo "C info";
}
}
function printinfo($obj){
if($obj instanceof A)
$obj->info();
}
$a=new A();
$b=new B();
$c=new C();
printinfo($a); //输出A INFO
printinfo($b); //输出B INFO
printinfo($c); //输出C INFO

0x19 抽象类和接口
抽象类
抽象方法是作为子类的模板使用。
语法:
abstract class Person{
public $name;
abstract function getInfo();
}
抽象类不能被实例化,一个抽象类中必须有一个抽象方法。
任何一个类,如果至少有一个方法是被声明为抽象的,那么这个类就必须也被声明为抽象的。
但是抽象类中可以定义动态函数。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。

接口
当一个类继承了一个接口之后,它要覆盖接口的所有方法。
接口只能声明常量,接口的方法必须定义为共有public,否则无法继承,接口可以与多个接口间继承。
接口的方法不能有函数体。
接口不能实例化。
抽象类和接口都是为继承做准备的。
语法:
interface PCI{
const TYPE="PCI";
function start();
function stop();
}
接口中的方法可以声明为static
interface A{
    function a();
}
interface B{
    function b();
}
interface C extends A{ 
    function c();
}
class D implements B,C{
function a(){}
function b(){}
function c(){}
}
implements是一个类继承一个接口用的关键字,用来实现接口中定义的抽象方法。

抽象类和接口的区别:
接口可以被多重implements,而抽象类只能被单一extends。
接口只有定义,抽象类可以有定义和实现。
接口的字段定义默认为:public、static、final, 抽象类字段默认是"protected"。
 
0x1a 文件系统处理
概述
任何数据都是在程序运行期间才加载到内存中的,不能永久保存。
需要将数据长久保存通常有两种方式:保存到普通文件中或者数据库中。
文件(资源——可以存入数据库,存入的数据为资源路径)、数据库(信息资源-数据-内容巨大)

——文件类型
php是以UNIX的文件系统为模型的。
文件后缀名无关紧要(都可以运用对应的软件打开),重要的是本身的内容。
在Windows只能获取file,dir和unknow三种类型。
在Linux/Unix下,可以获取block,char,dir,fifo,file,link,unknown7种。

block:块设置文件,如磁盘分区、软驱、光驱cd-rom等。
char:字符设备,I/O(输入输出)传输过程中以字符为单位进行传输的设备,例如键盘、打印机等。
dir:目录类型,目录也是文件的一种/目录文件。
fifo:信息管道,常用于将信息从一个进程传输到另一个进程。
file:普通文件类型,如文本文件、可执行文件等。
link:符号链接,指向文件的指针,相当于windows下的快捷方式。
unknown:未知类型。
php可以使用filetype()函数来获取文件类型。
判断是否为某类文件:is_file()、is_dir()、is_link......

0x1b 文件属性
1)文件属性处理函数
file_exists()    判断文件是否存在,存在返回true,不存在返回false
filesize()       返回文件大小,返回文件大小的字节数,出错返回false。目录文件不会返回文件大小,返回值为0。
is_readable()    判断文件是否可读,存在且可读返回true
is_writeable()   判断文件是否可写,存在且可写返回true
is_executable()  判断文件是否可执行,存在且可执行返回true
filectime()      返回文件创建时间,unix时间戳(从1970年1月1日开始至今所经过的秒数)
filemtime()      返回文件修改时间,unix时间戳
fileactime()     返回文件最后访问时间,unix时间戳
stat()           返回关于文件的信息的数组,出错返回 false,并且发出一条警告。

bool rename(string $oldname,string $newname,[resource $context])
尝试把$oldname重命名为$newname。成功时返回TRUE,失败则返回 FALSE。
例如:rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");

0x1c 目录的基本操作
使用php脚本可以方便地对服务器中目录进行操作,包括创建、遍历、复制、删除等操作。

解析目录路径(url)
绝对路径
$filePath='C:/xampp/htdocs/php/re01.txt';
相对路径
$filePath='./re01.txt';

路径属性
basename(url,[扩展名])   返回路径中的文件基本名,不加参数2返回文件的完整名
dirname(url)    返回去掉文件名的路径
pathinfo(url)   返回一个包括给定路径中目录、基本名、扩展名的关联数组

遍历目录
opendir()    用于打开指定目录,接收一个目录的路径及目录名作为参数,函数返回值为可供其他目录函数使用的目录句柄。若目录不存在或者没有权限则返回false
readdir()    利用目录句柄遍历目录,第一个和第二个运行结果分别为.和..,之后是各个文件
closedir()   关闭目录句柄,无返回值
rewinddir()  将目录句柄重置

#配置文件php.ini--open_basedir 
将PHP所能打开的文件限制在指定的目录树,包括文件本身。
注意用open_basedir指定的限制实际上是前缀,而不是目录名。 
举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是 可以访问的。
所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成: "open_basedir = /dir/user/"。
 
#计算目录大小
统计目录的大小只能建立递归函数把目录下的所有文件大小都加起来。
代码示例:
function dirSize($directory){
$total=0; //所有文件大小的加和
if($handle=opendir($directory)){ //获取文件句柄
while($file=readdir($handle)){
//排除两个特殊目录.and..
if($file!='.'&&$file!='..'){
$subFile=$directory.'/'.$file; //拼接路径
//如果为文件
if(is_file($subFile)){
$total += filesize($subFile);
}
//如果为目录
if(is_dir($subFile)){
//递归
$total += dirSize($subFile);
}
}
}
closedir($handle);
return $total;
}
}
$a='../download';
echo round(dirSize($a)/pow(1024,2))."MB"; //round()对浮点数进行四舍五入 round([数字],[小数点后位数]) pow(x,y) 函数返回y的x次方。

建立和删除目录
mkdir()   建立目录
rmdir()   删除空目录
unlink()  删除文件
rename()  重命名文件,参数1旧文件名,参数2新文件名
删除非空目录只能自己建立递归函数。
文件夹也是文件的一种。

#删除整个目录
代码示例:
function delDir($directory){
if(file_exists($directory)){ //判断给定路径是否存在
//获取句柄
if($handle=opendir($directory)){
//遍历目录
while($file=readdir($handle)){
//剔除特殊路径
if($file!='.'&&$file!='..'){
//拼接路径
$subFile=$directory.'/'.$file;
//如果为文件
if(is_file($subFile)){
unlink($subFile);
}
//如果为路径
if(is_dir($subFile));
delDir($subFile);
}
}
//关闭句柄 删除空的文件夹
rmdir($directory);
closedir($handle);
}
}
}
delDir('./re03');

#复制整个目录
代码示例:
<?php
function cpDir($dir1,$dir2){
if(file_exists($dir1)&&file_exists($dir2)){
$dir3="./$dir2/$dir1";
mkdir("$dir3");//组合两个参数,本例中$dir3为"./test/./file1",即在目标文件夹里创建要被复制的文件夹
if($handle=opendir($dir1)){
while($file=readdir($handle)){
if($file!='.'&&$file!='..'){
$subFile=$dir1.'/'.$file;
if(is_file($subFile)){
copy($subFile,"$dir3/$file"); //若为文件,则将文件复制到$dir3中
}
if(is_dir($subFile)){
cpDir("$dir1/$file","$dir2");//若为文件夹,则返回
}
}
}
closedir($handle);
}
}
}
cpDir('./file1','./test');//写程序不要拘泥于参数的多少,先实现要求,再根据经验缩减代码冗余部分
?>

复制文件 
可以在复制过去后重命名
copy('./re01.txt','./re02/re02.txt'); //参数1源文件 参数2目的文件(不能为路径)
目录是不能复制的,只能找到后拷贝。

0x1d 文件的基本操作
文件的打开与关闭
处理文件内容之前,通常需要建立与文件资源的连接即打开文件,同理结束对该资源的操作之后应当关闭资源连接。

文件指针
fopen()   参数1为文件的url,参数2为文件模式。
fclose()  参数为fopen返回的文件指针。
文件模式字符
r   只读
r+    读写
w   只写,从头开始,删除原来的内容。文件不存在就创建
w+  读写,从头开始,删除原来的内容。文件不存在就创建
x   创建并以只写方式打开,将文件指针指向文件头。如果文件存在则打开失败。
x+  创建并以读写方式打开,将文件指针指向文件头。如果文件存在则打开失败。
a   只写,追加方式
a+  读写,追加方式
b   二进制

打开文件有三种选择:
1.打开一个文件为了只读、只写或者读写。
2.如果写文件,可以覆盖所有已有文件内容或者追加。
3.在一个区分二进制文件和纯文本文件的系统上写文件必须执行采取的方式。

写入文件
fwrite()  将字符串写入文件,返回写入字节数。参数1为文件指针,参数2为写入内容,参数3为写入长度。
代码示例:
$f=fopen('./re01.txt','w');
fwrite($f,'abcdefg',888);

读取文件内容
fread() 读取指定长度的字符串,返回读取到的字符串,参数1为文件指针,参数2为读取的长度
fgets() 从文件中读取一行,返回读取到的字符串,参数1为文件指针,参数2填写后返回填写的长度-1个字节
计算机判断一行的标准为回车符(换行符)。

file()
不需要使用fopen()打开文件,将整个文件读到一个数组中。
数组中每个元素对应文件中每一行。
每个元素的值由原文件的换行符分割。
换行符依然在每个元素的值的尾部。
readfile()
此函数可以读取指定的整个文件并立即输出到输出缓冲区,并返回读取到的字节数。
这种方式不需要使用fopen打开文件。

移动文件指针
在对文件进行读写过程中,有时需要指针在文件中跳转,从不同位置读取以及将数据写入不同的位置。
int frell(resource handle(文件指针))  获取文件指针的当前位置
int fseek(resource handle, int offset [SEEK_CUR/SEEK_END/SEEK_SET])  移动文件指针到指定位置
SEEK_CUR 设置指针位置为当前位置加上第二个参数提供的偏转字节
SEEK_END 设置指针位置为EOF加上偏转字节
SEEK_SET 设置指针位置为偏转字节处
bool rewind(resource handle)  移动文件指针到文件开头

0x1e 文件的上传与下载
文件上传
HTTP协议实现了文件上传机制,可以将客户端的文件通过浏览器上传到服务器指定的目录存放。

1)客户端上传设置
浏览器页面
form表单通过<input type="file" name="myfile">标记本地文件。
    标签属性enctype="multipart/form-data" method="POST"
设置上传文件大小<input type="hidden" name="MAX_FILE_SIZE" value=100000>

2)服务器端通过php脚本处理上传
设置php配置文件(php.ini) 等于号后都是默认值
file_uploads=On    确定服务器上的php脚本是否可以接收http的文件上传
upload_max_filesize=2M    限制php脚本处理上传文件大小的最大值,必须小于post_max_size
post_max_size=8M    限制通过POST方法接收信息的最大值,应该大于upload_max_filesize,因为除了文件还有其他信息传递
upload_tmp_dir=NULL  上传文件时临时文件(tmp_name)存放的路径,可以是一个绝对路径

php脚本代码
$_FILES多维数组:用于存储各种与上传文件有关的信息,其他的数据用$_POST接收。
$_POST用于收集来自method="post"的表单中的值。
$_FILES数组中的["myfile"]代表<input type="file" name="myfile">中的name值。
$_FILES["myfile"]["name"]     客户端上传的文件原名称,包括扩展名
$_FILES["myfile"]["size"]      上传的文件大小,单位为字节
$_FILES["myfile"]["tmp_name"] 文件上传后服务器端存储的临时文件名,这是存储在临时目录中的文件名。
$_FILES["myfile"]["error"]    文件上传时的错误:0表示成功,1表示大小超过upload_max_filesize的限制,2表示大小超过表单中MAX_FILE_SIZE的限制,3表示文件只被部分上传,4表示没有上传任何文件
$_FILES["myfile"]["type"]       获取从客户端上传文件的MIME类型
示例:
<?php
print_r($_FILES);
copy($_FILES['myfile']['tmp_name'],'./'.$_FILES['myfile']['name']);  //将缓存文件保存下来
?>

文件下载
定义一个变量$filename,值为要被下载的文件名。
利用head()函数向客户端发送原始的http报文头。
一般为三个参数——Content-Type(MIME类型)、Content-Disposition:attachment;filename=$filename、'Content-Length:'.filesize($filename)
然后利用readfile()函数输出这个文件。
示例:
<?php
$filename="up.txt";
header('Content-Type:text/plain');
header("Content-Disposition:attachment;filename='.$filename");
header('Content-Length:'.filesize($filename));
readfile($filename);
?>
 
0x1f php连接数据库
代码示例:
<?php

//连接数据库
$link=mysql_connect('127.0.0.1','root',''); //主机名、用户名、密码
if($link){
echo "数据库连接成功";
}else{
echo "Error!";
die('数据库连接失败');
}
//mysql_query() 函数执行一条MySQL查询
//设置字符集
mysql_query("SET NAMES 'utf8'");

//进行操作
$createDB="create database phpDB2"; //创建数据库
//执行sql语句
$result=mysql_query($createDB);
if($result){
echo "数据库创建成功";
}else{
echo "数据库创建失败";
}
//mysql_query() 函数执行一条MySQL查询
//选择数据库
mysql_select_db('tmp3',$link) or die('选择数据库失败'); //代码短路

//创建表
$createTable="create table test(name varchar(30))";
if(mysql_query($createTable)){
echo "创建表成功";
}else{
echo "创建表失败";
}

//删除行(记录)
mysql_select_db('tmp3',$link) or die('Error!');
$delete="delete from employee where e_id='1'";
if(mysql_query($deleteTable)){
echo "finished";
}

//修改行
mysql_select_db('tmp3',$link) or die('Error!');
$update="update employee set e_pay='4000' where e_id='2'";
if(mysql_query($update)){
echo "修改成功";
}

//查询数据库
mysql_select_db('tmp3',$link);
$select="select * from employee";
$result=mysql_query($select);
while($row=mysql_fetch_row($result)){ // mysql_fetch_row() 从参数(指定表)中取得一行作为数组元素
print_r($row);
echo "<br/>";
}

//关闭数据库连接
mysql_close($link);
?>
 
整合了上课老师讲的知识和pdf,也包括自己的理解,一些代码小实例。
白衣行侠,轻剑快马。

【转载】PHP语言里一些危险的预定义函数

编程Kyhvedn 发表了文章 • 2 个评论 • 639 次浏览 • 2016-09-22 18:06 • 来自相关话题

phpinfo()
功能描述:输出PHP环境信息以及相关的模块、WEB环境等信息。
危险等级:中

passthru()
功能描述:允许执行一个外部程序并回显输出,类似于 exec()。
危险等级:高

exec()
功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。
危险等级:高

system()
功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。
危险等级:高

chroot()
功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式
PHP 时才能工作,且该函数不适用于 Windows 系统。
危险等级:高

scandir()
功能描述:列出指定路径中的文件和目录。
危险等级:中

chgrp()
功能描述:改变文件或目录所属的用户组。
危险等级:高

chown()
功能描述:改变文件或目录的所有者。
危险等级:高

shell_exec()
功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。
危险等级:高

proc_open()
功能描述:执行一个命令并打开文件指针用于读取以及写入。
危险等级:高

proc_get_status()
功能描述:获取使用 proc_open() 所打开进程的信息。
危险等级:高

error_log()
功能描述:将错误信息发送到指定位置(文件)。
安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,
执行任意命令。
危险等级:低

ini_alter()
功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。
具体参见 ini_set()。
危险等级:高

ini_set()
功能描述:可用于修改、设置 PHP 环境配置参数。
危险等级:高

ini_restore()
功能描述:可用于恢复 PHP 环境配置参数到其初始值。
危险等级:高

dl()
功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。
危险等级:高

pfsockopen()
功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。
危险等级:高

syslog()
功能描述:可调用 UNIX 系统的系统层 syslog() 函数。
危险等级:中

readlink()
功能描述:返回符号连接指向的目标文件内容。
危险等级:中

symlink()
功能描述:在 UNIX 系统中建立一个符号链接。
危险等级:高

popen()
功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。
危险等级:高

stream_socket_server()
功能描述:建立一个 Internet 或 UNIX 服务器连接。
危险等级:中

putenv()
功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数
修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。
危险等级:高

assert()
功能描述:如果按照默认值来,在程序的运行过程中调用assert()来进行判断表达式,遇到false时程序也是会继续执行的,跟eval()类似,不过eval($code_str)只是执行符合php编码规范的$code_str。assert的用法却更详细一点。
危险等级:高

禁用方法如下:
打开/etc/php.ini文件,
查找到 disable_functions ,添加需禁用的函数名,如下:
phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen,assert
 
温馨提示:php的eval函数并不是系统组件函数,因此我们在php.ini中使用disable_functions是无法禁止它的,所以说使用disable_functions禁止掉eval的方法都是错误的。但是eval()对于php安全来说具有很大的杀伤力。
如果想禁掉eval可以用php的扩展 Suhosin:
安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on即可。
php的eval函数在php中是无法禁用的,因此我们也只有使用插件了。
 
原文地址:http://www.jb51.net/article/29750.htm
          http://www.jb51.net/article/51670.htm
 
白衣行侠,轻剑快马 查看全部
phpinfo()
功能描述:输出PHP环境信息以及相关的模块、WEB环境等信息。
危险等级:中

passthru()
功能描述:允许执行一个外部程序并回显输出,类似于 exec()。
危险等级:高

exec()
功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。
危险等级:高

system()
功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。
危险等级:高

chroot()
功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式
PHP 时才能工作,且该函数不适用于 Windows 系统。
危险等级:高

scandir()
功能描述:列出指定路径中的文件和目录。
危险等级:中

chgrp()
功能描述:改变文件或目录所属的用户组。
危险等级:高

chown()
功能描述:改变文件或目录的所有者。
危险等级:高

shell_exec()
功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。
危险等级:高

proc_open()
功能描述:执行一个命令并打开文件指针用于读取以及写入。
危险等级:高

proc_get_status()
功能描述:获取使用 proc_open() 所打开进程的信息。
危险等级:高

error_log()
功能描述:将错误信息发送到指定位置(文件)。
安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,
执行任意命令。
危险等级:低

ini_alter()
功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。
具体参见 ini_set()。
危险等级:高

ini_set()
功能描述:可用于修改、设置 PHP 环境配置参数。
危险等级:高

ini_restore()
功能描述:可用于恢复 PHP 环境配置参数到其初始值。
危险等级:高

dl()
功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。
危险等级:高

pfsockopen()
功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。
危险等级:高

syslog()
功能描述:可调用 UNIX 系统的系统层 syslog() 函数。
危险等级:中

readlink()
功能描述:返回符号连接指向的目标文件内容。
危险等级:中

symlink()
功能描述:在 UNIX 系统中建立一个符号链接。
危险等级:高

popen()
功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。
危险等级:高

stream_socket_server()
功能描述:建立一个 Internet 或 UNIX 服务器连接。
危险等级:中

putenv()
功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数
修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。
危险等级:高

assert()
功能描述:如果按照默认值来,在程序的运行过程中调用assert()来进行判断表达式,遇到false时程序也是会继续执行的,跟eval()类似,不过eval($code_str)只是执行符合php编码规范的$code_str。assert的用法却更详细一点。
危险等级:高

禁用方法如下:
打开/etc/php.ini文件,
查找到 disable_functions ,添加需禁用的函数名,如下:
phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen,assert
 
温馨提示:php的eval函数并不是系统组件函数,因此我们在php.ini中使用disable_functions是无法禁止它的,所以说使用disable_functions禁止掉eval的方法都是错误的。但是eval()对于php安全来说具有很大的杀伤力。
如果想禁掉eval可以用php的扩展 Suhosin:
安装Suhosin后在php.ini中load进来Suhosin.so,再加上suhosin.executor.disable_eval = on即可。
php的eval函数在php中是无法禁用的,因此我们也只有使用插件了。
 
原文地址:http://www.jb51.net/article/29750.htm
          http://www.jb51.net/article/51670.htm
 
白衣行侠,轻剑快马

php学习笔记

编程Kyhvedn 发表了文章 • 4 个评论 • 636 次浏览 • 2016-09-17 15:20 • 来自相关话题

0x00 PHP简介
定义:
1)服务器端的语言
只会在服务器端运行。
2)嵌入到HTML中的语言
在HTML中嵌入PHP需要在服务器中先运行完成,如果执行后有输出,则输出的结果字符串会嵌入到原来PHP代码处,和HTML代码一起响应给客户端(浏览器)去解析。
3)脚本语言
脚本语言又称为动态语言。脚本通常以文本形式保存,只在被调用时进行解释或编译。
PHP保存在服务器端的,收到请求时才由Web服务器中安装的PHP应用模块解析,并从上到下一步步执行程序。

环境搭建
XAMPP 多系统+Apache+mysql+PHP+perl 一键搭建工具

0x01 PHP的作用
1.收集表单数据
2.生成动态网页
3.字符串处理
4.动态输出图像
5.处理服务器端文件系统
6.*编写数据库支持的网页
7.会话跟踪控制 cookie
8.处理XML文件
9.支持利用大量的网络协议
0.服务器端的其他相关操作

0x02 基本语法
PHP语言标记
<?php ...... ?>
<? ...... ?>——简写方式
指令分隔符——每一条语句后面使用";"结束

注释
//单行注释
/ 多行注释 / 注释掉的内容会变成一个空格,可以充当空格
/* /多行文档注释 方便PHPDocument生成文档

0x03 变量和变量类型
PHP中最基本的数据存储单元就是变量和常量,可以存储不同类型的数据。
PHP是弱类型语言,变量类型由空间里的值决定。
定义:$name=value或var name=value

变量命名规则:
1-数字 字母 下划线组成
2-不能以数字开头
3-不能使用默认关键字
4-见名知意
5-驼峰命名法

引用赋值
类似C语言的指针,相当于给一个变量起一个别名,通过这两个名字访问到的是同一块内存。
$a=10;
$b=&$a;
$a=20; //此时b的值是20,如果没有引用赋值b的值仍为10。

变量类型
局部变量(从定义开始到函数结束)
全局变量(从定义开始到脚本运行结束) 关键字是global
静态变量(使用static声明,作用域不变但生命周期变长)

0x04 数据类型
标量:布尔型(true or false)、整型、浮点型、字符串
复合类型:数据、对象
特殊类型:resource、NULL
标量:
1.布尔型——以下值会被认为false
——布尔值false
——整型值0
——浮点值0.0
——空白字符串和字符串“0”
——没有成员的变量数组
——没有单元的对象(仅仅适用php4)
——NULL
2.整型
十进制整数、八进制整数如010、十六进制整数如0x10。
php不支持无符号整数。
整型变量的最大值和OS(操作系统)有关。
3.浮点型
表示方式:1.234、1.2e3、7E-10
浮点型存储在内存中是近似值
永远不要去比较两个浮点数的大小!
4.字符串
单引号:
单引号里不能嵌套单引号,要表达一个单引号自身,需要在前面加个反斜线<\>来转义。
要表达一个反斜线自身,则要用两个反斜线(\\)。
在单引号中的变量转义不能被解析,会原样输出。
定义简单的不带变量的字符串使用单引号效率更高。
双引号:
可以使用转义字符,可以解析变量。
界定符
格式:<<<EOT   EOT
界定标记也要遵循命名规范
第一个界定符(EOT)后面不能跟空白符,第二个界定符前面也不能有空白符。
伪类型
伪类型不是PHP的基本数据类型,因为PHP是弱类型语言,所以在一些函数中一个参数可以接受多种类型的数据,还可以接受别的函数作为回调函数。

#数据转换
——自动转换类型
——强制转换类型
int() 整型
bool() 布尔型
float() 浮点型
string() 字符串
array() 数组
object() 对象
——变量类型检测函数
is_*()

0x05 常量
格式:define(name,value)
defined() 函数检查某常量是否存在
define() 函数定义一个常量 
constant() 函数返回常量的值
只能通过define()定义,不能语句赋值。
一旦被定义就不能重新定义或者取消定义,直到脚本运行结束。
常量只能是标量。
对大小写敏感,但以大写居多。
系统预定义常量都是大写。
常量可以在任何地方定义和访问。
常见系统预定义常量:PHP_OS、PHP_VERSION、TRUE、FALSE、NULL、M_PI(π)
变量

魔术常量
这五个变量会根据他们使用的位置而改变。
__FILE__(当前文件名)、__LINE__(当前行数)、__FUNCTION__(当前函数名)、__CLASS__(当前类名)、__METHOD__(当前对象的方式名)

0x06 运算符
算数运算符:+、-、*、/、%(取余)
取余运算符使用时所有参数都是整型
赋值运算符:=、+=、-=、*=、/=、%=
字符串运算符:.(串接)、.=(串接赋值)
递增递减运算符:++$a/$a++(前递增/后递增——运算返回的顺序不同)、--$a/$a--(前递减/后递减)
比较运算符:==、===(全等)、!=、<>(不等于,等同于!=)、!==(完全不等)、>、<、>=、<=
逻辑运算符:and、or、xor(异或)、&&、||、!

0x07 分支与循环结构
分支结构
if、elseif、switch、while if、do while
循环结构
for do
是否存在顺序、分支、循环结构是判定为一门语言的标准。

0x08 函数
函数是被命名的,每个函数都有唯一的名称。
函数调用指的是在程序的其他部分使用该名称可以执行函数中的语句。
函数是独立的,无需程序其他部分干预,可以独立执行。
函数可以将一个返回值返回给调用它的程序。

常用函数
empty():判断一个变量是否为空
isset():检测一个变量是否设置
unset():释放指定变量
exit():函数输出一条消息,并退出当前脚本

自定义函数
语法
function {
    函数本体;
    return 返回值;
}

函数调用:
无参数无返回
函数名();
有参数无返回
函数名(参数);
无参数有返回
$result=函数名();
有参数有返回
$result=函数名(参数);

func_num_args()   返回被调用函数的传入参数个数,类型是整型
func_get_arg()    返回指定的参数值
func_get_args()   返回全部参数的值,类型是数组

var_dump()
判断一个变量的类型与长度,并输出变量的数值,如果变量有值输出的是变量的值并返回数据类型。
此函数显示关于一个或多个表达式的结构,包括表达式的类型与值。数组将会递归展开,通过缩进显示其结构。
print_r($arr1)  输出数组 

include_('test2.php');  调用文件
include_once('test2.php');  仅调用一次,不会出现重复调用的错误

#require和include的区别
require 的使用方法如 require("file.php"); 
通常放在PHP程序的最前面,程序执行前就会先读入require所指定引入的文件,使它变成PHP程序网页的一部份。常用的函数亦可以这个方法将它引入网页中。
include 使用方法如 include("file.php"); 
一般是放在流程控制的处理部分中。PHP程序网页在读到include的文件时,才将它读进来。这种方式可以把程序执行的流程简单化。
_once 后缀表示已加载过的部分不加载。
require之所以放在最前是因为出错就停止运行代码,而include会报错并继续执行。
 
0x09 数组
PHP创建数组不需要指定大小和类型
数组键既可以用系统顺序,也可以自行定义。

数组分类
索引数组:键值为整型。
关联数组:键值为字符串。

数组定义
PHP中定义数组有两种方式:
1)直接为数组元素赋值——比如$array[0]="张三";$array[1]="男";$array["age"]=10;
2)使用array()函数声明——比如$arr1=array(1,2,'name'=>'zhangsan'......);
如果不使用符号"=>"默认为索引数组。
数组打印:使用print_r()或者var_dump()

0x0a 数组遍历
1-使用for循环结构遍历数组
前提是必须是键值连续的索引数组
for($i=0;$i<count($array);i++){} 
count($array) 输出数组元素个数

2-使用foreach语句遍历数组
第一种语法:
foreach($arr as $value){}
第二种语法:
foreach($arr as $key=>$value){} 变量的值与名字没有任何关系,只与所处位置有关,特定位置决定特定值

3-联合使用list()、each()、while循环遍历
each()
需要传递一个数组作为参数,返回数组中当前元素的键值对,并向后移动数组指针到下一个元素的位置。
键值对被返回的是带有四个元素的关联和索引混合的数组,键名为0、1、key、value,0、key的值相同,1、value的值相同。
list()
它并不是真正的函数而是PHP的语言结构。
list仅能用于以数字为键的数组并且假定从0开始。
语法:list($key,$value)=$arr
综合:while(list($key,$value)=each($arr)){}
再次使用之前要调用reset()

4-使用数组的内部指针控制函数遍历数组
数组内部指针是数组内部机制,指向数组的某个元素。
默认指向第一个元素,通过移动或改变指针的位置,可以做到访问数组中的任意元素。
next($arr1)  指针位置后移一个单位
prev($arr1)  指针位置前移一个单位
end($arr1)   指针位置移到最后
reset($arr1) 指针无条件移到第一个单位
current($arr1)  读取当前指向的值
key($arr1)      指针指向的内容的键

0x0b 预定义数组
$_GET   通过HTTP GET(URL请求)提交到脚本的变量 
$_POST  通过HTTP POST提交到脚本的变量 
$_REQUEST  通过GET、POST和Cookie机制提交到脚本的变量 
$_FILES  通过HTTP POST文件上传提交到脚本的变量 
$_COOKIE 通过HTTP Cookie提交到脚本的变量
$_SESSION  当前注册脚本会话的变量
$_SERVER 由WEB服务器设定,或直接和当前脚本的执行环境关联的变量 
$GLOBALS 当前脚本有效的变量都会显示,全局脚本

0x0c 数组的键值操作
array_values()  返回数组中所有的值,取出来形态为一个数组
array_keys()    返回数组中所有的键名,取出来形态为一个数组
in_array()      检查数组中是否存在指定的值,参数1为指定的值,参数2为被检查的数组,参数3为如果设置为true——区分大小写、判断是否值与类型都相等
array_search()  在数组中搜索给定的值,如果成功则返回相应的键名
array_flip()    交换数组中的键名和对应的键值
array_reverse() 将原数组中的元素顺序翻转,创建为新的数组并返回,参数1为数组名,参数2如果为true的话键名不变,否则键名丢失

0x0d 统计数组元素个数和唯一性
count()   返回数组中元素的数目
array_count_values()   统计数组中所有值出现的次数
array_unique()   删除数组中重复的值

0x0e 使用回调函数处理数组
array_filter()  用回调函数过滤数组中的元素,参数1为被操作的数组,参数2为定义一个回调函数
回调函数格式:
array_filter($arr1,function fun($value){          //回调函数的参数为数组的值
                            if(判断条件){
                                return true;
                                }
                                return false;});

array_walk()    对数组中的每一个元素使用回调函数,参数1为被操作的数组,参数2为定义一个回调函数(遍历数组里的元素),参数3为给回调函数的额外一个值(若echo,紧跟回调函数结果后面)
回调函数格式:
array_walk($arr1,function fun($value,$kay,$var3){      //回调函数的参数-$value为数组的值,$key为数组的键,$var3为array_walk()的参数3
    echo $value;
    echo $kay;
    echo $var3;
},'abc');  

array_map()     将自定义函数应用给定数组的每个值并返回新的值,参数1为回调函数名,从参数2开始为被操作的数组名(至少一个数组)
回调函数格式:
array_map(function fun($a,$b){   //回调函数的参数即是被操作的数组
            return $a*$b;
    },$a,$b);
0x00 对数组的操作
拆分、合并、分解和接合
array_slice()  截取某个范围的元素
示例-array_slice($arr1,2,3,false);  参数1为原数组,参数2为以此开始的元素序号,参数3为长度(0表示无元素,1表示本身,从2开始从参数2本身往后数的元素个数,负数是从后往前数到本身为止),参数4为是否保留键名(布尔值true-保留 or false-从0开始)
array_splice()  替换选中的元素
示例-array_splice($arr1,1,-1,$arr3);  参数1为原数组,参数2为以此开始的元素序号,参数3为长度(0表示无元素,1表示本身,从2开始从参数2本身往后数的元素个数,负数是从后往前数到本身为止),参数4为进行替换的数(也可以为数组)
array_combine()  合并两个数组为一个新的数组,参数1为作为key的数组,参数2为作为value的数组(如果参数为关联数组的话会使用值而不使用键)
array_merge()    把一个或多个数组合并为一个数组  参数1-n为数组名
array_intersect()  多个数组的交集
array_diff()       多个数组的差集(反交集)

0x0f 数组和数据结构
栈的实现——先进后出
array_push()  将元素放入数组尾部 参数1为数组名,参数2-n为入栈元素
array_pop()   从数组尾部删除元素 参数1为数组名

队列的实现——先进先出
array_shift($arr);  从头部删除元素
array_unshift($arr); 从头部添加元素

其他函数
range(0,123456,2);   返回一个包含指定范围的数组 参数1为最小值,参数2为最大值,参数3为元素值的间隔大小(步长)
array_rand()  从数组中随机选出一个或多个元素 参数1为数组名,参数2为随机元素的个数

0x02 字符串
字符串string:一个字符串由一系列的字符组成,每个字符等同于一个字节。这就意味着PHP只能支持256种的字符集,因此不支持Unicode。
定义一个字符串的最简单的方法是用单引号把它包围起来。
格式:$string='';

常用字符串
ltrim()  删除字符串左侧的空格符或其他的预定义字符
rtrim()  删除字符串右侧的空格符或其他的预定义字符
trim()   删除字符串两侧的空格符或其他的预定义字符
str_pad($str1,10,'x',STR_PAD_BOTH)  将字符串填充为新的长度,参数1为原字符串,参数2为处理后的长度,参数3为要填充的字符(不填默认为空格符),参数4位填补方向-STR_PAD_BOTH/LEFT/RIGHT
strtolower()  字符串转小写
strtoupper()  字符串转大写
strcmp()      比较两个字符串
ucfirst()  字符串首字母大写
ucwords()  字符串每个单词首字母转大写(以空格符分隔)
number_format 数字千位分割
strrev()  翻转字符串
md5()  字符串MD5加密

0x10 正则表达式
正则表达式作为一个字符串匹配的模板,是由元字符、特殊功能字符和模式修正符三部分组成。

界定符
格式:/  /,但除了字母、数字和反斜线以外,任何字符都可以作为界定符,如# ! {} ||

元字符
元字符是正则表达式的最基本组成单位。
*!所有的表示形式都是匹配一个字符。
类型有:普通字符(0-9、a-z、A-Z)、一些特殊字符(任何一个字符都可以作为元字符,但是前提是有特殊意义的字符要使用转义字符反斜线)、非打印字符或自定义元字符表。
非打印元字符
\cx     匹配由x指示的控制字符。如\cM指匹配回车符(Control-M)。x范围是A-Z或a-z之间。如果不在该范围之内,则指代“c”本身。
\f   换页符匹配。等效\x0c和\cL。
\n     换行符匹配。等效\x0a和\cJ。
\r     匹配一个回车符 。等效于\x0d和\cM。
\t     制表符匹配。等效\x09和\cI。
\v     垂直制表符匹配。等效\x0b和\cK。
\s   匹配任何空白字符,相当于[\f\n\r\t\v] 。
\S   匹配任何非空白字符,相当于[^\f\n\r\t\v]-[^\s]
\d   匹配0到9之间的单个数字,相当于[0-9]
\D   匹配非0到9的一个字符,相当于 [^0-9]-[^\d]
\w   匹配a到z、A到Z及数字0到9以及下划线之间的任意一个字符,相当于 [a-zA-Z0-9_] 
\W   匹配非a到z、A到Z及数字0到9以及下划线的任意一个字符,相当于 [^a-zA-Z0-9_]-[^\w]
自定义元字符表-格式为[suiyi]。

限定符
加在元字符后面可以同时匹配多个字符。
*  匹配0到多个,相当于 {0,n} 
?  匹配0到1个,相当于 {0,1} 
+  匹配至少1个,相当于 {1,n} 
\b 匹配单词边界 
^ 字符串必须以指定的字符开始 
$ 字符串必须以指定的字符结束 
{n}  匹配n个
{n,} 匹配至少n个
{m,n} 匹配m到n个
 
0x11 面向对象
对象概念是面向对象技术的核心。
在显示世界里我们所面对的事情都是对象,如计算机、键盘、显示屏等。
在面向对象的程序设计中,对象是一个由信息和对信息进行处理的动作所组成的整体。

0x12 面向对象模型
什么是类:
类是具有相同属性和方法的一组对象的集合。
静态特征称为属性(变量),动态行为称为方法(函数)。
类为属于该类的对象做了一个统一的抽象描述,编程语言中类是一个单独的程序,命名类时(见名知意)应包括属性的说明和行为。

什么是对象:
对象是系统中描述客观事件的一个实体,是构成系统的一个基本单位。
一个对象由一组属性和对属性进行操作的一组行为组成。
从抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象。
对象反映该事物在系统中保存的信息和发挥的作用,它是一组属性和对这些属性操作的行为的一个封装体。
客观世界是由对象和对象之间的联系组成的。

对象的主要三个特性
对象的行为:可以对对象施加的操作。
对象的形态:当施加方法的时候对象如何响应。
对象的表示:对象的表示是唯一表示,具体区分在相同的属性与行为下有什么不同。

类和对象的关系:
类与对象的关系就如模具和铸件的关系,类的实例化就是对象,而对对象的抽象就是类,类描述了一组具有相同属性和行为的对象。
对象是实际存在的,占有动态资源。类是对象的集合,可能占有静态资源,属性占有动态资源。

0x13 定义类和对象
定义类:
class name [可选属性]{
$property=value;  //类的属性
......
function name($arg){   //类的方法
......} 
}
方法的参数可以是基本数据类型、数组和类对象。
基本数据类型和数组:值参传递
类对象:引用传递

生成对象(类的实例化):$对象名=new classname( );
直接调用类方法/变量:class::$name/function

0x14 访问类型
public 公共的(公共修饰符)  类内部与类外部都可以访问
private 私有的(私有修饰符) 只能在类内部访问
protected 受保护的(保护成员修饰符) 子类可以访问,类外部不可以访问
一般来说将类private更符合现实的逻辑。
内部类可以访问类外部的任何成员,包括private成员也可。 
类外部访问内部类成员需要创建内部类的对象,之后可以访问内部类的任何成员。

静态属性和方法
关键字static,用来声明静态属性和静态方法。
在类内部生成一个静态变量或方法能够被所有类的实例化,也就是说静态成员在类第一次被加载的时可以让堆内存里面的每个对象所共享。
静态属性必须在内部就被赋值。
内部声明方法:self::$name/name(属性/方法)
示例:
class name{
public static $name='Kevin';
public static function class(){
    echo "I am".self::$country;
    self::PI;    //访问常量
    //echo $this->name;X 在静态方法中只能操作静态属性
    //self::p();X
}
}
外部调用:类::$静态属性、类::静态方法
需要注意的是非静态类内部不能有静态成员。 

0x15 构造函数和析构函数
构造函数:在类中起到初始化的作用。
构造函数的生成方法与其他函数一样,只是其名称必须是__construct().
语法:
function __construct($name,$size......){
$this->name=$name;
$this->size=$size;
......
}
对象使用类的属性
在一个类中,可以利用特殊指针$this。
在类的内部访问属性时用$this->name=$name
$this指代对象(调用者)本身,此做法可以对调用者进行过滤和控制。

析构函数
当对象脱离其作用域时(例如对象所在的方法已调用完毕),系统自动执行析构函数。
一般应在结束前在析构函数中释放内存、关闭文件、释放结果集等等。
析构函数没有任何参数。
语法:
function __destruct(){
    ......
    } 

三个重要特性————封装、继承和多态​
0x16 封装
封装性:封装性就是把对象的属性和行为综合成一个独立的单位。
封装一个类需要两步,第一步是将类私有化,第二步是用__set和__get进行读取和赋值的操作。
好处是:隐藏类的具体细节,方便加入逻辑控制,限制对属性的不合理操作,便于修改和增强代码的可维护性。

__get与__set
这两个函数都是系统预定义,进行读取与赋值操作。
__set 设置值通常是域的值
__get 获取值通常是域的值
__call 调用一个对象中不存在的方法时,就会产生错误,用call()处理这种情况。

0x17 继承
概述
子类B的对象拥有父类A的全部属性和方法,叫做B类对A类的继承。
假如一个类从多个类中继承了属性与服务,此为多继承。
通常称继承类为子类,被继承类为父类。
PHP中只有单继承,但一个父类可以被多个子类继承,一个子类只能有一个父类,但是允许关联继承。

extends声明继承关系
语法:
class B extends A{}   B类继承A类
类的外部访问对子类是有效的。
final表示这个类是最终版本,也就是说它不能再被子类调用。

子类与父类
子类继承父类的所有内容,但父类中的private部分不能直接访问。
子类中新增加的属性和方法是对父类的扩展。
子类中定义的与父类的同名的属性和方法是对父类属性和方法的覆盖。

重写的方法
在子类中,使用parent访问父类中的被覆盖的属性和方法。
parent::__construce();
parent::$name;
parent::fun();

对象比较
==  比较两个对象的内容。
=== 比较对象的句柄,即引用地址。

0x18 多态性
多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的方法。
这种特性使得同一个属性或方法在父类及其各个子类中具有不同的含义。
也就是说同一种方法在子类与父类中执行的结果不同。
instanceof 用来判断对象是否属于某一个类的类型,如果属于返回true,不属于返回false
示例:
class A {
function info(){
echo "A info";
}
}
class B extends A {
function info(){
echo "B info";
}
}
class C extends A {
function info(){
echo "C info";
}
}
function printinfo($obj){
if($obj instanceof A)
$obj->info();
}
$a=new A();
$b=new B();
$c=new C();
printinfo($a); //输出A INFO
printinfo($b); //输出B INFO
printinfo($c); //输出C INFO

0x19 抽象类和接口
抽象类
抽象方法是作为子类的模板使用。
语法:
abstract class Person{
public $name;
abstract function getInfo();
}
抽象类不能被实例化,一个抽象类中必须有一个抽象方法。
任何一个类,如果至少有一个方法是被声明为抽象的,那么这个类就必须也被声明为抽象的。
但是抽象类中可以定义动态函数。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。

接口
当一个类继承了一个接口之后,它要覆盖接口的所有方法。
接口只能声明常量,接口的方法必须定义为共有public,否则无法继承,接口可以与多个接口间继承。
接口的方法不能有函数体。
接口不能实例化。
抽象类和接口都是为继承做准备的。
语法:
interface PCI{
const TYPE="PCI";
function start();
function stop();
}
接口中的方法可以声明为static
interface A{
    function a();
}
interface B{
    function b();
}
interface C extends A{ 
    function c();
}
class D implements B,C{
function a(){}
function b(){}
function c(){}
}
implements是一个类继承一个接口用的关键字,用来实现接口中定义的抽象方法。

抽象类和接口的区别:
接口可以被多重implements,而抽象类只能被单一extends。
接口只有定义,抽象类可以有定义和实现。
接口的字段定义默认为:public、static、final, 抽象类字段默认是"protected"。
 
0x1a 文件系统处理
概述
任何数据都是在程序运行期间才加载到内存中的,不能永久保存。
需要将数据长久保存通常有两种方式:保存到普通文件中或者数据库中。
文件(资源——可以存入数据库,存入的数据为资源路径)、数据库(信息资源-数据-内容巨大)

——文件类型
php是以UNIX的文件系统为模型的。
文件后缀名无关紧要(都可以运用对应的软件打开),重要的是本身的内容。
在Windows只能获取file,dir和unknow三种类型。
在Linux/Unix下,可以获取block,char,dir,fifo,file,link,unknown7种。

block:块设置文件,如磁盘分区、软驱、光驱cd-rom等。
char:字符设备,I/O(输入输出)传输过程中以字符为单位进行传输的设备,例如键盘、打印机等。
dir:目录类型,目录也是文件的一种/目录文件。
fifo:信息管道,常用于将信息从一个进程传输到另一个进程。
file:普通文件类型,如文本文件、可执行文件等。
link:符号链接,指向文件的指针,相当于windows下的快捷方式。
unknown:未知类型。
php可以使用filetype()函数来获取文件类型。
判断是否为某类文件:is_file()、is_dir()、is_link......

0x1b 文件属性
1)文件属性处理函数
file_exists()    判断文件是否存在,存在返回true,不存在返回false
filesize()       返回文件大小,返回文件大小的字节数,出错返回false。目录文件不会返回文件大小,返回值为0。
is_readable()    判断文件是否可读,存在且可读返回true
is_writeable()   判断文件是否可写,存在且可写返回true
is_executable()  判断文件是否可执行,存在且可执行返回true
filectime()      返回文件创建时间,unix时间戳(从1970年1月1日开始至今所经过的秒数)
filemtime()      返回文件修改时间,unix时间戳
fileactime()     返回文件最后访问时间,unix时间戳
stat()           返回关于文件的信息的数组,出错返回 false,并且发出一条警告。

bool rename(string $oldname,string $newname,[resource $context])
尝试把$oldname重命名为$newname。成功时返回TRUE,失败则返回 FALSE。
例如:rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");

0x1c 目录的基本操作
使用php脚本可以方便地对服务器中目录进行操作,包括创建、遍历、复制、删除等操作。

解析目录路径(url)
绝对路径
$filePath='C:/xampp/htdocs/php/re01.txt';
相对路径
$filePath='./re01.txt';

路径属性
basename(url,[扩展名])   返回路径中的文件基本名,不加参数2返回文件的完整名
dirname(url)    返回去掉文件名的路径
pathinfo(url)   返回一个包括给定路径中目录、基本名、扩展名的关联数组

遍历目录
opendir()    用于打开指定目录,接收一个目录的路径及目录名作为参数,函数返回值为可供其他目录函数使用的目录句柄。若目录不存在或者没有权限则返回false
readdir()    利用目录句柄遍历目录,第一个和第二个运行结果分别为.和..,之后是各个文件
closedir()   关闭目录句柄,无返回值
rewinddir()  将目录句柄重置

#配置文件php.ini--open_basedir 
将PHP所能打开的文件限制在指定的目录树,包括文件本身。
注意用open_basedir指定的限制实际上是前缀,而不是目录名。 
举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是 可以访问的。
所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成: "open_basedir = /dir/user/"。
 
#计算目录大小
统计目录的大小只能建立递归函数把目录下的所有文件大小都加起来。
代码示例:function dirSize($directory){
$total=0; //所有文件大小的加和
if($handle=opendir($directory)){ //获取文件句柄
while($file=readdir($handle)){
//排除两个特殊目录.and..
if($file!='.'&&$file!='..'){
$subFile=$directory.'/'.$file; //拼接路径
//如果为文件
if(is_file($subFile)){
$total += filesize($subFile);
}
//如果为目录
if(is_dir($subFile)){
//递归
$total += dirSize($subFile);
}
}
}
closedir($handle);
return $total;
}
}
$a='../download';
echo round(dirSize($a)/pow(1024,2))."MB"; //round()对浮点数进行四舍五入 round([数字],[小数点后位数]) pow(x,y) 函数返回y的x次方。
建立和删除目录
mkdir()   建立目录
rmdir()   删除空目录
unlink()  删除文件
rename()  重命名文件,参数1旧文件名,参数2新文件名
删除非空目录只能自己建立递归函数。
文件夹也是文件的一种。

#删除整个目录
代码示例:function delDir($directory){
if(file_exists($directory)){ //判断给定路径是否存在
//获取句柄
if($handle=opendir($directory)){
//遍历目录
while($file=readdir($handle)){
//剔除特殊路径
if($file!='.'&&$file!='..'){
//拼接路径
$subFile=$directory.'/'.$file;
//如果为文件
if(is_file($subFile)){
unlink($subFile);
}
//如果为路径
if(is_dir($subFile));
delDir($subFile);
}
}
//关闭句柄 删除空的文件夹
rmdir($directory);
closedir($handle);
}
}
}
delDir('./re03');
#复制整个目录
代码示例:<?php
function cpDir($dir1,$dir2){
if(file_exists($dir1)&&file_exists($dir2)){
$dir3="./$dir2/$dir1";
mkdir("$dir3");//组合两个参数,本例中$dir3为"./test/./file1",即在目标文件夹里创建要被复制的文件夹
if($handle=opendir($dir1)){
while($file=readdir($handle)){
if($file!='.'&&$file!='..'){
$subFile=$dir1.'/'.$file;
if(is_file($subFile)){
copy($subFile,"$dir3/$file"); //若为文件,则将文件复制到$dir3中
}
if(is_dir($subFile)){
cpDir("$dir1/$file","$dir2");//若为文件夹,则返回
}
}
}
closedir($handle);
}
}
}
cpDir('./file1','./test');//写程序不要拘泥于参数的多少,先实现要求,再根据经验缩减代码冗余部分
?>
复制文件 
可以在复制过去后重命名
copy('./re01.txt','./re02/re02.txt'); //参数1源文件 参数2目的文件(不能为路径)
目录是不能复制的,只能找到后拷贝。

0x1d 文件的基本操作
文件的打开与关闭
处理文件内容之前,通常需要建立与文件资源的连接即打开文件,同理结束对该资源的操作之后应当关闭资源连接。

文件指针
fopen()   参数1为文件的url,参数2为文件模式。
fclose()  参数为fopen返回的文件指针。
文件模式字符
r   只读
r+    读写
w   只写,从头开始,删除原来的内容。文件不存在就创建
w+  读写,从头开始,删除原来的内容。文件不存在就创建
x   创建并以只写方式打开,将文件指针指向文件头。如果文件存在则打开失败。
x+  创建并以读写方式打开,将文件指针指向文件头。如果文件存在则打开失败。
a   只写,追加方式
a+  读写,追加方式
b   二进制

打开文件有三种选择:
1.打开一个文件为了只读、只写或者读写。
2.如果写文件,可以覆盖所有已有文件内容或者追加。
3.在一个区分二进制文件和纯文本文件的系统上写文件必须执行采取的方式。

写入文件
fwrite()  将字符串写入文件,返回写入字节数。参数1为文件指针,参数2为写入内容,参数3为写入长度。
代码示例:
$f=fopen('./re01.txt','w');
fwrite($f,'abcdefg',888);

读取文件内容
fread() 读取指定长度的字符串,返回读取到的字符串,参数1为文件指针,参数2为读取的长度
fgets() 从文件中读取一行,返回读取到的字符串,参数1为文件指针,参数2填写后返回填写的长度-1个字节
计算机判断一行的标准为回车符(换行符)。

file()
不需要使用fopen()打开文件,将整个文件读到一个数组中。
数组中每个元素对应文件中每一行。
每个元素的值由原文件的换行符分割。
换行符依然在每个元素的值的尾部。
readfile()
此函数可以读取指定的整个文件并立即输出到输出缓冲区,并返回读取到的字节数。
这种方式不需要使用fopen打开文件。

移动文件指针
在对文件进行读写过程中,有时需要指针在文件中跳转,从不同位置读取以及将数据写入不同的位置。
int frell(resource handle(文件指针))  获取文件指针的当前位置
int fseek(resource handle, int offset [SEEK_CUR/SEEK_END/SEEK_SET])  移动文件指针到指定位置
SEEK_CUR 设置指针位置为当前位置加上第二个参数提供的偏转字节
SEEK_END 设置指针位置为EOF加上偏转字节
SEEK_SET 设置指针位置为偏转字节处
bool rewind(resource handle)  移动文件指针到文件开头

0x1e 文件的上传与下载
文件上传
HTTP协议实现了文件上传机制,可以将客户端的文件通过浏览器上传到服务器指定的目录存放。

1)客户端上传设置
浏览器页面
form表单通过<input type="file" name="myfile">标记本地文件。
    标签属性enctype="multipart/form-data" method="POST"
设置上传文件大小<input type="hidden" name="MAX_FILE_SIZE" value=100000>

2)服务器端通过php脚本处理上传
设置php配置文件(php.ini) 等于号后都是默认值
file_uploads=On    确定服务器上的php脚本是否可以接收http的文件上传
upload_max_filesize=2M    限制php脚本处理上传文件大小的最大值,必须小于post_max_size
post_max_size=8M    限制通过POST方法接收信息的最大值,应该大于upload_max_filesize,因为除了文件还有其他信息传递
upload_tmp_dir=NULL  上传文件时临时文件(tmp_name)存放的路径,可以是一个绝对路径

php脚本代码
$_FILES多维数组:用于存储各种与上传文件有关的信息,其他的数据用$_POST接收。
$_POST用于收集来自method="post"的表单中的值。
$_FILES数组中的["myfile"]代表<input type="file" name="myfile">中的name值。
$_FILES["myfile"]["name"]     客户端上传的文件原名称,包括扩展名
$_FILES["myfile"]["size"]      上传的文件大小,单位为字节
$_FILES["myfile"]["tmp_name"] 文件上传后服务器端存储的临时文件名,这是存储在临时目录中的文件名。
$_FILES["myfile"]["error"]    文件上传时的错误:0表示成功,1表示大小超过upload_max_filesize的限制,2表示大小超过表单中MAX_FILE_SIZE的限制,3表示文件只被部分上传,4表示没有上传任何文件
$_FILES["myfile"]["type"]       获取从客户端上传文件的MIME类型
示例:
<?php
print_r($_FILES);
copy($_FILES['myfile']['tmp_name'],'./'.$_FILES['myfile']['name']);  //将缓存文件保存下来
?>

文件下载
定义一个变量$filename,值为要被下载的文件名。
利用head()函数向客户端发送原始的http报文头。
一般为三个参数——Content-Type(MIME类型)、Content-Disposition:attachment;filename=$filename、'Content-Length:'.filesize($filename)
然后利用readfile()函数输出这个文件。
示例:
<?php
$filename="up.txt";
header('Content-Type:text/plain');
header("Content-Disposition:attachment;filename='.$filename");
header('Content-Length:'.filesize($filename));
readfile($filename);
?>
 
0x1f php连接数据库
代码示例:<?php

//连接数据库
$link=mysql_connect('127.0.0.1','root',''); //主机名、用户名、密码
if($link){
echo "数据库连接成功";
}else{
echo "Error!";
die('数据库连接失败');
}
//mysql_query() 函数执行一条MySQL查询
//设置字符集
mysql_query("SET NAMES 'utf8'");

//进行操作
$createDB="create database phpDB2"; //创建数据库
//执行sql语句
$result=mysql_query($createDB);
if($result){
echo "数据库创建成功";
}else{
echo "数据库创建失败";
}
//mysql_query() 函数执行一条MySQL查询
//选择数据库
mysql_select_db('tmp3',$link) or die('选择数据库失败'); //代码短路

//创建表
$createTable="create table test(name varchar(30))";
if(mysql_query($createTable)){
echo "创建表成功";
}else{
echo "创建表失败";
}

//删除行(记录)
mysql_select_db('tmp3',$link) or die('Error!');
$delete="delete from employee where e_id='1'";
if(mysql_query($deleteTable)){
echo "finished";
}

//修改行
mysql_select_db('tmp3',$link) or die('Error!');
$update="update employee set e_pay='4000' where e_id='2'";
if(mysql_query($update)){
echo "修改成功";
}

//查询数据库
mysql_select_db('tmp3',$link);
$select="select * from employee";
$result=mysql_query($select);
while($row=mysql_fetch_row($result)){ // mysql_fetch_row() 从参数(指定表)中取得一行作为数组元素
print_r($row);
echo "<br/>";
}

//关闭数据库连接
mysql_close($link);
?> 
整合了上课老师讲的知识和pdf,也包括自己的理解,一些代码小实例。
白衣行侠,轻剑快马。 查看全部
0x00 PHP简介
定义:
1)服务器端的语言
只会在服务器端运行。
2)嵌入到HTML中的语言
在HTML中嵌入PHP需要在服务器中先运行完成,如果执行后有输出,则输出的结果字符串会嵌入到原来PHP代码处,和HTML代码一起响应给客户端(浏览器)去解析。
3)脚本语言
脚本语言又称为动态语言。脚本通常以文本形式保存,只在被调用时进行解释或编译。
PHP保存在服务器端的,收到请求时才由Web服务器中安装的PHP应用模块解析,并从上到下一步步执行程序。

环境搭建
XAMPP 多系统+Apache+mysql+PHP+perl 一键搭建工具

0x01 PHP的作用
1.收集表单数据
2.生成动态网页
3.字符串处理
4.动态输出图像
5.处理服务器端文件系统
6.*编写数据库支持的网页
7.会话跟踪控制 cookie
8.处理XML文件
9.支持利用大量的网络协议
0.服务器端的其他相关操作

0x02 基本语法
PHP语言标记
<?php ...... ?>
<? ...... ?>——简写方式
指令分隔符——每一条语句后面使用";"结束

注释
//单行注释
/ 多行注释 / 注释掉的内容会变成一个空格,可以充当空格
/* /多行文档注释 方便PHPDocument生成文档

0x03 变量和变量类型
PHP中最基本的数据存储单元就是变量和常量,可以存储不同类型的数据。
PHP是弱类型语言,变量类型由空间里的值决定。
定义:$name=value或var name=value

变量命名规则:
1-数字 字母 下划线组成
2-不能以数字开头
3-不能使用默认关键字
4-见名知意
5-驼峰命名法

引用赋值
类似C语言的指针,相当于给一个变量起一个别名,通过这两个名字访问到的是同一块内存。
$a=10;
$b=&$a;
$a=20; //此时b的值是20,如果没有引用赋值b的值仍为10。

变量类型
局部变量(从定义开始到函数结束)
全局变量(从定义开始到脚本运行结束) 关键字是global
静态变量(使用static声明,作用域不变但生命周期变长)

0x04 数据类型
标量:布尔型(true or false)、整型、浮点型、字符串
复合类型:数据、对象
特殊类型:resource、NULL
标量:
1.布尔型——以下值会被认为false
——布尔值false
——整型值0
——浮点值0.0
——空白字符串和字符串“0”
——没有成员的变量数组
——没有单元的对象(仅仅适用php4)
——NULL
2.整型
十进制整数、八进制整数如010、十六进制整数如0x10。
php不支持无符号整数。
整型变量的最大值和OS(操作系统)有关。
3.浮点型
表示方式:1.234、1.2e3、7E-10
浮点型存储在内存中是近似值
永远不要去比较两个浮点数的大小!
4.字符串
单引号:
单引号里不能嵌套单引号,要表达一个单引号自身,需要在前面加个反斜线<\>来转义。
要表达一个反斜线自身,则要用两个反斜线(\\)。
在单引号中的变量转义不能被解析,会原样输出。
定义简单的不带变量的字符串使用单引号效率更高。
双引号:
可以使用转义字符,可以解析变量。
界定符
格式:<<<EOT   EOT
界定标记也要遵循命名规范
第一个界定符(EOT)后面不能跟空白符,第二个界定符前面也不能有空白符。
伪类型
伪类型不是PHP的基本数据类型,因为PHP是弱类型语言,所以在一些函数中一个参数可以接受多种类型的数据,还可以接受别的函数作为回调函数。

#数据转换
——自动转换类型
——强制转换类型
int() 整型
bool() 布尔型
float() 浮点型
string() 字符串
array() 数组
object() 对象
——变量类型检测函数
is_*()

0x05 常量
格式:define(name,value)
defined() 函数检查某常量是否存在
define() 函数定义一个常量 
constant() 函数返回常量的值
只能通过define()定义,不能语句赋值。
一旦被定义就不能重新定义或者取消定义,直到脚本运行结束。
常量只能是标量。
对大小写敏感,但以大写居多。
系统预定义常量都是大写。
常量可以在任何地方定义和访问。
常见系统预定义常量:PHP_OS、PHP_VERSION、TRUE、FALSE、NULL、M_PI(π)
变量

魔术常量
这五个变量会根据他们使用的位置而改变。
__FILE__(当前文件名)、__LINE__(当前行数)、__FUNCTION__(当前函数名)、__CLASS__(当前类名)、__METHOD__(当前对象的方式名)

0x06 运算符
算数运算符:+、-、*、/、%(取余)
取余运算符使用时所有参数都是整型
赋值运算符:=、+=、-=、*=、/=、%=
字符串运算符:.(串接)、.=(串接赋值)
递增递减运算符:++$a/$a++(前递增/后递增——运算返回的顺序不同)、--$a/$a--(前递减/后递减)
比较运算符:==、===(全等)、!=、<>(不等于,等同于!=)、!==(完全不等)、>、<、>=、<=
逻辑运算符:and、or、xor(异或)、&&、||、!

0x07 分支与循环结构
分支结构
if、elseif、switch、while if、do while
循环结构
for do
是否存在顺序、分支、循环结构是判定为一门语言的标准。

0x08 函数
函数是被命名的,每个函数都有唯一的名称。
函数调用指的是在程序的其他部分使用该名称可以执行函数中的语句。
函数是独立的,无需程序其他部分干预,可以独立执行。
函数可以将一个返回值返回给调用它的程序。

常用函数
empty():判断一个变量是否为空
isset():检测一个变量是否设置
unset():释放指定变量
exit():函数输出一条消息,并退出当前脚本

自定义函数
语法
function {
    函数本体;
    return 返回值;
}

函数调用:
无参数无返回
函数名();
有参数无返回
函数名(参数);
无参数有返回
$result=函数名();
有参数有返回
$result=函数名(参数);

func_num_args()   返回被调用函数的传入参数个数,类型是整型
func_get_arg()    返回指定的参数值
func_get_args()   返回全部参数的值,类型是数组

var_dump()
判断一个变量的类型与长度,并输出变量的数值,如果变量有值输出的是变量的值并返回数据类型。
此函数显示关于一个或多个表达式的结构,包括表达式的类型与值。数组将会递归展开,通过缩进显示其结构。
print_r($arr1)  输出数组 

include_('test2.php');  调用文件
include_once('test2.php');  仅调用一次,不会出现重复调用的错误

#require和include的区别
require 的使用方法如 require("file.php"); 
通常放在PHP程序的最前面,程序执行前就会先读入require所指定引入的文件,使它变成PHP程序网页的一部份。常用的函数亦可以这个方法将它引入网页中。
include 使用方法如 include("file.php"); 
一般是放在流程控制的处理部分中。PHP程序网页在读到include的文件时,才将它读进来。这种方式可以把程序执行的流程简单化。
_once 后缀表示已加载过的部分不加载。
require之所以放在最前是因为出错就停止运行代码,而include会报错并继续执行。
 
0x09 数组
PHP创建数组不需要指定大小和类型
数组键既可以用系统顺序,也可以自行定义。

数组分类
索引数组:键值为整型。
关联数组:键值为字符串。

数组定义
PHP中定义数组有两种方式:
1)直接为数组元素赋值——比如$array[0]="张三";$array[1]="男";$array["age"]=10;
2)使用array()函数声明——比如$arr1=array(1,2,'name'=>'zhangsan'......);
如果不使用符号"=>"默认为索引数组。
数组打印:使用print_r()或者var_dump()

0x0a 数组遍历
1-使用for循环结构遍历数组
前提是必须是键值连续的索引数组
for($i=0;$i<count($array);i++){} 
count($array) 输出数组元素个数

2-使用foreach语句遍历数组
第一种语法:
foreach($arr as $value){}
第二种语法:
foreach($arr as $key=>$value){} 变量的值与名字没有任何关系,只与所处位置有关,特定位置决定特定值

3-联合使用list()、each()、while循环遍历
each()
需要传递一个数组作为参数,返回数组中当前元素的键值对,并向后移动数组指针到下一个元素的位置。
键值对被返回的是带有四个元素的关联和索引混合的数组,键名为0、1、key、value,0、key的值相同,1、value的值相同。
list()
它并不是真正的函数而是PHP的语言结构。
list仅能用于以数字为键的数组并且假定从0开始。
语法:list($key,$value)=$arr
综合:while(list($key,$value)=each($arr)){}
再次使用之前要调用reset()

4-使用数组的内部指针控制函数遍历数组
数组内部指针是数组内部机制,指向数组的某个元素。
默认指向第一个元素,通过移动或改变指针的位置,可以做到访问数组中的任意元素。
next($arr1)  指针位置后移一个单位
prev($arr1)  指针位置前移一个单位
end($arr1)   指针位置移到最后
reset($arr1) 指针无条件移到第一个单位
current($arr1)  读取当前指向的值
key($arr1)      指针指向的内容的键

0x0b 预定义数组
$_GET   通过HTTP GET(URL请求)提交到脚本的变量 
$_POST  通过HTTP POST提交到脚本的变量 
$_REQUEST  通过GET、POST和Cookie机制提交到脚本的变量 
$_FILES  通过HTTP POST文件上传提交到脚本的变量 
$_COOKIE 通过HTTP Cookie提交到脚本的变量
$_SESSION  当前注册脚本会话的变量
$_SERVER 由WEB服务器设定,或直接和当前脚本的执行环境关联的变量 
$GLOBALS 当前脚本有效的变量都会显示,全局脚本

0x0c 数组的键值操作
array_values()  返回数组中所有的值,取出来形态为一个数组
array_keys()    返回数组中所有的键名,取出来形态为一个数组
in_array()      检查数组中是否存在指定的值,参数1为指定的值,参数2为被检查的数组,参数3为如果设置为true——区分大小写、判断是否值与类型都相等
array_search()  在数组中搜索给定的值,如果成功则返回相应的键名
array_flip()    交换数组中的键名和对应的键值
array_reverse() 将原数组中的元素顺序翻转,创建为新的数组并返回,参数1为数组名,参数2如果为true的话键名不变,否则键名丢失

0x0d 统计数组元素个数和唯一性
count()   返回数组中元素的数目
array_count_values()   统计数组中所有值出现的次数
array_unique()   删除数组中重复的值

0x0e 使用回调函数处理数组
array_filter()  用回调函数过滤数组中的元素,参数1为被操作的数组,参数2为定义一个回调函数
回调函数格式:
array_filter($arr1,function fun($value){          //回调函数的参数为数组的值
                            if(判断条件){
                                return true;
                                }
                                return false;});

array_walk()    对数组中的每一个元素使用回调函数,参数1为被操作的数组,参数2为定义一个回调函数(遍历数组里的元素),参数3为给回调函数的额外一个值(若echo,紧跟回调函数结果后面)
回调函数格式:
array_walk($arr1,function fun($value,$kay,$var3){      //回调函数的参数-$value为数组的值,$key为数组的键,$var3为array_walk()的参数3
    echo $value;
    echo $kay;
    echo $var3;
},'abc');  

array_map()     将自定义函数应用给定数组的每个值并返回新的值,参数1为回调函数名,从参数2开始为被操作的数组名(至少一个数组)
回调函数格式:
array_map(function fun($a,$b){   //回调函数的参数即是被操作的数组
            return $a*$b;
    },$a,$b);
0x00 对数组的操作
拆分、合并、分解和接合
array_slice()  截取某个范围的元素
示例-array_slice($arr1,2,3,false);  参数1为原数组,参数2为以此开始的元素序号,参数3为长度(0表示无元素,1表示本身,从2开始从参数2本身往后数的元素个数,负数是从后往前数到本身为止),参数4为是否保留键名(布尔值true-保留 or false-从0开始)
array_splice()  替换选中的元素
示例-array_splice($arr1,1,-1,$arr3);  参数1为原数组,参数2为以此开始的元素序号,参数3为长度(0表示无元素,1表示本身,从2开始从参数2本身往后数的元素个数,负数是从后往前数到本身为止),参数4为进行替换的数(也可以为数组)
array_combine()  合并两个数组为一个新的数组,参数1为作为key的数组,参数2为作为value的数组(如果参数为关联数组的话会使用值而不使用键)
array_merge()    把一个或多个数组合并为一个数组  参数1-n为数组名
array_intersect()  多个数组的交集
array_diff()       多个数组的差集(反交集)

0x0f 数组和数据结构
栈的实现——先进后出
array_push()  将元素放入数组尾部 参数1为数组名,参数2-n为入栈元素
array_pop()   从数组尾部删除元素 参数1为数组名

队列的实现——先进先出
array_shift($arr);  从头部删除元素
array_unshift($arr); 从头部添加元素

其他函数
range(0,123456,2);   返回一个包含指定范围的数组 参数1为最小值,参数2为最大值,参数3为元素值的间隔大小(步长)
array_rand()  从数组中随机选出一个或多个元素 参数1为数组名,参数2为随机元素的个数

0x02 字符串
字符串string:一个字符串由一系列的字符组成,每个字符等同于一个字节。这就意味着PHP只能支持256种的字符集,因此不支持Unicode。
定义一个字符串的最简单的方法是用单引号把它包围起来。
格式:$string='';

常用字符串
ltrim()  删除字符串左侧的空格符或其他的预定义字符
rtrim()  删除字符串右侧的空格符或其他的预定义字符
trim()   删除字符串两侧的空格符或其他的预定义字符
str_pad($str1,10,'x',STR_PAD_BOTH)  将字符串填充为新的长度,参数1为原字符串,参数2为处理后的长度,参数3为要填充的字符(不填默认为空格符),参数4位填补方向-STR_PAD_BOTH/LEFT/RIGHT
strtolower()  字符串转小写
strtoupper()  字符串转大写
strcmp()      比较两个字符串
ucfirst()  字符串首字母大写
ucwords()  字符串每个单词首字母转大写(以空格符分隔)
number_format 数字千位分割
strrev()  翻转字符串
md5()  字符串MD5加密

0x10 正则表达式
正则表达式作为一个字符串匹配的模板,是由元字符、特殊功能字符和模式修正符三部分组成。

界定符
格式:/  /,但除了字母、数字和反斜线以外,任何字符都可以作为界定符,如# ! {} ||

元字符
元字符是正则表达式的最基本组成单位。
*!所有的表示形式都是匹配一个字符。
类型有:普通字符(0-9、a-z、A-Z)、一些特殊字符(任何一个字符都可以作为元字符,但是前提是有特殊意义的字符要使用转义字符反斜线)、非打印字符或自定义元字符表。
非打印元字符
\cx     匹配由x指示的控制字符。如\cM指匹配回车符(Control-M)。x范围是A-Z或a-z之间。如果不在该范围之内,则指代“c”本身。
\f   换页符匹配。等效\x0c和\cL。
\n     换行符匹配。等效\x0a和\cJ。
\r     匹配一个回车符 。等效于\x0d和\cM。
\t     制表符匹配。等效\x09和\cI。
\v     垂直制表符匹配。等效\x0b和\cK。
\s   匹配任何空白字符,相当于[\f\n\r\t\v] 。
\S   匹配任何非空白字符,相当于[^\f\n\r\t\v]-[^\s]
\d   匹配0到9之间的单个数字,相当于[0-9]
\D   匹配非0到9的一个字符,相当于 [^0-9]-[^\d]
\w   匹配a到z、A到Z及数字0到9以及下划线之间的任意一个字符,相当于 [a-zA-Z0-9_] 
\W   匹配非a到z、A到Z及数字0到9以及下划线的任意一个字符,相当于 [^a-zA-Z0-9_]-[^\w]
自定义元字符表-格式为[suiyi]。

限定符
加在元字符后面可以同时匹配多个字符。
*  匹配0到多个,相当于 {0,n} 
?  匹配0到1个,相当于 {0,1} 
+  匹配至少1个,相当于 {1,n} 
\b 匹配单词边界 
^ 字符串必须以指定的字符开始 
$ 字符串必须以指定的字符结束 
{n}  匹配n个
{n,} 匹配至少n个
{m,n} 匹配m到n个
 
0x11 面向对象
对象概念是面向对象技术的核心。
在显示世界里我们所面对的事情都是对象,如计算机、键盘、显示屏等。
在面向对象的程序设计中,对象是一个由信息和对信息进行处理的动作所组成的整体。

0x12 面向对象模型
什么是类:
类是具有相同属性和方法的一组对象的集合。
静态特征称为属性(变量),动态行为称为方法(函数)。
类为属于该类的对象做了一个统一的抽象描述,编程语言中类是一个单独的程序,命名类时(见名知意)应包括属性的说明和行为。

什么是对象:
对象是系统中描述客观事件的一个实体,是构成系统的一个基本单位。
一个对象由一组属性和对属性进行操作的一组行为组成。
从抽象的角度来说,对象是问题域或实现域中某些事物的一个抽象。
对象反映该事物在系统中保存的信息和发挥的作用,它是一组属性和对这些属性操作的行为的一个封装体。
客观世界是由对象和对象之间的联系组成的。

对象的主要三个特性
对象的行为:可以对对象施加的操作。
对象的形态:当施加方法的时候对象如何响应。
对象的表示:对象的表示是唯一表示,具体区分在相同的属性与行为下有什么不同。

类和对象的关系:
类与对象的关系就如模具和铸件的关系,类的实例化就是对象,而对对象的抽象就是类,类描述了一组具有相同属性和行为的对象。
对象是实际存在的,占有动态资源。类是对象的集合,可能占有静态资源,属性占有动态资源。

0x13 定义类和对象
定义类:
class name [可选属性]{
$property=value;  //类的属性
......
function name($arg){   //类的方法
......} 
}
方法的参数可以是基本数据类型、数组和类对象。
基本数据类型和数组:值参传递
类对象:引用传递

生成对象(类的实例化):$对象名=new classname( );
直接调用类方法/变量:class::$name/function

0x14 访问类型
public 公共的(公共修饰符)  类内部与类外部都可以访问
private 私有的(私有修饰符) 只能在类内部访问
protected 受保护的(保护成员修饰符) 子类可以访问,类外部不可以访问
一般来说将类private更符合现实的逻辑。
内部类可以访问类外部的任何成员,包括private成员也可。 
类外部访问内部类成员需要创建内部类的对象,之后可以访问内部类的任何成员。

静态属性和方法
关键字static,用来声明静态属性和静态方法。
在类内部生成一个静态变量或方法能够被所有类的实例化,也就是说静态成员在类第一次被加载的时可以让堆内存里面的每个对象所共享。
静态属性必须在内部就被赋值。
内部声明方法:self::$name/name(属性/方法)
示例:
class name{
public static $name='Kevin';
public static function class(){
    echo "I am".self::$country;
    self::PI;    //访问常量
    //echo $this->name;X 在静态方法中只能操作静态属性
    //self::p();X
}
}
外部调用:类::$静态属性、类::静态方法
需要注意的是非静态类内部不能有静态成员。 

0x15 构造函数和析构函数
构造函数:在类中起到初始化的作用。
构造函数的生成方法与其他函数一样,只是其名称必须是__construct().
语法:
function __construct($name,$size......){
$this->name=$name;
$this->size=$size;
......
}
对象使用类的属性
在一个类中,可以利用特殊指针$this。
在类的内部访问属性时用$this->name=$name
$this指代对象(调用者)本身,此做法可以对调用者进行过滤和控制。

析构函数
当对象脱离其作用域时(例如对象所在的方法已调用完毕),系统自动执行析构函数。
一般应在结束前在析构函数中释放内存、关闭文件、释放结果集等等。
析构函数没有任何参数。
语法:
function __destruct(){
    ......
    } 

三个重要特性————封装、继承和多态​
0x16 封装
封装性:封装性就是把对象的属性和行为综合成一个独立的单位。
封装一个类需要两步,第一步是将类私有化,第二步是用__set和__get进行读取和赋值的操作。
好处是:隐藏类的具体细节,方便加入逻辑控制,限制对属性的不合理操作,便于修改和增强代码的可维护性。

__get与__set
这两个函数都是系统预定义,进行读取与赋值操作。
__set 设置值通常是域的值
__get 获取值通常是域的值
__call 调用一个对象中不存在的方法时,就会产生错误,用call()处理这种情况。

0x17 继承
概述
子类B的对象拥有父类A的全部属性和方法,叫做B类对A类的继承。
假如一个类从多个类中继承了属性与服务,此为多继承。
通常称继承类为子类,被继承类为父类。
PHP中只有单继承,但一个父类可以被多个子类继承,一个子类只能有一个父类,但是允许关联继承。

extends声明继承关系
语法:
class B extends A{}   B类继承A类
类的外部访问对子类是有效的。
final表示这个类是最终版本,也就是说它不能再被子类调用。

子类与父类
子类继承父类的所有内容,但父类中的private部分不能直接访问。
子类中新增加的属性和方法是对父类的扩展。
子类中定义的与父类的同名的属性和方法是对父类属性和方法的覆盖。

重写的方法
在子类中,使用parent访问父类中的被覆盖的属性和方法。
parent::__construce();
parent::$name;
parent::fun();

对象比较
==  比较两个对象的内容。
=== 比较对象的句柄,即引用地址。

0x18 多态性
多态性是指在父类中定义的属性或方法被子类继承之后,可以具有不同的数据类型或表现出不同的方法。
这种特性使得同一个属性或方法在父类及其各个子类中具有不同的含义。
也就是说同一种方法在子类与父类中执行的结果不同。
instanceof 用来判断对象是否属于某一个类的类型,如果属于返回true,不属于返回false
示例:
class A {
function info(){
echo "A info";
}
}
class B extends A {
function info(){
echo "B info";
}
}
class C extends A {
function info(){
echo "C info";
}
}
function printinfo($obj){
if($obj instanceof A)
$obj->info();
}
$a=new A();
$b=new B();
$c=new C();
printinfo($a); //输出A INFO
printinfo($b); //输出B INFO
printinfo($c); //输出C INFO

0x19 抽象类和接口
抽象类
抽象方法是作为子类的模板使用。
语法:
abstract class Person{
public $name;
abstract function getInfo();
}
抽象类不能被实例化,一个抽象类中必须有一个抽象方法。
任何一个类,如果至少有一个方法是被声明为抽象的,那么这个类就必须也被声明为抽象的。
但是抽象类中可以定义动态函数。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法。

接口
当一个类继承了一个接口之后,它要覆盖接口的所有方法。
接口只能声明常量,接口的方法必须定义为共有public,否则无法继承,接口可以与多个接口间继承。
接口的方法不能有函数体。
接口不能实例化。
抽象类和接口都是为继承做准备的。
语法:
interface PCI{
const TYPE="PCI";
function start();
function stop();
}
接口中的方法可以声明为static
interface A{
    function a();
}
interface B{
    function b();
}
interface C extends A{ 
    function c();
}
class D implements B,C{
function a(){}
function b(){}
function c(){}
}
implements是一个类继承一个接口用的关键字,用来实现接口中定义的抽象方法。

抽象类和接口的区别:
接口可以被多重implements,而抽象类只能被单一extends。
接口只有定义,抽象类可以有定义和实现。
接口的字段定义默认为:public、static、final, 抽象类字段默认是"protected"。
 
0x1a 文件系统处理
概述
任何数据都是在程序运行期间才加载到内存中的,不能永久保存。
需要将数据长久保存通常有两种方式:保存到普通文件中或者数据库中。
文件(资源——可以存入数据库,存入的数据为资源路径)、数据库(信息资源-数据-内容巨大)

——文件类型
php是以UNIX的文件系统为模型的。
文件后缀名无关紧要(都可以运用对应的软件打开),重要的是本身的内容。
在Windows只能获取file,dir和unknow三种类型。
在Linux/Unix下,可以获取block,char,dir,fifo,file,link,unknown7种。

block:块设置文件,如磁盘分区、软驱、光驱cd-rom等。
char:字符设备,I/O(输入输出)传输过程中以字符为单位进行传输的设备,例如键盘、打印机等。
dir:目录类型,目录也是文件的一种/目录文件。
fifo:信息管道,常用于将信息从一个进程传输到另一个进程。
file:普通文件类型,如文本文件、可执行文件等。
link:符号链接,指向文件的指针,相当于windows下的快捷方式。
unknown:未知类型。
php可以使用filetype()函数来获取文件类型。
判断是否为某类文件:is_file()、is_dir()、is_link......

0x1b 文件属性
1)文件属性处理函数
file_exists()    判断文件是否存在,存在返回true,不存在返回false
filesize()       返回文件大小,返回文件大小的字节数,出错返回false。目录文件不会返回文件大小,返回值为0。
is_readable()    判断文件是否可读,存在且可读返回true
is_writeable()   判断文件是否可写,存在且可写返回true
is_executable()  判断文件是否可执行,存在且可执行返回true
filectime()      返回文件创建时间,unix时间戳(从1970年1月1日开始至今所经过的秒数)
filemtime()      返回文件修改时间,unix时间戳
fileactime()     返回文件最后访问时间,unix时间戳
stat()           返回关于文件的信息的数组,出错返回 false,并且发出一条警告。

bool rename(string $oldname,string $newname,[resource $context])
尝试把$oldname重命名为$newname。成功时返回TRUE,失败则返回 FALSE。
例如:rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");

0x1c 目录的基本操作
使用php脚本可以方便地对服务器中目录进行操作,包括创建、遍历、复制、删除等操作。

解析目录路径(url)
绝对路径
$filePath='C:/xampp/htdocs/php/re01.txt';
相对路径
$filePath='./re01.txt';

路径属性
basename(url,[扩展名])   返回路径中的文件基本名,不加参数2返回文件的完整名
dirname(url)    返回去掉文件名的路径
pathinfo(url)   返回一个包括给定路径中目录、基本名、扩展名的关联数组

遍历目录
opendir()    用于打开指定目录,接收一个目录的路径及目录名作为参数,函数返回值为可供其他目录函数使用的目录句柄。若目录不存在或者没有权限则返回false
readdir()    利用目录句柄遍历目录,第一个和第二个运行结果分别为.和..,之后是各个文件
closedir()   关闭目录句柄,无返回值
rewinddir()  将目录句柄重置

#配置文件php.ini--open_basedir 
将PHP所能打开的文件限制在指定的目录树,包括文件本身。
注意用open_basedir指定的限制实际上是前缀,而不是目录名。 
举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是 可以访问的。
所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。例如设置成: "open_basedir = /dir/user/"。
 
#计算目录大小
统计目录的大小只能建立递归函数把目录下的所有文件大小都加起来。
代码示例:
function dirSize($directory){
$total=0; //所有文件大小的加和
if($handle=opendir($directory)){ //获取文件句柄
while($file=readdir($handle)){
//排除两个特殊目录.and..
if($file!='.'&&$file!='..'){
$subFile=$directory.'/'.$file; //拼接路径
//如果为文件
if(is_file($subFile)){
$total += filesize($subFile);
}
//如果为目录
if(is_dir($subFile)){
//递归
$total += dirSize($subFile);
}
}
}
closedir($handle);
return $total;
}
}
$a='../download';
echo round(dirSize($a)/pow(1024,2))."MB"; //round()对浮点数进行四舍五入 round([数字],[小数点后位数]) pow(x,y) 函数返回y的x次方。

建立和删除目录
mkdir()   建立目录
rmdir()   删除空目录
unlink()  删除文件
rename()  重命名文件,参数1旧文件名,参数2新文件名
删除非空目录只能自己建立递归函数。
文件夹也是文件的一种。

#删除整个目录
代码示例:
function delDir($directory){
if(file_exists($directory)){ //判断给定路径是否存在
//获取句柄
if($handle=opendir($directory)){
//遍历目录
while($file=readdir($handle)){
//剔除特殊路径
if($file!='.'&&$file!='..'){
//拼接路径
$subFile=$directory.'/'.$file;
//如果为文件
if(is_file($subFile)){
unlink($subFile);
}
//如果为路径
if(is_dir($subFile));
delDir($subFile);
}
}
//关闭句柄 删除空的文件夹
rmdir($directory);
closedir($handle);
}
}
}
delDir('./re03');

#复制整个目录
代码示例:
<?php
function cpDir($dir1,$dir2){
if(file_exists($dir1)&&file_exists($dir2)){
$dir3="./$dir2/$dir1";
mkdir("$dir3");//组合两个参数,本例中$dir3为"./test/./file1",即在目标文件夹里创建要被复制的文件夹
if($handle=opendir($dir1)){
while($file=readdir($handle)){
if($file!='.'&&$file!='..'){
$subFile=$dir1.'/'.$file;
if(is_file($subFile)){
copy($subFile,"$dir3/$file"); //若为文件,则将文件复制到$dir3中
}
if(is_dir($subFile)){
cpDir("$dir1/$file","$dir2");//若为文件夹,则返回
}
}
}
closedir($handle);
}
}
}
cpDir('./file1','./test');//写程序不要拘泥于参数的多少,先实现要求,再根据经验缩减代码冗余部分
?>

复制文件 
可以在复制过去后重命名
copy('./re01.txt','./re02/re02.txt'); //参数1源文件 参数2目的文件(不能为路径)
目录是不能复制的,只能找到后拷贝。

0x1d 文件的基本操作
文件的打开与关闭
处理文件内容之前,通常需要建立与文件资源的连接即打开文件,同理结束对该资源的操作之后应当关闭资源连接。

文件指针
fopen()   参数1为文件的url,参数2为文件模式。
fclose()  参数为fopen返回的文件指针。
文件模式字符
r   只读
r+    读写
w   只写,从头开始,删除原来的内容。文件不存在就创建
w+  读写,从头开始,删除原来的内容。文件不存在就创建
x   创建并以只写方式打开,将文件指针指向文件头。如果文件存在则打开失败。
x+  创建并以读写方式打开,将文件指针指向文件头。如果文件存在则打开失败。
a   只写,追加方式
a+  读写,追加方式
b   二进制

打开文件有三种选择:
1.打开一个文件为了只读、只写或者读写。
2.如果写文件,可以覆盖所有已有文件内容或者追加。
3.在一个区分二进制文件和纯文本文件的系统上写文件必须执行采取的方式。

写入文件
fwrite()  将字符串写入文件,返回写入字节数。参数1为文件指针,参数2为写入内容,参数3为写入长度。
代码示例:
$f=fopen('./re01.txt','w');
fwrite($f,'abcdefg',888);

读取文件内容
fread() 读取指定长度的字符串,返回读取到的字符串,参数1为文件指针,参数2为读取的长度
fgets() 从文件中读取一行,返回读取到的字符串,参数1为文件指针,参数2填写后返回填写的长度-1个字节
计算机判断一行的标准为回车符(换行符)。

file()
不需要使用fopen()打开文件,将整个文件读到一个数组中。
数组中每个元素对应文件中每一行。
每个元素的值由原文件的换行符分割。
换行符依然在每个元素的值的尾部。
readfile()
此函数可以读取指定的整个文件并立即输出到输出缓冲区,并返回读取到的字节数。
这种方式不需要使用fopen打开文件。

移动文件指针
在对文件进行读写过程中,有时需要指针在文件中跳转,从不同位置读取以及将数据写入不同的位置。
int frell(resource handle(文件指针))  获取文件指针的当前位置
int fseek(resource handle, int offset [SEEK_CUR/SEEK_END/SEEK_SET])  移动文件指针到指定位置
SEEK_CUR 设置指针位置为当前位置加上第二个参数提供的偏转字节
SEEK_END 设置指针位置为EOF加上偏转字节
SEEK_SET 设置指针位置为偏转字节处
bool rewind(resource handle)  移动文件指针到文件开头

0x1e 文件的上传与下载
文件上传
HTTP协议实现了文件上传机制,可以将客户端的文件通过浏览器上传到服务器指定的目录存放。

1)客户端上传设置
浏览器页面
form表单通过<input type="file" name="myfile">标记本地文件。
    标签属性enctype="multipart/form-data" method="POST"
设置上传文件大小<input type="hidden" name="MAX_FILE_SIZE" value=100000>

2)服务器端通过php脚本处理上传
设置php配置文件(php.ini) 等于号后都是默认值
file_uploads=On    确定服务器上的php脚本是否可以接收http的文件上传
upload_max_filesize=2M    限制php脚本处理上传文件大小的最大值,必须小于post_max_size
post_max_size=8M    限制通过POST方法接收信息的最大值,应该大于upload_max_filesize,因为除了文件还有其他信息传递
upload_tmp_dir=NULL  上传文件时临时文件(tmp_name)存放的路径,可以是一个绝对路径

php脚本代码
$_FILES多维数组:用于存储各种与上传文件有关的信息,其他的数据用$_POST接收。
$_POST用于收集来自method="post"的表单中的值。
$_FILES数组中的["myfile"]代表<input type="file" name="myfile">中的name值。
$_FILES["myfile"]["name"]     客户端上传的文件原名称,包括扩展名
$_FILES["myfile"]["size"]      上传的文件大小,单位为字节
$_FILES["myfile"]["tmp_name"] 文件上传后服务器端存储的临时文件名,这是存储在临时目录中的文件名。
$_FILES["myfile"]["error"]    文件上传时的错误:0表示成功,1表示大小超过upload_max_filesize的限制,2表示大小超过表单中MAX_FILE_SIZE的限制,3表示文件只被部分上传,4表示没有上传任何文件
$_FILES["myfile"]["type"]       获取从客户端上传文件的MIME类型
示例:
<?php
print_r($_FILES);
copy($_FILES['myfile']['tmp_name'],'./'.$_FILES['myfile']['name']);  //将缓存文件保存下来
?>

文件下载
定义一个变量$filename,值为要被下载的文件名。
利用head()函数向客户端发送原始的http报文头。
一般为三个参数——Content-Type(MIME类型)、Content-Disposition:attachment;filename=$filename、'Content-Length:'.filesize($filename)
然后利用readfile()函数输出这个文件。
示例:
<?php
$filename="up.txt";
header('Content-Type:text/plain');
header("Content-Disposition:attachment;filename='.$filename");
header('Content-Length:'.filesize($filename));
readfile($filename);
?>
 
0x1f php连接数据库
代码示例:
<?php

//连接数据库
$link=mysql_connect('127.0.0.1','root',''); //主机名、用户名、密码
if($link){
echo "数据库连接成功";
}else{
echo "Error!";
die('数据库连接失败');
}
//mysql_query() 函数执行一条MySQL查询
//设置字符集
mysql_query("SET NAMES 'utf8'");

//进行操作
$createDB="create database phpDB2"; //创建数据库
//执行sql语句
$result=mysql_query($createDB);
if($result){
echo "数据库创建成功";
}else{
echo "数据库创建失败";
}
//mysql_query() 函数执行一条MySQL查询
//选择数据库
mysql_select_db('tmp3',$link) or die('选择数据库失败'); //代码短路

//创建表
$createTable="create table test(name varchar(30))";
if(mysql_query($createTable)){
echo "创建表成功";
}else{
echo "创建表失败";
}

//删除行(记录)
mysql_select_db('tmp3',$link) or die('Error!');
$delete="delete from employee where e_id='1'";
if(mysql_query($deleteTable)){
echo "finished";
}

//修改行
mysql_select_db('tmp3',$link) or die('Error!');
$update="update employee set e_pay='4000' where e_id='2'";
if(mysql_query($update)){
echo "修改成功";
}

//查询数据库
mysql_select_db('tmp3',$link);
$select="select * from employee";
$result=mysql_query($select);
while($row=mysql_fetch_row($result)){ // mysql_fetch_row() 从参数(指定表)中取得一行作为数组元素
print_r($row);
echo "<br/>";
}

//关闭数据库连接
mysql_close($link);
?>
 
整合了上课老师讲的知识和pdf,也包括自己的理解,一些代码小实例。
白衣行侠,轻剑快马。