PHP的面向对象:
===================================================
概念:对象(实体)、类、
类与对象的关系。
oop面向对象编程的特点:封装、继承、多态
一、如何定义一个类,和使用
-------------------------------------
1.1 语法格式:
[修饰符]
class 类名{
【成员属性】定义变量
【成员方法】定义函数
}
[修饰符] class 类名 [extends 父类] [implements 接口1[,接口2...]]{
【成员属性】定义变量
【成员方法】定义函数
}
1.2 其中成员属性格式:
修饰符 $变量名[=默认值]; 如:public
$name="zhangsan";
注意:成员属性不可以是带运算符的表达式、变量、方法或函数的调用。 如:
public $var3 =
1+2;
public $var4 = self::myStaticMethod();
public $var5 =
$myVar;
正确定义方式:
public $var6 = 100; //普通数值(4个标量:整数、浮点数、布尔、字串)
public
$var6 = myConstant; //常量
public $var7 = self::classConstant; //静态属性
public
$var8 = array(true, false);
//数组
常用属性的修饰符:public、protected、private、static
1.3
其中成员方法格式:
[修饰符] function 方法名(参数..){
[方法体]
[return
返回值]
}
常用的修饰符:public、protected、private、static、abstract、final
1.4
对象: 他是通过new 类()来产生的对象。其中new称为实例化
也就是:类的实例化就会产生一个对象。
如: $p = new
Person();
1.5 $this 关键字: 表示自己,表示当前使用对象。
我们在类中调用自己的成员属性或函数都是使用 $this->调用。
注意:非静态方法中可以使用this关键字
二、构造函数和析构函数
------------------------------------------
2.1.
构造方法(构造函数):
当我们通过new关键字来创建一个对象时,第一个自动执行的方法称为构造方法。
方法名__construct();
主要用于初始化对象。
2.2. 析构方法:当这个对象被销毁时最后自动调用的方法,称为析构方法。
__destruct();
目的是释放资源(如关闭连接、文件,释放资源)
三、封装(访问控制)
--------------------------------------------------------------------
3.1
封装:就是将属性私有,并提供公有的setter放置与getter取值方法
public(公有) protected(受保护) private(私有)
===========================================================
在类中 Y
Y Y
在子类中 Y Y N
在类外边 Y N N
四、 重载
----------------------------------------------------------------
4.1
属性重载中的四个魔术方法:__set() __get() __isset() __unset()
*
__get():当我们直接输出一个对象中的非公有属性时会自动调用的方法,
并将属性名以第一个参数传进去。
__get($name){...}
* __set();
当我们直接设置一个对象中的非公有属性时会自动调用的方法,
并将属性名以第一个参数,值作为第二参数传进去。
__set($name,$value){...}
__isset()当对未定义的变量调用isset() 或 empty()时,__isset()
会被调用。
//当isset判断一个对象的私有或受保护的属性是否存在时,自动调用此方法。
public function
__isset($param){
return isset($this->$param);
}
__unset()当对未定义的变量调用unset()时,__unset()
会被调用。
//当unset销毁一个对象的私有或受保护的属性时,自动调用此方法。
public function
__unset($param){
unset($this->$param);
}
4.2
方法的重载:
mixed __call ( string $name , array $arguments )
mixed
__callStatic ( string $name , array $arguments ) php5.3.0支持
当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。
当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。
五、
继承
----------------------------------------------------------------------------
5.1.
继承:extends
假如B类继承A类,那么就继承了A中所有非私有属性和方法(函数)。
其中A叫父类(基类)。 B叫子类(派生类)
class
B extends A{
....
}
在php中类只支持【单一继承】,就是一类只能继承一个父类。
parent关键字:若子类出现覆盖父类的方法,那么有时还想调用被覆盖掉了的方法,
我们就是用关键字【parent::父类方法】还有使用类名
class A{
public function
__construct(){
//....
}
}
class B extends
A{
public function
__construct(){
parent::__construct();//注意要调用一下父类的构造方法
//....
}
}
六、
final、static和const
---------------------------------------------------------------
6.1
final关键字:主要用于修饰类与成员方法(函数)
使用final关键字修饰类,表示这个类不可以有子类。(一般是没有必要有子类的,防止有子类的覆盖)
使用final关键字修饰的方法,不可以在子类中被覆盖。
目的:一是为了安全,二是没有必要
6.2
static关键字:表示静态的意思: 用于修饰类的属性和方法
static关键字修饰方法称为静态方法,可以不用new(实例化)就可以直接使用方法:如
类名::方法名
注意:静态方法在实例化后的对象也可以访问
//$对象名->静态方法名
static关键字修饰属性称为静态属性,可以不用new(实例化)就可以直接访问属性:如
类名::属性名
注意:静态属性在实例化后的对象不可以访问; //$对象名->静态属性名
注意:静态属性是共享的。也就是new很多对象也是共用一个属性
在静态方法中不可以使用非静态的内容。就是不让使用$this
在静态的方法中可以使用其他静态属性和静态方法,不过要使用self关键字:
如
【self::静态属性名】或【self::静态方法名】
6.3. const关键字: 在类中修饰成员属性,将其定义成常量(不可修改的),
一般要求常量名都是大写的,没有“$”符
没有其他修饰符(public)
在其他方法中使用常量: 【self::常量名】
定义格式: const 成员常量名="值";
使用:在类的方法中: echo self::成员常量名;
在类的外部: echo
类名::成员常量名;
=========================================================
oop第三天
=========================================================
七、
类型约束
----------------------------------------------------
1.
类型约束可以使用的类型是:数组或对象。
若指定的一个类名,那么可传入本类及子类的对象进去。
可以使用的约束类型:数组array,类名、抽象类名、接口名
//如下面的类
class
MyClass
{
/**
* 测试函数
*
第一个参数必须为类OtherClass的一个对象
*/
public function test(OtherClass $otherclass)
{
echo $otherclass->var;
}
/**
* 另一个测试函数
* 第一个参数必须为数组
*/
public function
test_array(array $input_array) {
print_r($input_array);
}
}
12. 对象复制clone 克隆一个对象,因为对象属于引用类型,普通的“=”号属于引用赋值,所有需要clone来复制一份。
13. __toString()方法:魔术方法,当我们直接要输出一个对象时,如echo $a,print $a,
那么会自动调用的方法。
注意:__toString()方法必须返回一个字串类型的值。
15. *自动加载类函数__autoload(类名):
当new
实例化一个对象时,这个类若不存在,则自动调用此函数,并将类名存入参数
我可以使用这个实现类的自动加载。
16.
对象序列化(串行化)(webservice)(在对象持久化存储、和传输中使用)
-------------------------------------
serialize()
-- 串行化
unserialize() -- 反串行化
php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。
unserialize()函数能够重新把字符串变回php原来的值。
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
__sleep 和 __wakeup
__sleep():
是执行串行化时自动调用的方法,目的是实现资源类型的属性实关闭操作。
注意:sleep方法需要返回一个数组,其中数组中的值是串行化时要保留的属性名
__wakeup():是在执行反串行化时自动调用的方法,目的是实现资源属性的打开(sleep方法关闭的资源)
public function __sleep(){
return array(‘server‘, ‘username‘,
‘password‘, ‘db‘);
//此串行化要保留四个属性
}
17. 抽象类:
当类中有一个方法,他没有方法体,也就是没有花括号,直接分号结束。
如 public abstract
function
fun();
象这种方法我们叫抽象方法,必须使用关键字abstract定义,
包含这种方法的类必须是抽象类也要使用关键字abstract加以声明。
抽象类的特点:
不能实例化,也就new成对象
若想使用抽象类,就必须定义一个类去继承这个抽象类,并定义覆盖父类的抽象方法(实现抽象方法)。
其实抽象类对于子类(实现类),有一个约束的作用,
含有抽象方法的类肯定是抽象类,但是不是所有的抽象类都必须包含抽象方法。
18. 接口
假如一个抽象类中所有的方法都是抽象的,那么我们可以使用另外一种方式定义:接口
接口使用关键字interface来定义,接口中只能有常量与抽象方法。
格式:
interface
接口名{
[常量定义]
[抽象方法定义] //注意不要有abstract关键字
}
实现方式:class 类名 implements 接口名,接口名2{
实现体。。
}
19. 多态(使用方式):对于同一个方法,传入不同对象,实现了不同的效果,这个就是多态的意思,
需要使用的技术:继承或实现,方法的覆盖(重载,重写)。
20。
异常处理:
在php5中有一种新的错误处理机制--异常处理:(采用面向对象方式的)
涉及的类:Exception异常类
结构:
<?php
class
Exception
{
protected $message = ‘Unknown exception‘; //
异常信息
protected $code = 0; // 用户自定义异常代码
protected
$file; // 发生异常的文件名
protected $line;
// 发生异常的代码行号
function __construct($message = null, $code = 0);
final function getMessage(); // 返回异常信息
final function
getCode(); // 返回异常代码
final function getFile();
// 返回发生异常的文件名
final function getLine(); //
返回发生异常的代码行号
final function getTrace(); // backtrace()
数组
final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
/* 可重载的方法 */
function __toString(); //
可输出的字符串
}
?>
使用:
1. throw new Exception("年龄不可以为负数");
//异常抛出
2.
try{
//捕获异常
$s->age=30;
$s->age=-40;
3. }catch(Exception
$e){
//异常处理
echo $e->getmessage();
}