命名空间概念
- 什么是命名空间
- 命名空间是一种封装事物的方法:列如:函数,类,方法等
- 命名空间作用:用来解决命名类或应用程序名冲突问题
- 项目中会用到第三方类,第三方类加载进来后,可能与项目中的类名冲突
定义命名空间的要求
namespace
关键字来申明一个命名空间- 所有的代码都可以存在于命名空间中
- 只有三种代码会受到空间影响:类、常量(const)、函数
- 除了类、常量(const)、函数,其它代码也可以写到空间中,但不受到空间影响,其它代码相当于全局代码,可以在任何地方正常使用
- 申明语法命名空间的语法:必须是PHP脚本的第一行代码
namespace.php
<?php
//定义命名空间
//(相当于新建了个文件夹 下面的代码都在这个文件夹中 类、函数、常量(const) 必须通过App\来访问)
namespace App;
class Student {
private $name = "小明";
private $age = 18;
public function __construct(){
echo $this->name."今年".$this->age."岁了";
}
}
function showInfo(){
echo "<h1>18计算机</h1>";
}
const DB_HOST = "127.0.0.1";
app.php
<meta charset="utf-8">
<?php
//引用namespace.php
require_once("./namespace.php");
//通过 空间名\来创建Student对象
$obj = new App\Student();
//通过 空间名\来调用方法
App\showInfo();
//通过 空间名\获取 const 常量
echo App\DB_HOST;
定义子空间命名
-
文件夹可以有子目录的情况,命名空间也有子空间情况
-
目录的分隔号是
/
,空间的分隔号是\
namespace.php<?php //定义子命名空间 namespace App\Home; class Student { private $name = "小明"; private $age = 18; public function __construct(){ echo $this->name."今年".$this->age."岁了"; } } function showInfo(){ echo "<h1>18计算机</h1>"; } const DB_HOST = "127.0.0.1";
app.php
<meta charset="utf-8"> <?php //引用namespace.php require_once("./namespace.php"); //通过 空间名\来创建Student对象 $obj = new App\Home\Student(); //通过 空间名\来调用方法 App\Home\showInfo(); //通过 空间名\获取 const 常量 echo App\Home\DB_HOST;
同一文件同时定义多个命名空间
不建议在同一文件定义多个命名空间
- 简单组合语法
- 大括号语法
- 写了大括号语法文件中所有的命名空间都应该使用大括号
- 除了类名、函数、常量(const)的其它代码也要写到括号中去
- 不包含在命名空间中的代码
- 如果一个文件用大括号语法定义了多个命名空间,全局代码不想放到命名空间中那怎么写?
- 直接
namespace{}
申明匿名空间
使用命名空间
- 相对访问
namespace.php
<?php
namespace App{
class Student {
private $name = "小明";
private $age = 18;
public function __construct(){
echo $this->name."今年".$this->age."岁了<br/>";
}
}
//相对定位
//创建学生对象
$obj = new Student(); //当前命名空间下的Student
$obj2 = new Home\Student2(); //当前命名空间下的Home命名空间下的Student2
}
//定义全局空间
namespace App\Home{
class Student2 {
private $name = "小红";
private $age = 18;
public function __construct(){
echo $this->name."今年".$this->age."岁了";
}
}
}
app.php
<meta charset="utf-8">
<?php
//引用namespace.php
require_once("./namespace.php");
- 绝对访问
namespace.php 代码不变同上
app.php
<meta charset="utf-8">
<?php
//引用namespace.php
require_once("./namespace.php");
echo "<hr/>";
//绝对定位
$obj3 =new \App\Student(); // 根空间下的App下的Student
$obj4 =new \App\Home\Student2();// 根空间下的App下的Home下的Student2
namespace
关键字和魔术方法__NAMESPACE__
- namespace 含义之一,申明空间关键字
- namespace含义二,可以用来自接代表当前空间名,相当于self关键字
<?php
namespace App{
header("content-type:text/html;charset=utf-8");
class Student{
public function __construct(){
echo "小明今年18了";
}
}
//namespace 相当于self
$obj = new namespace\Student();
}
-
魔术常量
__NAMESPACE__
- 获取当前命名空间的字符串名称
<?php
namespace App{
header("content-type:text/html;charset=utf-8");
class Student{
public function __construct(){
echo "小明今年18了";
}
}
//__NAMESPACE__ 获取到的是字符串的空间名
$strObj = __NAMESPACE__."\Student";
//创建对象
$obj = new $strObj();
}
命名空间别名/导入
- 首先导入空间中的类,常量和函数不能导入
- 使用 use 关键字来导入空间中的类、例如:use APP]Home\Student
- 使用 use 关键字来导入空间名 、例如: use App\Home
- 使用 as 关键字,可以给空间或类起个别名
- 给空间起别名 use App\Home as Controller
- 给空间中的类起别名 use App\Home\Student as Student2
<?php
header("content-type:text/html;charset=utf-8");
require_once('./02.php');
//use 导入空间名 默认空间名为最后一个单词
use App\Home;
$obj = new Home\Student("导入空间名");
// 导入起别名 默认空间名就是起的别名
use App\Home as ap;
$obj2 = new ap\Student("导入起空间别名");
//导入空间中的类 默认类名为最后一个单词
use App\Home\Student;
$obj3 = new Student("导入空间中的类");
//导入空间中的类 并起别名 默认类名就是起的别名
use App\Home\Student as stu;
$obj4 = new stu("导入类 起别名");
命名空间在项目中使用
- 空间目录与文件真实物理路基要相同
<?php
header("content-type:text/html;charset=utf-8");
spl_autoload_register(function ($className){
//将空间路径 转成 真实的物理路径
//此时空间路径为 libs\Db 要转换成 ./libs/Db.class.php
$href = "./".str_replace('\\','/',$className).".class.php";
echo "转换后真实路径--->".$href."|-|-|->|";
//转换后 引用进来
if (file_exists($href)) require_once($href);
});
$arr = array(
"db_host" => "127.0.0.1",
"db_user" => "root",
"bd_pass" => "root",
"bd_name" => "test",
"charset" => "utf8",
);
$db = libs\Db::getInstance($arr);
var_dump($db);
PDO
-
PDO 就是 PHP Data Object 的简称
-
PDO 主要用来代替数据库操作类
-
PDO 就是一个系统类
-
PHP 同时可以操作多个数据库,例如: MySQL、SQL Server 、Oracle 、Db2等
-
PDO访问流程图
PDO 开启扩展
- 打开php.ini 配置文件
- 搜索
php_pdo_mysql
找到extension=php_pdo_mysql.dll
- 取消前面的
;
注释 保存 重启服务
- 查看是否开启
<?php
//查看php以开启的配置
phpinfo();
PDO 连接 MySQL
- 创建一个表示数据库连接的 PDO 对象
PDO::__construct( string $dsn[, string $username[, string $password[, array $driver_options]]] )
- 参数
<?php
// 数据库类型:主机;端口号;数据库名;字符集;
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
$username = "root";
$password = "root";
$pdo = new PDO($dsn,$username,$password);
var_dump ($pdo);
PDO exec (增删改)
- 执行SQL语句 除了select 和 show
//执行插入语句
$insertSql = "INSERT INTO `student` VALUES (null,'小明','男',18,'高中')";
$row = $pdo->exec($insertSql);
//简单判断
if ($row <= 0 ){
die("新增失败");
}
echo $row."条记录成功";
PDO query(查)
- 只执行select 和 show语句,并返回一个结果集对象(PDOstatement)
//查询所有数据并排序(倒叙)
$selectSql = "SELECT * FROM `student` ORDER BY Id DESC";
//执行query 并接受返回的结果集对象
$PDOstatement = $pdo->query($selectSql);
//循环结果集 输出
foreach ($PDOstatement as $arr ) {
var_dump($arr);
}
PDO lastInsertId (获取id值)
- 返回最后插入行的ID或序列值
//执行插入语句
$insertSql = "INSERT INTO `student` VALUES (null,'小明','男',18,'高中')";
$row = $pdo->exec($insertSql);
echo "Id为:".$pdo->lastInsertId()."的数据记录成功";
PDO setAttribute()
- 设置属性
PDO::ATTR_CASE
:强制列名为指定的大小写。PDO::CASE_LOWER
:强制列名小写。PDO::CASE_NATURAL
:保留数据库驱动返回的列名。PDO::CASE_UPPER
:强制列名大写。
PDO::ATTR_ERRMODE
:错误报告。PDO::ERRMODE_SILENT
:仅设置错误代码。PDO::ERRMODE_WARNING
: 引发 E_WARNING 错误PDO::ERRMODE_EXCEPTION
: 抛出 exceptions 异常。
PDO::ATTR_DEFAULT_FETCH_MODE
:设置默认的提取模式。关于模式的说明可以在 PDOStatement::fetch() 文档找到。PDO::FETCH_ASSOC
:返回一个索引为结果集列名的数组 {[“name” ]=> “小明”}PDO::FETCH_BOTH
(默认):返回一个索引为结果集列名和以0开始的列号的数组 {[“name” ]=> "小明[0] => “小明”}PDO::FETCH_NUM
:返回一个索引为以0开始的结果集列号的数组 {[0] => “小明”}
//查询所有数据并排序(倒叙)
$selectSql = "SELECT * FROM `student` ORDER BY Id DESC";
//在执行之前 设置提取数据模式
$pdo->setAttriBute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
//执行query 并接受返回的结果集对象
$PDOstatement = $pdo->query($selectSql);
//循环输出
foreach ($PDOstatement as $arr ) {
var_dump($arr);
}
fetcAll()
- 返回一个包含结果集中所有行的数组(二维数组)
//查询所有数据并排序(倒叙)
$selectSql = "SELECT * FROM `student` ORDER BY Id DESC";
//执行query 并接受返回的结果集对象
$PDOstatement = $pdo->query($selectSql);
//查询结果集对象中的所有数据
$arrs = $PDOstatement->fetchAll(PDO::FETCH_ASSOC);
var_dump($arrs);
fetchColumn()
- 从结果集中返回单独的一列
- 默认返回0列的值
<?php
header("content-type:text/html;charset=utf-8");
// 数据库类型:主机;端口号;数据库名;字符集;
$dsn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
$username = "root";
$password = "root";
$pdo = new PDO($dsn,$username,$password);
//根据id查总数据数 根据age求和
$selectSql = "SELECT COUNT(Id),SUM(age) FROM `student`";
//执行query 并接受返回的结果集对象
$PDOstatement = $pdo->query($selectSql);
// 从结果集对象中获取第0列数据
$row = $PDOstatement->fetchColumn(0);
echo " 总数据为:".$row."条";
rowCount()
- 返回受上一个 SQL 语句影响的行数 (总记录数)
$selectSql = "SELECT * FROM `student`";
//执行语句 拿到结果集对象
$PDOstateement = $pdo->query($selectSql);
//获取到总记录数
$row = $PDOstateement->rowCount();
echo " 总数据为:".$row."条";
PDO 错误报告模式
- PDO 错误报告模式有三种:静默模式、警告模式、异常模式
- 静默模式(silent),当PDO执行SQL语句有错时,不显示任何错误(默模式认
- 警告模式 (warning), 当PDO 执行SQL语句有错时。用PHP的错误等级来报告信息
- 异常模式 (exception),当PDO执行SQL语句有错时,先抛出异常后捕获异常
获取错误信息函数
- PDO::errorCode() : 获取错误状态码。如果状态码为“00000”,表示无错误
- PDO::errorinfo(): 获取描述性的信息
警告模式 (推荐使用)
- 要想报告“错误模式错误”,必须先设置错误报告模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
<?php
header("content-type:text/html;charset=utf-8");
$sdn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
$username= "root";
$password = "root";
//创建pdo对象
$pdo = new PDO($sdn,$username,$password);
//设置PDO报错模式
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
//查询数据
try{
$sql = "SELECT1 * FROM `student`";
$PDOStatement = $pdo->query($sql);
foreach ($PDOStatement as $key ) {
var_dump($key);
}
}catch(PDOException $e){
echo "错误行号:".$e->getLine();
echo "<br/>错误文件:".$e->getFile();
echo "<br/>错误状态码:".$e->getCode();
echo "<br/>错误描述信息:".$e->getMessage();
}
PDO预处理
PDO预处理的步骤
1 制作相同结构的SQL语句
//(1)使用占位符“:value”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(:name,:age)";
//(2)使用占位符“?”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(?,?)";
2 预备役相同结构的SQL语句 ($pdo->prepare())
//(1)使用占位符“:value”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(:name,:age)";
//(2)预备役相同结构的SQL语句,返回结果集对象
$PDOStatement = $pdo->prepare($sql);
3 给占位符绑定真正的数据 $PDOSatement->bindValue()
//(1)使用占位符“:value”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(:name,:age)";
//(2)预备役相同结构的SQL语句,返回结果集对象
$PDOStatement = $pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue(":name","小明");
$PDOStatement->bindValue(":age","18");
//(1)使用占位符“:value”来代替真正的数据
$sql = "INSERT INTO student(name,age) VALUES(?,?)";
//(2)预备役相同结构的SQL语句,返回结果集对象
$PDOStatement = $pdo->prepare($sql);
//(3)给占位符绑定真正的数据
$PDOStatement->bindValue("1","小明");
$PDOStatement->bindValue("2","18");
4 PDOStatement::excute()
- 执行绑定的sql语句
<?php
header("constent:text/html;charset=utf-8");
$sdn = "mysql:host=127.0.0.1;port=3306;dbname=test;charset=utf8";
$username = "root";
$password = "root";
//创建pdo对象
$pdo = new PDO($sdn,$username,$password);
//使用占位符“:value”来代替真正的数据 新增语句
$sql = "INSERT INTO `student` VALUES(null,:name,:sex,:age,:education)";
//预备役相同结构的SQL语句,返回结果集对象
$PDOSatement = $pdo->prepare($sql);
//给占位符绑定真正的数据
$PDOSatement->bindValue(":name","小明明");
$PDOSatement->bindValue(":sex","男");
$PDOSatement->bindValue(":age","18");
$PDOSatement->bindValue(":education","大专");
//执行预编译的sql语句
$PDOSatement->execute();