面向对象:认识或认知事物的一种方法--->类比
对象是类进行实例化后的结果
object -->物质,事物
类 -->抽象:属性-->外观 行为-->做的事(默认情况下的是缺少了该属性或行为则类别就无法确定)
对象-->实体
扩展的附加行为-->接口
特点:面向对象三大特征-->
封装(即隐藏:隐藏被修改的能力) 原因:防止被随意修改
实现封装的手段:访问修饰符,类,函数方法,文件,文件夹
访问修饰符:
public 公共的 谁都可以用,也可以修改
protected 受保护的 只有自己和后代可以使用和修改
private 私有的 只有自己可以使用和修改
继承:面向对象的思想和我们的生活是息息相通的。
继承:扩展父类的内容,注意只能继承public和protected修饰的内容,而private修饰的则不能继承
关键字: extends
PHP中继承是单继承,即extends后面只能有1个类名;但是1个类可以有无数个子类
子类和父类只能出现在有继承关系的2个类之间
在子类中出现和父类同名的方法,这个称为重写行为的重新定义
重写只能发生在有继承关系的类之间,方法名称相同即重写,与参数没有关系
重写时,访问修饰符的可以访问的范围不能低于父类中的访问修饰符
对于private修饰的方法不能重写
多态:(abstract)
1.多态是指在面向对象中能够根据使用类的上下文来重新定义或改变类的性质和行为。
2.PHP不支持重载实现多态,但是PHP可以变向的实现多态效果。
3.php其语法特点,不支持固定变量类型,它是根据上下文来确定当前的类型是什么,即,最后一次赋值是什么类型,现在它就是什么类型。
也就不存在将子类变量赋给基类变量的说法。但php函数的参数,是可以规定类型的,如下面的show函数。如果传递一个不是此类型的参数,
将会在运行时报错。
多态:变化的形态 (abstract) interface接口-->实现implements
接口(interface)是抽象方法和静态常量定义的集合。接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量。
接口中没有其它类型的内容
interface 接口名{
public function getName();
}
接口: 它是一个特殊的类,但是名称变成了interface
在接口中定义的只能是公共的抽象方法(没有函数体部分),也可以有静态常量
接口采用的插件式配置,可以随意的匹配给任意一个类
类可以实现(implements)接口,类实现的接口可以有无数个
当1个类实现了接口后,该接口的所有的方法必须在该类中实现
instanceof 运算符,它用于类型判断
判断某个参数对象是否属于某个类
析构函数:当某个对象成为垃圾或者当对象被显示销毁时执行
构造方法又称为构造函数,是对象创建时自动调用的方法,用来完成类初始化的工作。
static 静态的:
它可以修饰属性变量,也可以修饰函数方法
静态资源加载和普通的非静态的资源加载是不一样滴
在非静态方法中可以调用静态方法,但是反过来就不行
静态static修饰的内容被创建不需要有对象存在,同时它们是被放置在静态区当中
静态资源的标准访问方式是 ====> 类名::静态资源名称
final 关键字,意思是终态的,最后的:
它可以修饰函数方法,被修饰的函数方法不能被重写
final可以修饰类class,但是被修饰的类不能被继承
类当中的属性不能被final修饰
构造函数在创建时调用,析构函数在销毁时调用(在使用 exit() 终止脚本运行时也会被调用)
异常信息处理:@ error_reporting display_errors
命名空间: namespace(一种封装事物的方法)
include include_once require require_once
模板引擎: smarty(分离,分工)
模板文件夹,模板转换后的文件夹,插件库,配置文件,缓存文件
tpl 定界符默认{} -->推荐<{}>
<{}> \ <{if}>...<{/if}>
<{foreach}>
<{foreachelse}>
<{/foreach}>
assign();
display();
SMARTY模板的作用就是用html的语法完成PHP代码的功能,类似于dede模板。他的初衷是将前后台的开发分离开,
前台负责写html+css+js,但是模板中又要输出动态数据,但大多数前端人员不懂PHP ,所以就产生了这个东西。
smarty模板还提供缓存功能,提高网站的访问速度。
Smarty是PHP的"半官方"的模板化引擎,从其主页的位置就可以看出。Smarty的作者是AndreiZmievski和MonteOrte
。它是在GNU宽通用公共许可(LGPL)下发布的,可能是最流行、功能最强大的PHP模板化引擎。
Smarty还提供了很多强大的功能,本章将讨论其中一部分,概括如下。
强大的表现逻辑。Smarty提供了适当的构造,能够有条件地计算和迭代地处理数据。虽然它本身实际上是一种语言,
但语法很简单,设计人员可以很快地学会,而不需要预备的编程知识。
模板编译。为减少开销,Smarty在默认情况下将模板转换为可比较的PHP脚本,使得后续的调用速度更快。
Smarty还非常智能,在内容改变后可以重新编译。
缓存。Smarty还提供了缓存模板的可选特性。缓存与编译不同的是,支持缓存不只是能生成缓存的内容,
还能防止执行个别逻辑。例如,你可以指定缓存文档的生存时间,比如5分钟,在此期间可以忽略与该模板有关的
数据库查询。
高度可配置和可扩展。Smarty的面向对象架构允许修改和扩展其默认行为。此外,从一开始可配置性就是一个设计
目标,为用户提供了很大的灵活性,通过内置方法和属性定制Smarty的行为。
安全。Smarty提供了很多安全特性,可以避免服务器和应用程序数据遭到设计人员有意或无意的破坏。
记住,所有流行的模板化解决方案都遵循同样的一组相同的核心实现原则。与编程语言一样,学习了一种语言
就可以更容易地掌握其他语言。因此,即使不使用Smarty,你也可以继续读下去,使你对这个解决方案有一个初步
的认识,并始终强调一般性的模板化概念。
Smarty(模板引擎):
Smarty是一个使用PHP写出来的PHP模板引擎(让程序逻辑和页面代码分离)
优点:
速度快:相对其他模板引擎(以前)
编译型:采用smarty编写的程序在运行是要编译成一个非模板技术的PHP文件
缓存技术:它可以将用户最终看到的HTML文件缓存成一个静态的HTML页面
插件技术:smarty可以自定义插件
不适合Smarty使用的地方:
需要实时更新的内容(如:股票)
小项目
代码: 类《===》对象
PDO(PHP data objects)
new PDO('数据库连接访问字符串','登录用户名','登录密码','访问的相关参数')
mysql:dbname=cms;host=127.0.0.1;port=3306;charset=utf8
PDO:
exec($sql) --->int类型
query($sql) --->PDOstatement object
prepare($sql) --->PDOstatement object
PDOstatement:
fetch 从结果集中获取下一行
fetchAll 返回一个包含结果集中所有行的数组(二维数组)
fetchObject 获取下一行并作为一个对象返回(默认类名:stdClass)
smarty
is_numeric — 检测变量是否为数字或数字字符串
is_null — 检测变量是否为 NULL
instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例
instanceof 也可用来确定一个变量是不是继承自某一父类的子类的实例
最后,instanceof也可用于确定一个变量是不是实现了某个接口的对象的实例
异常处理:
通常错误的提示信息不会对用户开放,但是用户操作时必须明确是否能够正确的执行
因此我们需要对于可能出现问题的代码内容作出处理,这个就被称为异常处理
异常处理操作: try ... catch... 代码块
try 当中包含可能出现问题的代码,而用catch来对出现的异常进行捕获
一旦有定义好的异常出现,那么在该异常后的语句被跳过不再执行,而去执行输出catch块中的代码
在php中,一般是判断是否能正确返回或者获取到需要的对象或数值,如果没有,则使用throw关键字,抛出异常信息
异常需要大家经验来获取,什么时候会有异常,什么样的异常需要处理和避免
PHP魔术方法
1。__construct()
实例化对象时被调用,
当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用。
2。__destruct()
当删除一个对象或对象操作终止时被调用。
3。__call()
对象调用某个方法, 若方法存在,则直接调用; 若不存在,则会去调用__call函数。
4。__get()
读取一个对象的属性时, 若属性存在,则直接返回属性值; 若不存在,则会调用__get函数。
5。__set()
设置一个对象的属性时, 若属性存在,则直接赋值; 若不存在,则会调用__set函数。
6。__toString()
打印一个对象的时被调用。如echo $obj;或print $obj;
7。__clone()
克隆对象时被调用。如:$t=new Test();$t1=clone $t;
8。__sleep()
serialize之前被调用。若对象比较大,想删减一点东东再序列化,可考虑一下此函数。
9。__wakeup()
unserialize时被调用,做些对象的初始化工作。
10。__isset()
检测一个对象的属性是否存在时被调用。如:isset($c->name)。
11。__unset()
unset一个对象的属性时被调用。如:unset($c->name)。
12。__set_state()
调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。
13。__autoload()
实例化一个对象时,如果对应的类不存在,则该方法被调用。
魔术常量
1。__LINE__
返回文件中的当前行号。
2。__FILE__
返回文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,
而在此之前的版本有时会包含一个相对路径。
3。__FUNCTION__
返回函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
4。__CLASS__
返回类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
5。__METHOD__
返回类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
require
require_once
include
include_once的区别
1、include()
include(/path/to/filename)
include()语句将在其被调用的位置处包含一个文件。包含一个文件与在该语句所在位置复制制定文件
的数据具有相同内容的效果。使用include()时可以忽略括号。
可以根据条件来执行include()语句。在条件语句中使用include()有个怪现象,它必须包围在语句块
大括号中,或者用其他语句包围符括起来。
2、include_once() :
include_once(filename)
include_once()函数的作用与include相同,不过它会首先验证是否已经包含了该文件。如果已经包含,
则不再执行include_once。否则,则必须包含该文件。除了这一点与include完全相同。
3、require() 需求
require(filename)
require()在很大程度上与include相同,都是将一个模板文件包含到require调用坐在的位置。
什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,
在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,
文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt
文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前
得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
一个文件下面可以定义多个命名空间。
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
虽然任意合法的PHP代码都可以包含在命名空间中,但只有三种类型的代码受命名空间的影响,它们是:类,函数和常量。
命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
也可以在同一个文件中定义多个命名空间。在同一个文件中定义多个命名空间有两种语法形式。
<?php
namespace MyProject ;
const CONNECT_OK = 1 ;
class Connection { /* ... */ }
function connect () { /* ... */ }
namespace AnotherProject ;
const CONNECT_OK = 1 ;
class Connection { /* ... */ }
function connect () { /* ... */ }
?>
在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的。可以将 PHP 命名
空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:
1. 相对文件名形式如foo.txt。它会被解析为 currentdirectory/foo.txt,其中 currentdirectory 表示
当前目录。因此如果当前目录是 /home/foo,则该文件名被解析为/home/foo/foo.txt。
2. 相对路径名形式如subdirectory/foo.txt。它会被解析为 currentdirectory/subdirectory/foo.txt。
3. 绝对路径名形式如/main/foo.txt。它会被解析为/main/foo.txt。
PHP 命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用: 1. 非限定名称,或不包含前缀的
类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被
解析为 currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被
解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函
数名称或常量名称。详情参见 使用命名空间:后备全局函数名称/常量名称。
2. 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod
();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。
如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。
下面是一个使用这三种方式的实例:
file1.php
<?php
namespace Foo \ Bar \ subnamespace ;
const FOO = 1 ;
function foo () {}
class foo
{
static function staticmethod () {}
}
?>
file2.php
<?php
namespace Foo \ Bar ;
include 'file1.php' ;
const FOO = 2 ;
function foo () {}
class foo
{
static function staticmethod () {}
}
/* 非限定名称 */
foo (); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo
foo :: staticmethod (); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod
echo FOO ; // resolves to constant Foo\Bar\FOO
/* 限定名称 */
subnamespace \ foo (); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace \ foo :: staticmethod (); // 解析为类 Foo\Bar\subnamespace\foo,
// 以及类的方法 staticmethod
echo subnamespace \ FOO ; // 解析为常量 Foo\Bar\subnamespace\FOO
/* 完全限定名称 */
\ Foo \ Bar \ foo (); // 解析为函数 Foo\Bar\foo
\ Foo \ Bar \ foo :: staticmethod (); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \ Foo \ Bar \ FOO ; // 解析为常量 Foo\Bar\FOO
?>
PDO(PHP Data Objects)是一种在PHP里连接数据库的使用接口。PDO与mysqli曾经被建议用来取代原本PHP在
用的mysql相关函数,基于数据库使用的安全性,因为后者欠缺对于SQL资料隐码的防护。
并不能使用PDO扩展本身执行任何数据库操作,必须使用一个database-specific PDO driver(针对特定数据库
的PDO驱动)访问数据库服务器。PDO并不提供数据库抽象,它并不会重写SQL或提供数据库本身缺失的功能,
如果你需要这种功能,你需要使用一个更加成熟的抽象层。PDO需要PHP5核心OO特性的支持,所以它无法运行于
之前的PHP版本。
在Unix环境下PHP5.1以上版本中:
如果你正在使用PHP5.1版本,PDO和PDO SQLITE已经包含在了此发行版中;当你运行configure时它将自动启用。
推荐你将PDO作为共享扩展构建,这样可以使你获得通过PECL升级的好处。推荐的构建支持PDO的PHP的configure
line应该也要启用zlib。你也应该启用你选择的数据库的PDO驱动 ;关于这个的更多信息请查看database-
specific PDO drivers ,但要注意如果你将PDO作为一个共享扩展构建,你必须也要将PDO驱动构建为共享扩展。
SQLite扩展依赖于PDO,所以如果PDO作为共享扩展构建,SQLite也应当这样构建
./configure --with-zlib --enable-pdo=shared --with-pdo-sqlite=shared --with-sqlite=shared
将PDO安装为一个共享模块后,你必须编辑php.ini文件使得在PHP运行时自动载入PDO扩展。你同样需要启用
那儿的特定数据库驱动;确保他们列出在 pdo. so 行之后,因为PDO必须在特定数据库驱动载入之前初始化。
如果你是以静态方式构建的PDO和特定数据库驱动扩展,你可以跳过这一步。
extension=pdo. so
让PDO作为一个共享的模块将使你可以在新版PDO发布时运行 pecl upgrade pdo 命令升级,而不用强制你重新
构建整个PHP。注意如果你是这样做的,你也需要同时升级你的特定数据库驱动。
在windows环境下PHP5.1以上版本中:
PDO和主要数据库的驱动同PHP一起作为扩展发布,要激活它们只需简单的编辑php.ini文件:
extension=php_pdo.dll
然后,选择针对特定数据库的DLL文件使用 dl() 在运行时加载,或者在php.ini文件中 php_pdo.dll 行后启用
它们,如:
extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
这些DLL文件应当存在于系统的 extension_dir 目录里。
注意 PDO_INFORMIX 只能作为一个PECL扩展使用。
========================================================================================
PHP 5.1 发布时将附带一个全新的数据库连接层,即 PHP Data Objects (PDO)。虽然 PHP 一直都拥有很好
的数据库连接,但 PDO 让 PHP 达到一个新的高度。学习如何获得、安装和使用 PDO,以连接到 IBM? DB2?
Universal Database? 和 IBM Cloudscape? 数据库,插入和检索数据,并探索更多高级特性,例如预处理语句
(prepared statements)、绑定参数(bound parameters)、可滚动游标(scrollable cursors)、定位更新
(positioned updates)以及 LOB。
随着拥有更成熟 OO 语法的 PHP 5 的发布,PHP 越来越多地受到越来越大的机构的关注,对于 PHP 来说,提供
更加一致的和可访问的数据访问 API 变得越来越重要。
PHP 与流行的开放源代码关系数据库管理系统(RDBMS)MySQL 之间总是很有默契。这对拍档的成功很大程度上
是由于它们免费可用,而且进入的门槛也比较低,这两种产品的合作使它们各自都取得了广受推崇的地位。
很多 PHP 应用程序开发人员都习惯于 PHP-MySQL 这对组合,以致 PHP 对其他数据库的支持常常模仿 MySQL
客户机库 API。然而,并不是所有的数据库客户机 API 都是一样的,也不是所有的数据库都提供相同的特性。
虽然存在模仿,但不同的 PHP 数据库扩展都有它们各自的怪僻和不同之处,所以从一种数据库迁移到另一种数据库
时会有一些困难。虽然这不是创建 PDO 的直接原因,但是在设计过程中还是有一定影响的。
如果您是带着想结合使用 PHP 和 DB2 的目的阅读本文,那么您很可能属于以下类型中的一种:
您从一家小公司开始,在 MySQL(举个例子)上运行 PHP,由于业务增长,您需要 DB2 所提供的可伸缩性/可靠性
/支持或其他特性。您希望移植代码,以使用 DB2,但由于 API 的变化,您需要编写或实现一个抽象层,以便在
DB2 上测试应用程序的同时可以继续在旧的数据库上运行。不仅如此,您还希望能有自己的选择,并保留支持其他
RDBMS 的可能性,因为您清楚,有些客户机可能已经和其他平台栓在一起了。
您用 PHP 在 MySQL之上构建了一个小型的部门应用程序(同样,这只是举个例子,我并不是要跟 MySQL 过不去)。
事实证明这个应用程序本身很有用,现在已经在这个部门之外使用,并且闯入了 CIO/CTO 的法眼 —— 现在需要
遵从托管的标准数据库。(是的,这是第一点的一个变种。) 在其他某些复杂的企业级应用程序的后台,您已经
有一个 DB2 实例;您希望利用 PHP 的快速应用程序开发和原型设计来生成动态报告。
PDO: php数据对象 接口 一套访问数据库的标准
PDO:
prepare 预处理语句 没有执行结果(只是编译的结果)
exec 执行一条sql语句,并返回受影响的行数
query 不带任何查询条件的 直接得到查询结果
PDOStatement:
execute 主要执行dml语句 执行一条预处理语句
fetch 从结果集中获取下一行
fetchAll 返回一个包含结果集中所有行的数组
fetchObject 获取下一行并作为一个对象返回
require和include之间有两点重要的区别。首先,无论require的位置如何,制定文件都将包含到出现
require的脚本中。例如,即使require放在计算结果为假的if语句中,依然会包含指定文件。
第二个重要的区别是:require出错时,脚本将停止运行,而在使用include的情况下,脚本将继续执行。
4、require_once() :如果没有对应文件,发出错误提示,且程序终止并推出
require_once(filename)
随着网站越来越大,可能会出现重复包含某些文件。这也许不是问题,但又是修改了所包含文件的变量后,
却由于后面再次包含原来的文件而被覆盖,可能不希望出现这种情况。还可能出现另一个问题,即所包含
文件中函数名的冲突。使用require_once就可以解决这些问题。
require_once函数确保文件只包含一次。在遇到require_once后,后面再试图包含相同的文件时将被忽略。