PHP 的面向对象 与 类
面向对象 == OO
学习面向对象 == XXOO;[学习使我快乐!]
<!--附一个demo类的实例化-->
http://note.youdao.com/noteshare?id=38c6a7efa52f1d7911ac49d6eeb4a5d3&sub=AEAF7398B66F4DD7979E76F2954F8D0E
类文件的书写方式
1函数的文件命名:xxx.func.php
2类的文件名:xxx.class.php(单类文件)
3类的文件名一般与类名相同。类是使用驼峰命名法,每个单词的首字母大写。意味着文件名也要首字母大写。
1.类
class Demo{ //成员属性 public $id = 'obj';//公共的 protucted $name = 'oob';//受保护的 private $age = 1223;//私有化封装的 //被private修饰的成员属性不能够在类的外部进行访问;可以在类的内部访问 //被private修饰的成员方法也不能够在类的外部进行访问 //封装等级问题 //Private = 1; //Protected = 2; //Public = 3; //成员方法 function demo(){ } }
1.声明成员属性必须使用关键字var或者public,private等;
2.声明成员属性时,可以赋值,也可以不赋值。
3.声明成员属性时,不能赋一个函数值。
4.声明成员方法时,需要使用function关键字
5.声明成员方法可以传入参数,也可以不传入参数
6.声明成员方法时,方法允许存在返回值。
7.类中只能出现成员属性和成员方法,不允许出现其他的代码,否则会有语法错误。
2.对象(通过类实例化出来)
实例化格式1:$b = new Demo();
实例化格式2:$b = new Demo;
类和对象的关系:1.对象是由类产生的一个实际的事物或者操作流程。这个过程叫做实例化(实:实际、实体、例、个例、化:过程)
使用对象的成员属性
对象变量->成员属性名;
使用对象的成员方法;
对象变量->成员方法名();
3.类中的魔术方法
__construct();//构造函数
触发时机:在对象实例化的时候自动触发
作用:初始化处成员属性
参数:可以有,可以没有,取决于设定和逻辑
返回值:没有
__destruct();//析构函数
触发时机:在摧毁对象的时候自动触发(unset或者页面执行完毕);
作用:回收对象使用过程中的资源
参数:没有
返回值:没有
__get()
触发时机:访问私有成员属性时自动触发
功能:1,防止访问私有成员属性时报错,2.为私有成员属性访问提供后门
参数:1个。。访问的私有成员属性名称
返回值:可以有,可以没有。
__set()
触发时机: 对私有成员属性进行设置值的时候自动触发
功能:1.屏蔽错误,2为私有成员属性设置值
参数:2个,1个私有成员属性名,2要设置的值
返回值:无
__isset()
触发时机:对私有成员属性进行isset检测时自动触发
功能:1.代替对象外部的isset检测私有成员属性,返回结果
参数:1个 访问的私有成员属性名
返回值: 一般返回isset(属性)的结果
__unset();
触发时机:在对象外部对私有成员属性进行unset操作时自动触发
功能:代替对象外部的unset()操作
参数:1个 私有成员属性名
返回值: 无
__call()
触发时机: 调用不存在的方法时自动触发
功能1.屏蔽错误2.为不存在的方法定义功能
参数:2个,1个是不存在的方法名,1个是所有传入的实参列表;
返回值:可有可无
_sleep()
触发时机:在对象进行串行化操作时自动触发
功能:指定需要串行化的成员属性。
参数:无
返回值:需要返回一个数组类型,每个元素都是需要串行化的成员属性名。
__wakeup()
触发时机:在对象进行反串行化时自动触发
功能:反串行化时自动修改部分成员属性值
参数:无
返回值:无
__tostring()
触发时机:对一个对象进行echo操作时自动触发,
功能:简化操作或者为对象输出值
参数:无
返回值:必须有,并且必须为字符串类型。
__clone()
触发时机:对对象进行克隆操作时自动触发
功能:修改克隆之后的对象的部分成员属性。
参数:无
返回值:没有
__autoload()
关键字
$this 表示当前的对象。
作用:在当前对象的成员方法中,调用当前对象的成员属性
如果代码中具有$this出现,那么该类必须实例化才能使用。
提示:如果要使用连贯操作,在方法的最后必须返回$this,代表当前对象。
self 表示当前类
在类中使用
extends 继承
class 类型 extends 父类,父类2{
写子类独立的成员属性和成员方法
或重构父类的成员属性和成员方法
}
概念:
父类: 被其他类继承的类就是父类,也叫做基类
子类:继承其他类的类就是子类,也叫做派生类
生物学逻辑继承 单继承
社会学逻辑继承 一个徒弟可以有多个师傅的关系 多继承
1.子类继承父类既具备父类中所有的成员属性和方法(私有的除外)
2.子类继承父类之后可以具有子类独有的属性和方法
3.在继承时,子类中允许出现和父类同名的方法,这种情况下不会冲突,而是子类的方法会覆盖父类的方法,这种方式叫做重载(重新加载)
4.魔术方法也可以被子类继承
5.如果父类具有构造方法,子类也具有需要构造方法进行构造的成员属性,此时需要在子类中重载父类的构造方法,并且在构造方法中使用parent::construct();进行调用父类的构造方法,构造继承而来的父类的成员属性。
parent 父类
继承的类中使用,代表父类
final 禁止子类继承父类
1.用来修饰成员方法
2.用来修饰类
1.禁止在子类中重载父类的方法
2.被final修饰的类无法被继承
2.被final修饰的方法或属性也无法被继承
<?php final class Ma{ //成员属性 public $name = '马'; public $sex; //成员方法 //跑 function pao(){ echo '得儿驾~~~~'; } //下崽 final private function xiazai(){ echo '诶呀妈呀,疼死我了,要生了'; } } //骡子类 class LuoZi extends Ma{ } //实例化对象 $lz = new LuoZi; var_dump($lz); $lz->xiazai();
const 类中定义常量
类中的常量不归对象所有,而是归类所有。
1.在类中声明常量使用CONST关键字
2.声明常量时需要给常量赋值
3.声明常量归类所有不归任何对象所有
4.类中常量的访问方式
类外部
类名::常量名
类内部
类名::常量名
Self::常量名
static 声明静态成员
静态成员的特征是:不归对象所有,而是归类所有
1.static 关键字既可以修饰成员属性,也可以修饰成员方法
2.Static声明的成员都是归类所有,而不归对象所有的。在没有对象的情况下,可以通过类来访问。
3.能声明静态成员的就声明静态成员。效率高。
4.具有动态成员的方法不可以声明为静态成员方法
5.如果方法中没有$this存在,那么这个方法实际上已经是一个静态方法。(php版本>5.3之后请写上static关键字)
静态成员访问:
类内部
类名::$静态成员属性名
Self::$静态成员属性名
类名::静态成员方法名();
Self::静态成员方法名();
类外部
类名::$静态成员属性名
类名::静态成员方法名();
对象->静态成员方法名() (方法是引用的 一般不用)
interface 定义接口
implements 继承接口
面向对象的三大特征:封装、继承、多态
1.封装的关键字
Private 私有化封装
Public 公共的
Protected 受保护的
关键字/位置 | 类外 | 子类 | 类内部
---|---|---|---
Private | X | X | √
protected | X | √ | √
public | √ | √ | √
抽象类
```
1.抽象方法就是没有方法体的方法,方法体相当于函数体,抽象方法前,必须使用abstract关键字,且方法后不能写{},但是要写分号结束;
2.如果类中有抽象方法,那么这个类前面也必须使用abstract关键字进行修饰。
3.抽象类中可以具有非抽象方法
4.抽象方法可以有参数。不能有返回值。要实现该抽象方法,必须传入同样的参数
5.抽象类不能直接使用,必须由其他类继承且完全实现出所有抽象方法,才可以使用。抽象类主要是给其他类进行继承操作。
6.抽象类可以继承抽象类
7.抽象类中不可以使用private关键字
// 抽象类 abstract class User{ public $name = ''; abstract function add(); abstract function drop() abstract function show(); abstract function mod(); }
接口
如果一个类中没有任何的非抽象方法,且不存在常量之外的任何成员属性,那么这个类就是一个接口
特征:
1.声明一个接口不使用class关键字而是使用interface关键字
2.接口中的抽象方法不能接abstract关键字。
3.接口只能用public关键字,不可以使用protected 或者private
4.接口中不允许有任何的成员属性,除了常量;
5.接口的继承不是使用extends 而是使用implements关键字
6.Extends只能继承一个普通类或者是一个抽象类,而implements可以同时继承多个接口,从而模拟多继承。
interface Usb{ const U_VERSION = '3.0'; public function tongdian(); public function install(); public function using(); public function uninstall(); }
class usbsb implements usb,Bluetooth{ public function tongdian(){ echo "USB鼠标正在通电"; } public function install(){ echo 'USB鼠标正在安装'; } public function using(){ echo '正在使用USB鼠标'; } public function pressA(){ echo 'USB鼠标正在卸载'; } }
抽象类和接口的区别:
抽象类的成员可以具有访问几倍,而接口的成员全部为public级别。
抽象类可以包含成员属性,而接口只可以有常量
抽象类可以继承接口,而接口不能继承抽象类。
抽象类的成员可以具有具体的实现,而接口不行。
抽象的子类可以选择性实现基类的抽象方法,而接口的子类必须实现。
注:有错或不全面,请路过的大神支出!谢谢