反射、PDO
反射
反射是指获取类、方法、属性、参数、注释等封闭信息的方法。
主要用来了解类方法、等内部的代码,反射是通过一系列的类实现的。
反射:Reflection
ReflectionClass 报告类中的信息
ReflectionFunction 报告函数的信息
RefectionException 报告异常类
RefectionMethod 报告方法中的信息
1 |
|
通过反射获取类中的属性、方法、常量
1 | class Student{ |
自定义修改的类,方便修改
通过反射获取代理类的对象
通过调用反射类的newInstance()对象,返回反射
$reflection = new ReflectionClass('Student');
$str $reflection->newInstance();
//返回类的实例
反射可以通过反向代理
来调用方法
正向代理
在运行过程中,如果感知到代理服务器存在就是正向代理。(比如:从局域网进入到外网)
反向代理
在运行过程中,不能感受到代理服务器存在。(比如京东、淘宝,服务器的请求分发我们是不知道的)
- 通过ReflectionMethod的invoke()反向调用
- 如果反向调用的是静态方法,invoke()参数为null
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Student{
private $name;
public __construct($name){
$this->name = $name;
}
public function show(){
echo $this->name,'<br>';
}
public static function test(){
echo 'i am a boy!<br>';
}
}
$reflection = new ReflectionClass('Student');//反射Student类的信息
$stu = $reflection->new Instance('tom');//实例化Student对象,并传递参数
$method = new ReflectionMethod('Student','show');//获取关于show()方法的信息
$method->invoke($stu);//方向代理调用
$method = new Reflection('Student','test');
$method->invoke(NULL);
反射是为了了解系统类或不知道内部结构的类而使用
PDO
连接MySQL的方法
方法一:mysql_*组
开启extension = php_mysql.dll
扩展mysql_connect('localhost','root','aa');
//链接
方法二:mysqli_*组
开启extension = php_mysqli.dll
扩展$link = mysqli_connect('localhost','root','aa','data');
mysqli是mysql的升级版
PDO简介
PDO(PHP data object) PHP数据对象,PDO也是PHP内置的一组类(有三个),在与PDO相关的三个类中提供了一组访问数据库的轻量级,一致性的接口,无论使用什么数据库,都可以通过一致性的接口。操作数据库。
PDO是PHP5以上才支持的特性
开启相应拓展extension = php_pdo_xxx.dll
PDO的核心类:PDO、PDOStatement、PDOException
- PDO:表示PHP程序和数据库直接的一个连接
- PDOStatement:表示一条SQL处理语句,在该语句执行完成时,会返回执行结果
- PDOException:表示PDO产生的异常
实例化PDO对象
(dsn data source name) 数据源名称
dsn 的组成结构:$dsn = 数据库类型:host=主机地址;port=端口号;dbname=数据库;charset=字符编码;
语法:$pdo = new PDO($dsn,数据库用户名,数据库密码);
1
2
3$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=php6;charset=utf8';
$pdo = new PDO($dsn,'root','aa');
var_dump($pdo);
本地主机可以省略,端口号是默认值时可以省略,dbname也是可以省略的,如果dbname省略,表示连接上服务器当时没有选择数据库。
但是数据库类型(mysql:
)不可以省略
数据库类型必须小写
使用PDO对象
$pdo->exec();执行数据操作语句,执行成功返回受影响的记录数,否则返回false;
$pdo->query();//数据查询语句,返回PDOStatement对象
操作数据
1 |
|
查询数据
1 |
|
以上测试,均为单行或单模块测试。其它位注释状态
脚下留心
可以通过列的索引和列的名称来绑定到变量上
绑定列和变量的时候,列的索引从1开始
取出全部数据
1 |
|
PDO事物处理
1 |
|
预处理语句
1 |
|
词法分析—>语法分析->编译->执行
如果一个sql语句要被多次执行,词法分析、语法分析、编译会多次执行,这样效率低下。
使用预处理语句,对预处理语句编译后传递不同的参数即可。
bindParam 与 bindValue 的区别
bindParam第二个参数是取地址,所以只能传递变量
bindValue第二个参数可以传递值也可以传递变量
直接给预处理传递数组的时候要注意
数组中值的个数和顺序要和占位符的顺序一致
参数占位符
1 |
|
PDO 属性
$pdo->setAttribute(键,值);//设置PDO属性
$pdo->getAttribute(键,值);//获取PDO属性
1
2
3
4
5
6
7
8
9
10
11
12
13
$dsn = 'mysql:dbname=php6';
$pdo = new PDO($dsn,'root','aa');
echo $pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);//自动提交
$pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE::UPPER);//强制将列明转换为大写
$pdo->setAttribute(PDO::ATTR_ERRORMODE,PDO::ERRMODE_WARNING);//错误报告为警告模式
$stmt = $pdo->query('select * from admin');
$rows = $stmt->fetch(PDO::FETCH_ASSOC);
echo '<pre>';
var_dump($rows);
PDO异常抛出
PDO 会自动抛出异常1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
try{
$dsn = 'mysql:dbname=php6';
$pdo = new PDO($dsn,'root','aa');//PDO会自动抛出异常
$pdo -> setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//有错误就抛出异常
$stmt = $pdo->query('select * from admin');
var_dump($Stmt-fetch());
$age =60;
if($age>30)
throw new PDOException('年龄不能超过30');
}catch(PDOException $e){
echo '错误信息:'.$e->getmessage(),'<br>';
echo '错误行号:'.$e->getLine(),'<br>';
}
单例模式实现MyPDO类的封装
1 |
|
- PDO的作用
PHP数据对象,内置的一组类(有三个),在与PDO相关的三个类中提供了一组访问数据库的轻量级,一致性的接口,无论使用什么数据库,都可以通过一致性的接口,操作数据库。 - PDO的加载
PDO是PHP5以上才支持的特性
需要开启相应拓展extension = php_pdo_xxx.dll
- PDO技术中的PDO对象
dsn 的组成结构:$dsn = 数据库类型:host=主机地址;port=端口号;dbname=数据库;charset=字符编码;
语法:$pdo = new PDO($dsn,数据库用户名,数据库密码);
- PDO技术中的PDOStatement对象
代表一条预处理语句,并在该语句被执行后代表一个相关的结果集。PDOStatement::bindColumn
— 绑定一列到一个 PHP 变量PDOStatement::bindParam
— 绑定一个参数到指定的变量名PDOStatement::bindValue
— 把一个值绑定到一个参数PDOStatement::closeCursor
— 关闭游标,使语句能再次被执行。PDOStatement::columnCount
— 返回结果集中的列数PDOStatement::debugDumpParams
— 打印一条 SQL 预处理命令PDOStatement::errorCode
— 获取跟上一次语句句柄操作相关的 SQLSTATEPDOStatement::errorInfo
— 获取跟上一次语句句柄操作相关的扩展错误信息PDOStatement::execute
— 执行一条预处理语句PDOStatement::fetch
— 从结果集中获取下一行PDOStatement::fetchAll
— 返回一个包含结果集中所有行的数组PDOStatement::fetchColumn
— 从结果集中的下一行返回单独的一列。PDOStatement::fetchObject
— 获取下一行并作为一个对象返回。PDOStatement::getAttribute
— 检索一个语句属性PDOStatement::getColumnMeta
— 返回结果集中一列的元数据PDOStatement::nextRowset
— 在一个多行集语句句柄中推进到下一个行集PDOStatement::rowCount
— 返回受上一个 SQL 语句影响的行数PDOStatement::setAttribute
— 设置一个语句属性PDOStatement::setFetchMode
— 为语句设置默认的获取模式。 - PDO技术中的PDOException对象
代表一个由 PDO 产生的错误。在自己的代码不应抛出一个 PDOException 异常 - PDO的操作——插入操作
$pdo->exec(); //执行数据操作语句,执行成功返回受影响的记录数,否则返回false。 - 掌握PDO的操作——写操作
??? - 掌握PDO的操作——查询操作
$pdo->query(); //数据查询语句,返回PDOStatement对象 - 掌握PDO的事务操作
$pdo->beginTransaction(); //开启事务
$pdo->rollBack(); //回滚事务
$pdo->commit();//提交事务 - 掌握PDO的预处理
1 |
|
1 | $sql="insert into admin values (null,:p1,:p2,0,0)"; //参数占位符 |
- PDO的属性操作
$pdo->getAttribute(键):获取PDO属性
$pdo->getAttribute(键):获取PDO属性 - PDO的异常处理机制
PDO会自动抛出异常,其他的地方不能自动抛出
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);设置为自动抛出异常
总
反射:获取类中方法、属性、参数、注释等封闭信息的方法
发射的父类(reflection)
ReflectionClass:export():反射出类的内部结构
getMethods():获取所有方法、getProterties():获取所有属性
getConstants():获取常量
通过反射类可以创建代理类的对象 newInstance()
发射通过反向代理调用对象的方法
PDO(PHP data object)提供了一组一致性的接口,用来访问不同的数据库。
要使用pdo之前必须开启pdo扩展
PDO核心类
PDO:表示PHP和数据库的链接对象
PDOStatement类,PDO执行sql语句返回的结果
PDOException:PDO异常
实例化PDO:
$dsn=’mysql:host=主机;port=端口号;dbname=数据库名;charset=字符编码’
PDO($dsn,用户名,密码)
脚下留心:数据类型要小写
使用PDO
$pdo->exec():执行数据操作语句,返回的受影响的记录数或false
$pdo->query():执行数据查询语句,返回的是PDOStatement对象
$pdo->lastInsertId():获取生成的id编号
获取PDOStatement对象中的数据
$pdo->fetch():获取一条数据
$pdo->fetchAll():获取所有数据
$pdo->fetchColumn():获取列
$pdo->fetchObject():获取一行数据,并匹配成对象
$pdo->rowCount():总行数
$pdo->columnCount():总列数
$pdo->bindColumn():将列绑定到变量上
匹配的类型:
PDO::FETCH_BOTH
PDO::FETCH_ASSOC
PDO::FETCH_NUM
PDO事务
$pdo->beginTransaction()
$pdo->rollback()
$pdo->commit()
预处理
$pdo->prepare()
位置占位符(?)
参数占位符(:参数名)
绑定参数
bindValue()
bindParam()
操作数据
$pdo->getAttribute()
$pdo->setAttribute()
异常处理
默认情况下,如果有错误就报错,不会抛出异常,设置如下语句使得自动抛出异常:$pdo->setAttribute(PDO::ERRMODE,PDO::ERRMODE_EXCEPTION)