第一章 :类和对象的声明
面向对象(Object oritened)
Ø 面向对象的语法的学习
Ø 面向对象的编程思想的学习
与面向对象相关的单词
Ø OO -- 面向对象 Object oritened
Ø OOA -- 面向对象的分析方法 Object oritened Analysis
Ø OOD -- 面向对象的设计方法 Object oritened Design
Ø OOI -- 面向对象的实现方法 Object oritened implementation
Ø OOP -- 面向对象的程序设计(OOA->OOD-OOI) Object oritened programming
面向对象和面向过程的区分
类和对象的概念
Ø 类:所有事物的操作流程就是一个类,类是一种思想或者未实现的东西。
Ø 对象:所有事物的实体表现都是对象不仅仅是概念上的,所有事物的操作流程的实施过程就是一个对象。
类和对象的关系
Ø 对象是由类产生的一个实例的事物或者操作流程,这个过程叫做实例化。
Ø 类是由多个对象抽象或者说想像总结得来的,这个抽象总结的过程叫做抽化
类和对象的组成
Ø 成员属性:是对特性的描述,在面向对象中叫做成员属性。
Ø 成员方法:是对其功能的描述,在面向对象中叫做成员方法(就是函数)
类的声明
类文件的书写规则
Ø 函数的文件名:xxx.func.php
Ø 类的文件名:xxx.class.php(单类文件)
Ø 类的文件名一般与类名相同。
Ø 类的驼峰命名法是每一个单词的首字母大写,那么意味着类文件名的首字母也要大写。
类的声明规则
Ø 类必须以class关键字开始。
Ø class关键字之后跟类名,类名通常和文件名相同。
Ø 类名之后直接跟着{}。
成员属性书写规则
Ø 声明成员属性必须使用关键字var 或者public,private,protected。
Ø 声明成员属性时,可以赋值,也可以不赋值。
Ø 声明成员属性时,属性值不能赋值一个函数值。
Ø 成员属性的最大作用是为了给成员方法提供一个桥梁的作用。
成员方法书写规则
Ø 成员方法的书写其实和函数一样。
Ø 声明成员方法时,需要使用function关键字。
Ø 声明成员方法可以传入参数也可以不传入参数。
Ø 声明成员方法时,方法允许存在返回值。
Ø 同时需要注意:类中只能出现成员属性和成员方法,不允许出现其他的代码,否则会有语法错误。
类的使用
一般情况下,类是无法直接使用的,需要将类实例化对象之后方可使用。
实例化对象
Ø 格式1: 对象变量 = new类名;
Ø 格式2: 对象变量 = new类名();
对象成员属性的使用
Ø 对象变量->成员属性
对象成员方法的使用
Ø 对象变量->成员方法名();
$this关键字
Ø $this作用:在当前对象的成员方法中调用当前对象的成员属性。
Ø $this表示当前的对象。
Ø 同时需要注意:如果代码中具有$this,那么该类必须实例化才能使用。
第二章:面向对象的特性
魔术方法
在PHP中以两个下划线开头的方法(一种特殊的函数)称之为魔术方法。如果希望PHP调用这些魔术方法,首先必须在类中定义,否则PHP不会执行未创建的魔术方法
注意:PHP将所有以__开头的类方法保留为魔术方法,所以在定义类方法时,除了魔术方法,建议不要以__为前缀.
构造方法
Ø 构造方法:__construct()
Ø 触发时机:在对象实例化的时候自动触发
Ø 作用:初始化成员属性
Ø 参数:可以有,也可以没有,取决于设定和逻辑
Ø 返回值:没有
Ø 注意:如果构造方法具有参数且参数没有默认值,在实例化对象的时候必须在类名()内添加实参值。
Ø 了解:在PHP版本5之前和类名一样的函数也称之为构造方法
析构方法
Ø 析构方法:__destruct()
Ø 触发时机:在销魂对象的时候自动触发(页面执行完毕时)
Ø 作用:回收对象使用过程中的资源
Ø 参数:没有
Ø 返回值:没有
操作私有成员的魔术方法
Ø __get()方法
n 触发时机:访问私有成员属性的时候自动触发
n 功能:1.防止报错。2.为私有成员属性访问提供后门
n 参数: 1个访问私有成员属性的名称
n 返回值:可以有,可以没有
Ø __set()方法
n 触发时机:对私有成员属性进行设置的时候自动触发
n 功能:1.屏蔽错误。2.位私有成员属性设置新值
n 参数:2个。1个是私有成员属性名,1个是要设置的新值
n 返回值:无
Ø __isset()方法
n 触发时机:对私有成员属性进行isset检测时自动触发
n 功能:代替对象外部的isset检测返回结果
n 参数:1个私有成员属性名
n 返回值:一般返回isset(私有属性)的结果
Ø __unset()方法
n 触发时机:在对象外部对私有成员属性进行unset操作时自动触发
n 功能:代替对象外部的unset操作
n 参数:1个私有成员属性名
n 返回值:无
面向对象的三大特性
封装、继承和多态
封装特性
在一个对象产生之后,对象的部分成员属性和成员方法逻辑是是不允许在对象外部调用或者使用的,这就是封装特性的由来
Ø 封装的三个关键字
private 私有的
n 被private修饰的成员属性不能够在类的外部进行访问,可以在类的内部进行访问
n 被private修饰的成员方法也不能够在类的外部进行访问,可以在类的内部进行访问
n var和private只能选取一个
protected 受保护的
public 公共的
Ø 封装等级
n 子类同名的方法封装等级必须大于或者等于父类的封装等级
private = 1;protected = 2; public = 3;
u 基类中private封装的方法,派生类中能用private、protected、 public来封装。
u 基类中protected封装的方法,派生类中能用protected、public来封装。
u 基类中public封装的方法,派生类中只能用public来封装。
n var 是封装关键字,但是他不是一个标准的封装关键字,一般仅用于测试和学习
继承特性
Ø 继承概念
n 父类:被其他类继承的就是父类,也叫做基类。
n 子类:继承其他类的类就是子类,也叫做派生类。
Ø 继承格式
class 类名 extends 父类名{
里面可以写独有的子类方法
}
Ø 继承特点
n 子类继承父类既具有父类中所有的成员属性和方法(私有的除外)
n 子类继承父类之后可以具有子类独有的属性和方法
n 在继承时,子类中允许出现和父类同名的方法,这种情况不会冲突,而是子类的方法会覆盖父类的方法,这种方式叫做重载(重新加载)
n 魔术方法也可以被子类继承
n 如果父类具有构造方法,子类也需要构造方法进行构造成员属性,此时需要在子类中重载父类的构造方法,并且在构造方法中使用parent::__construct();进行调用父类的构造方法,构造继承而来的父类的成员属性。也可以使用类名::__construct()来调用父类的构造方法(该方法不推荐)
n 继承代码的时候不要瞎继承,一定要有逻辑关系
n php继承的特点和其他语言略有不同。PHP是单继承的语言,其他语言可能是多继承
常见关键字
Ø final 关键字
n final 英文意思 最终的 最后的
n 作用:
u 用来修饰成员方法。禁止在子类中重载父类的方法
u 用来修饰类。被final修饰的类无法被继承
Ø const 关键字
n 作用:用于在类中声明常量,这种常量是类中常量不归对象所有,而是归类所有。
n 需要注意:
u 在类中声明常量使用const关键字
u 声明常量时需要给常量赋值
u 声明常量归类所有而不是归任何对象所有
n 类中常量的访问方式
u 类外部:
类名::常量名
u 类内部:
类名::常量名
self::常量名
u 需要记住:
self 表示当前类
$this 表示当前对象
Ø static 关键字
n 在类中使用static声明的成员都是静态成员。
n 静态成员的特征是:不归对象所有,而是归类所有。
u static关键字,既可以修饰成员属性,也可以修饰成员方法。
u static关键字,声明的成员都是归类所有,而不是归对象所有,在没有对象的情况下,可以通过类来访问。
u 能声明静态的成员就声明静态的成员(效率高)。
u 具有动态成员的方法不可以声明静态成员方法。
u 如果方法中没有$this存在,那么这个方式实际上已经是一个静态方法(php版本大于5.3以后要求写上static关键字)
n 静态成员访问:
u 类内部
成员属性
类名::$静态成员属性名
self::$静态成员属性名
成员方法
类名::静态成员方法名();
self::静态成员方法名();
u 类外部
成员属性
类名::$静态成员属性名
成员方法
类名::静态成员方法名();
对象->静态成员方法名();(一般不用)
对象的串行化
将对象变成一个字符串的过程就是对象串行化。
Ø 作用
n 方便长久的保存对象。
n 方便在网络上进行传输。
与串行化相关的魔术方法
Ø __sleep() 方法
n 触发时机:在对象进行串行化操作时自动触发。
n 功能:指定需要串行化的成员属性。
n 参数:无。
n 返回值:需要返回一个数组类型,每个元素都是需要串行化的成员属性名。
Ø __wakeup() 方法
n 触发时机:在对象进行反串行化时自动触发
n 功能:反串行化时自动修改部分成员属性值
n 参数:无
n 返回值:无
Ø 串行化操作:字符串变量 = serializa(对象变量);
Ø 反串行化操作:对象变量 = unserializa(字符串变量);
其他魔术方法
Ø __tostring() 方法
n 触发时机:对一个对象进行echo操作时自动触发
n 功能:简化操作或者为对象输出值
n 参数:无
n 返回值:必须有,并且必须为字符串类型。
Ø __clone() 方法
n 触发时机:对对象进行克隆操作时自动触发
n 功能:修改克隆之后的对象的部分成员属性。
n 参数:无
n 返回值:无
n 注意:对象的赋值默认是引用赋值,不能通过赋值操作获取一个新的对象,获取新对象的操作应该使用克隆操作或者new
n 克隆格式:新变量 = clone 对象变量
Ø __call() 方法
n 触发时机:调用类中不存在的方法时,自动触发
n 功能:1.屏蔽错误。2.为不存在的方法定义一个功能
n 参数:2个 一个是不存在的方法名,一个传入不存在方法的所有参数列表
n 返回值:可有可无
Ø __autoload() 方法
n 后期补充
抽象类
具有抽象方法的类就是抽象类。
抽象方法
没有方法体的方法就是抽象方法。
方法体
方法后面花括号内就是方法体。
抽象方法作用
协同工作、制定标准(领导用的~)
抽象类特征
Ø 抽象方法就是没有方法体的方法,方法体相当于函数体,抽象方法前,必须使用 abstract 关键字,且方法后不能写花括号({}),但是要写分号(;)结束。
Ø 如果类中有抽象方法,那么这个类前面也必须使用abstract 关键字进行修饰。
Ø 抽象类中可以具有非抽象方法。
Ø 抽象方法可以有参数,但不能有返回值。要实现该抽象方法,必须传入同样的参数。
Ø 抽象类不能直接使用(不能被实例化),必须由其他类继承且完全实现出所有的抽象方法,才可以使用。抽象类主要是给其他类进行继承操作。
Ø 抽象类可以继承抽象类。
Ø 抽象类中不可以使用private关键字。
接口
如果一个类没有任何的非抽象方法(所有的方法都是抽象方法),且不存在常量之外的任何成员属性(没有成员属性,常量除外),那么这个类就是接口。
接口的特征
Ø 声明一个接口不使用class 关键字而是使用interface关键字。
Ø 接口中的抽象方法不能接abstrect 关键字。
Ø 接口只能用public关键字,不可以使用protected 或者private
Ø 接口中不允许有任何成员属性,除了常量。
Ø 接口的继承不是使用extends,而是使用implements关键字。
Ø extends 只能继承一个普通类或者是一个抽象类,而implements可以同时继承多个接口,从而模拟多继承。
抽象类和接口的区别
Ø 抽象类的成员可以具有访问级别,而接口的成员全部为public级别。
Ø 抽象类可以包含成员属性,而接口只可以有常量。
Ø 抽象类可以继承接口,而接口不能继承抽象类。
Ø 抽象类的成员具有具体的实现,而接口不行。
Ø 抽象的子类可以选择性实现基类的抽象方法,而接口的子类必须实现。
多态设计模式
就是不同的人做相同的事得到不同的结果
Ø instanceof 运算符
判断是不是一个类的实例化
单例设计模式
最终的结果只能实例化一个对象
Ø 比如:
PDO
PDO一是PHP数据对象(PHP Data Object)的缩写,它是数据库抽象层的一种。
学习PDO理由
Ø 以模块的方式直接打入系统,执行效率高。
Ø 官方推荐使用PDO作为数据库抽象层。
Ø PHP版本从5.3之后都是默认开启PDO。
开启PDO
PDO是一个模块,因此需要时还必须开启。
Ø 找到配置文件php.ini
Extension=php_pdo_mysql.dll (PDO所支持的数据库) 修改开启。
Ø 5.3版本之前的
n 查看 Extension=php_pdo.dll 是否开启,当开启后才代表支持PDO。
n 重启apache服务器。
n 检测phpinfo中对应模块是否开启。
try...catch 语法
PDO是建立在try...catch语法之上
Ø 格式:
try{ //尝试执行某代码
}catch(){
}
PDO类
Ø PDO::beginTransaction — 启动一个事务
启动事务回滚。启动前需要将自动提交关闭(setAttlribute()中设置)。
n PDO::commit 提交一个事物
n PDO::rollBack 回滚一个事物
使用完事物回滚都,需要在将自动提交开启。
Ø PDO::__construct — 创建一个表示数据库连接的 PDO 实例
Ø PDO::errorCode — 错误代码
Ø PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle —错误信息
Ø PDO::exec — 执行一条 SQL 语句(增、删、改),并返回受影响的行数
Ø PDO::getAttribute — 取回一个数据库连接的属性
n PDO::ATTR_AUTOCOMMIT 检测是否开启自动提交
n PDO::ATTR_CASE 获取大小写转换设置
n PDO::ATTR_CLIENT_VERSION 获取客户端信息
n PDO::ATTR_CONNECTION_STATUS 获取链接状态
n PDO::ATTR_DRIVER_NAME 获取驱动名称
n PDO::ATTR_ERRMODE 获取错误模式
n PDO::ATTR_ORACLE_NULLS 获取ORACLE空值转换设置
n PDO::ATTR_PERSISTENT 获取当前连接是否为持久链接
n PDO::ATTR_PREFETCH 获取数据的预计大小(MYSQL不支持)
n PDO::ATTR_SERVER_INFO 查看服务器信息
n PDO::ATTR_SERVER_VERSION 查看服务器的版本
n PDO::ATTR_TIMEOUT 获取超时设置(MYSQL 不支持)
Ø PDO::getAvailableDrivers — 获取PDO支持的数据库类型
Ø PDO::inTransaction — 检查是否在一个事务内
Ø PDO::lastInsertId — 返回最后插入行的ID或序列值
Ø PDO::prepare — Prepares a statement for execution and returns a statement object —准备SQL语句 返回pdo预处理对象。
Ø PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object —执行查询SQL语句
Ø PDO::quote — Quotes a string for use in a query. —字符串转译
Ø PDO::setAttribute — 设置属性
n 设置属性需要两个参数,详情可查手册
PDO::ATTR_CASE:强制列名为指定的大小写。
u PDO::CASE_LOWER:强制列名小写。 (强制转小写)
u PDO::CASE_NATURAL:保留数据库驱动返回的列名。 (默认,不转换)
u PDO::CASE_UPPER:强制列名大写。 (强制转大写)
PDO::ATTR_ERRMODE:错误报告。
u PDO::ERRMODE_SILENT: 仅设置错误代码。(寂静模式、推荐使用)
u 什么叫做寂静模式:
u 有错误不输出
u PDO::ERRMODE_WARNING: 引发 E_WARNING 错误(使用系统警告的方式报错,不推荐使用该方式,会在网页中直接显示错误)
u PDO::ERRMODE_EXCEPTION: 抛出 exceptions 异常。(有错误后抛出异常模式,推荐使用)
PDO::ATTR_AUTOCOMMIT 自动提交
PDO操作MySQL数据库
Ø 链接数据库
n new PDO($dsn,’root’,’密码’);
//实例化PDO类,中的构造方法会链接数据库需要传入对应的参数。
$dsn data source name 数据原名 需要在手册中查找
Ø 判读数据库是否链接成功
n catch(PDOException $e)
//这里使用的是PDO预处理类,该类会自动抛出,因此不用try手动抛出,try只要出现错误就会自动跳过来执行catch。
Ø 选择数据库
n 数据库的选择在链接数据库的时候$dsn 里面的dbname=’数据库名’;
Ø 设置字符集
n 设置字符集就好比向数据库发送一条命令,这里需要使用PDO中的exec()方法
n 对象->exec(“SET NAMES utf8”);
Ø 准备SQL语句
Ø 判断并且处理结果
n 增、删、改时使用exec();方法来执行,且会返回受影响的行数。
n 查询时使用query();方法来执行
Ø 关闭数据库
n PDO会自动关闭数据库,这里不需要自己关闭。
PDOStatement操作数据库
该类为PDO的预处理类使用该类不需要实例化,采用PDO::prepare准备SQL语句,其返回值就是PDO的预处理对象。(其实不用记这么多用到那个查手册就行)
Ø PDOStatement::bindColumn — 绑定一列到一个 PHP 变量
Ø PDOStatement::bindParam — 绑定一个参数到指定的变量名
Ø PDOStatement::bindValue — 把一个值绑定到一个参数
Ø PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。
Ø PDOStatement::columnCount — 返回结果集中的列数
Ø PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令
Ø PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE
Ø PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息
Ø PDOStatement::execute — 执行一条预处理语句
Ø PDOStatement::fetch — 从结果集中获取下一行
Ø PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
Ø PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
Ø PDOStatement::fetchObject — 获取下一行并作为一个对象返回。
Ø PDOStatement::getAttribute — 检索一个语句属性
Ø PDOStatement::getColumnMeta — 返回结果集中一列的元数据
Ø PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集
Ø PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数
Ø PDOStatement::setAttribute — 设置一个语句属性
Ø PDOStatement::setFetchMode — 为语句设置默认的获取模式。
Ø 预处理中的三种绑定方法:
n 第一种:变量问号绑定
变量用问号占位,然后调用预处理对象中的bindParam()方法来绑定
(增)
n 第二种:变量冒号绑定
变量用冒号和随意名占位,然后调用预处理对象中的bindParam()方法绑定
(删)
n 第三种:冒号数组绑定
和第二种一样用冒号和随意名占位,然后调用预处理对象中的execute()绑定执行一气呵成
(改)
Ø 预处理中查的三种方法:
n 第一种:使用fetch()方法 参数看手册
u 第二种:使用fetch()加绑定的方法
n 第三种:使用fetchAll()方法
大数据库存储
Ø 图片的存储就是典型的大数据库存储,这里图片存储数据库采用的是二进制存储,建表是的数据类型要选着BOLB类型。
Ø 首先要在链接抛出异常之后,采用file_get_contents();读取图片的信息,然后和其他数据存储一样,将其存入数据库。
Ø 显示图片到浏览器是不要忘记,用header();通知浏览器相应的图片类型。