框架开发-PSR/命名空间/trait/smarty

PSR 编码规范

1
2
PHP编码规范PSR(中文版)
https://github.com/PizzaLiu/PHP-FIG

====================================

PDO

  1. 复习 PDO
    • 实例化PDO DSN: mysql:host=127.0.0.1;dbname=xx
    • 设置PDO的连接属性: setAttribute()
      • 是否自动提交
        属性
        PDO::ATTR_AUTOCOMMIT
        
        0 关闭 / 1 开启
        
      • SQL错误处理方式
        属性
        PDO::ATTR_ERRMODE
        
        PDO::ERRMODE_SILENT    无提示(默认)
        PDO::ERRMODE_WARNING   报错WARNING
        PDO::ERRMODE_EXCEPTION 抛出异常
        
      • 返回结果集的形式
        属性
        PDO::ATTR_DEFAULT_FETCH_MODE
        
        PDO::FETCH_ASSOC 关联
        PDO::FETCH_NUM   索引
        PDO::FETCH_OBJ   对象
        PDO::FETCH_BOTH  混合
        
    • PDO的增删改查
      exec() 返回受影响行数 用于增删改
      query() 返回PDOStatement的实例 用于查询
      处理查询结果集
      fetch() 单条数据/一维数组
      fetchAll() 所有数据/二维数组
      使用foreach遍历PDOStatement对象
      
    • PDO对象
      setAttribute() 设置连接属性
      getAttribute() 获取连接属性
      exec() 返回受影响行数
      query() 返回查询结果集对象
      lastInsertId() 返回自增ID
    • PDOStatement对象
      fetch() 单条数据
      fetchAll() 所有数据
      rowCount() 受影响行数
    • 预处理
      • 预处理的优点
        • 对用户的数据 进行过滤 提高安全性
        • 提高批量操作的性能
      • SQL的占位符
        • ?
        • :
      • 绑定参数
        • bindValue()
        • bindParam()
        • execute()
      • 结果集的预处理
        • bindColumn()
1
2
3
4
5
6
7
8
9
10
11
- 事务操作

将多条 SQL操作(增删改),作为一个 整体单元 来操作.
都执行成功 则成功,有一条失败 则都失败.
InnoDB 支持事务 / 行锁机制

begin 开启一个事务的回滚点
rollback 回滚一个事务,回到begin前的状态
commit 提交一个事务,只有被提交的事务,才会被写入表中

MySQL 默认是开启 自动提交的.

====================================

命名空间 (php 5.3 +)

  1. 命名空间概述

  2. 定义命名空间

语法
namespace 命名空间名称;
特点
1. namespace 需要 php 5.3 +
2. namespace 前面不允许有任何的代码(除了namespace自己)
它的作用范围 到下一个命名空间开始 或 脚本结束 为止
3. namespace 只对本脚本起作用
4. 文件里如果没有定义命名空间,则默认在全局空间之中

  1. 定义子命名空间

    namespace a\b\c\d…

  2. 在同一个文件中 定义多个命名空间

    1. 不推荐 一般一个文件中只有一个命名空间
    2. 万不得已 建议使用 {} 将对应的代码包裹
  3. 使用命名空间:基础

非限定名称
直接使用函数/类/常量,没有命名空间成分
限定名称
有命名空间成分,但是不以反斜线开头的. (类似于相对路径)
完全限定名称
以反斜线开头,又有命名空间成分. (类似于绝对路径)

  1. 命名空间 和 动态语言特征

    如果把 函数名/类名/常量名 赋值给变量使用
    在命名空间里 必须使用完全限定名称
    PS. 注意完全限定名称时,必须使用单引号.

  2. namespace 关键字 和 NAMESPACE 常量

    • namespace 关键字
      • 定义命名空间
      • 用来简化调用
    • NAMESPACE 常量
      • 获取本命名空间的名字

    ::class

    自 PHP 5.5 起,关键词 class 也可用于类名的解析。
    使用 ClassName::class 你可以获取一个字符串,包含了类 ClassName 的完全限定名称。
    这对使用了 命名空间 的类尤其有用。 
    
  3. 使用命名空间:别名/导入
    别名

    use 命名空间 [as 别名];
    

    导入

    use 命名空间\类名 [as 别名]; 
    只能导入类 不能导入函数
    
  4. 全局空间

namespace {}

  1. 使用命名空间:后备全局函数/常量

  2. 命名空间的实用

==============================================

Trait (php 5.4 +)

  1. Trait的概述
    Trait 是 PHP5.4 中的新特性,是 PHP 多重继承的一种解决方案。
    例如,需要同时继承两个类或抽象类,
    这将会是件很麻烦的事情,Trait 就是为了解决这个问题。

  2. Trait的简单使用
    格式:

    trait 名字 { 属性 + 方法}
    

    特点:

    1. 不能有常量
    2. 不能被实例化的
    3. 在类中 使用use关键字 来混入trait
    
  3. 多个Trait的引用

    use A,B;

  4. Trait之间的嵌套

    一个trait可以由多个trait组成
    可以在trait中 使用use …

  5. Trait的属性

    在trait中 可以定义属性并且可以使用
    但是在使用了use 的类中,不允许重复定义与trait同名的属性

  6. Trait的方法优先级

    class 中 如果有和trait重名的方法 则class附带trait
    继承时,trait方法会覆盖class的同名方法

  7. Trait的修饰符
    static

    静态的属性只能静态读取,静态的方法可以 动/静 态调用
    

    abstract

    如果在trait中有抽象方法 则 在use的类中必须实现才可使用
    
  8. Trait冲突

    1. 代替
      insteadof 指定替代的方法
    2. 起别名
      使用 as 给方法起别名

