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级别。

抽象类可以包含成员属性,而接口只可以有常量

抽象类可以继承接口,而接口不能继承抽象类。

抽象类的成员可以具有具体的实现,而接口不行。

抽象的子类可以选择性实现基类的抽象方法,而接口的子类必须实现。

 

 注:有错或不全面,请路过的大神支出!谢谢

 

posted @ 2018-03-01 17:18  it蛋散  阅读(165)  评论(0编辑  收藏  举报