模版引擎

  1. 什么是模板引擎

    1.1 定义

    模板引擎实现 前后端的分离
    

    1.2 优势

    分工明确
    程序灵活性
    代码可读性
    提高开发效率
    

    1.3 问题

    会降低执行效率
    

    1.4 模板引擎分类

    编译型
    解释型
    置换型
    
  2. 选择 smarty 模板引擎

    2.1 为什么选择smarty

    1). 编译型 速度较快
    2). php 官方推荐
    

    2.2 smarty 优势

    1). 开源
    2). 插件机制
    3). 模板继承
    4). 缓存控制
    
  3. 安装smarty及初始化配置

    3.1 获取smarty

    http://www.smarty.net/
    

    3.2 搭建smarty入口文件

    1). 导入smarty
    2). 实例化smarty
    3). 初始化 配置
         配置 模板文件 目录
         配置 编译文件 目录
         配置 配置文件 目录
         配置 缓存文件 目录
         配置 模板变量的定界符
         配置 缓存控制 (开启缓存/缓存时间)
    4). 分配变量 assign()
    5). 加载模板 display()
    
  4. smarty的基本应用

    4.1 程序员(PHP)

    1). smarty初始化配置
    2). 运算操作: 数据库 文件, 数据计算...
    3). 缓存控制, 插件扩展...
    

    4.2 美工(模版)

    1). 把模板变量放在指定的位置
    2(). 其他操作: 遍历数据、 模板函数...
    
  5. smarty设计的基本语法

    5.1 注释

    `{**}`
    

    5.2 模板中路径问题

    模版文件中所有的相对路径 都相对于 PHP定位
    link/script/img/a
    

    5.3 模板中读取变量

    输出规则 同 echo 一致
    

    5.4 在模板中定义变量

    {assign var="" value=""}
    {assign "param" "value"}
    {$param = value}
    

    5.5 忽略解析

    {literal}{/literal}
    
  6. smarty模板中的变量应用

    6.1 在模板中遍历 数组

    {foreach}{/foreach}
    {section}{/section}
    

    6.2 模板中读取内置变量(保留变量)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    {smarty.post}        POST
    {smarty.get} GET
    {smarty.request} 请求数据
    {smarty.session} SESSION
    {smarty.cookies} COOKIE
    {smarty.server} 服务器信息
    {smarty.const} 常量
    {smarty.version} Smarty版本
    {smarty.template} 模板文件
    {smarty.current_dir} 模板文件目录
    {smarty.now} 当前时间
    {smarty.ldelim} 左定界符
    {$smarty.rdelim} 右定界符
  7. 缓存控制

    7.1 缓存的配置

    caching           是否开启缓存
    cache_lifetime    缓存时间
    cache_dir         缓存目录
    

    7.2 默认 一个模板 对应一个缓存

    7.3 一个模板 产生 多个缓存

    display(url, 缓存号);
    
1
2
3
4
5
6
7
7.4 为缓存 减少开销
isCached(url, 缓存号);

7.5 清除缓存
clearCache(url, 缓存号);
clearCache(url);
clearAllCache();
  1. 模板继承
    {extends file=””}
    {block name=””}{/block}

  2. 内置函数
    9.1 内置函数

    {include}
    {config_load}
    {extends}
    

    9.2 内置块状函数

    {foreach}{/foreach}
    {if}{/if}
    {block}{/block}
    

smarty模板引擎

版本不同,对于PHP的支持也不相同 , 推荐使用3.1.10版本

新建工作目录:

1
2
3
/emplates/i.html
/emplates/.htaccess(Apache的分布式配置文件)
/libs(smarty库)

配置.htaccess文件,闲置用户直接访问模板引擎

1
deny from all

创建基础配置文件init.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 1). 导入smarty
require './libs/Smarty.class.php';
// 2). 实例化smarty
$smarty = new Smarty();
// var_dump($smarty);
// 3). 初始化 配置
// 配置 模板文件 目录
$smarty->template_dir = './templates';
// 配置 编译文件 目录
$smarty->compile_dir = './templates_c';
// 配置 配置文件 目录
$smarty->config_dir = './configs';
// 配置 缓存文件 目录
$smarty->cache_dir = './caches';
// 配置 模板变量的定界符
// 原有定界符为{},可能会和css及js使用冲突,建议修改
// 通常使用{{ }}或<{ }> 甚至<!-- --> 或 << >>
$smarty->left_delimiter = '{{';
$smarty->right_delimiter = '}}';

// 配置 缓存控制 (开启缓存/缓存时间)
#不设置时间默认一个小时
$smarty->caching = false; #默认false关闭
$smarty->cache_lifetime = 10; #设置10s

创建入口文件index.php

1
2
3
4
5
6
7
8
9
10
require './init.php';
// 4). 分配变量 assign()
$smarty->assign('title','标题');
$smarty->assign('content1','内容1');
$smarty->assign('content2','内容2');
$smarty->assign('content3','内容3');
$smarty->assign('content4','内容4');
// 5). 加载模板 display()
$smarty->display('./1.html');

注释:

{* 注释内容 *}

路径问题:

  • 加载css或图片路径为当前入口位置(index.php)为基准
  • 但在加载的css文件中引用图片路径时, 是以当前css文件为基准的

输出类型

模板中所有assign输出都是echo 机制 , true被解析为1 , false被解析为空字符串 , 不能输出数组 和 对象数据

  • 对于数组, 可以使用 {var_dump($arr)} 的格式输出 , 也可以使用 {$arr[2]}{$arr.2} 读取
  • 对于obj对象 , 首先需要$smarty->assign('obj',new User()); , 然后在html模板中使用 <p>{$obj->name}</p> <p>{$obj->demo()}</p> 调用