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级别。
抽象类可以包含成员属性,而接口只可以有常量
抽象类可以继承接口,而接口不能继承抽象类。
抽象类的成员可以具有具体的实现,而接口不行。
抽象的子类可以选择性实现基类的抽象方法,而接口的子类必须实现。
注:有错或不全面,请路过的大神支出!谢谢
PHP 的面向对象 与 类的更多相关文章
- OC学习总结之面向对象和类
OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程 面向对象和面向过程是编程的两种思考方式.面向对象 ...
- Java面向对象 Object类 内部类
Java面向对象 Object类 内部类 知识概要: 一:Object类 二:内部类 匿名内部类的写法 1.Object O ...
- 【转】Python之面向对象与类
[转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...
- Java面向对象-Java类的继承及super关键字
Java面向对象-Java类的继承 1,继承定义以及基本使用 定义:子类能够继承父类的属性和方法: 注意点:Java中只支持单继承: 私有方法不能继承: 上代码: package com.java12 ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- Python基础-面向对象初识--类
什么是类 具有相似功能和属性的一类实物 什么是对象 类的具体体现,具体到一个 面向对象的优势 1.类是一组相似功能的集合,使组织结构更加清晰和规范化 2.研究面向对象要有上帝的思维,用面向对象设计程序 ...
- python 面向对象与类的基本知识
一 什么是面向对象,面向对象与类的关系. 面向对象的程序设计是用来解决扩展性. 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象 ...
- Python之面向对象新式类和经典类
Python之面向对象新式类和经典类 新式类和经典类的继承原理: 在Python3中,就只有新式类一种了. 先看Python3中新式类: 类是有继承顺序的: Python的类是可以继承多个类的,也就是 ...
- Python之面向对象元类
Python之面向对象元类 call方法: class People: def __init__(self,name): self.name=name # def __call__(self, *ar ...
- Python 面向对象之一 类与属性
Python 面向对象之 类与属性 今天接触了一下面向对象,发现面向对象和之前理解的简直就是天壤之别,在学Linux的时候,一切皆文件,现在学面向对象了,so,一切皆对象. 之前不是一直在学的用面向函 ...
随机推荐
- restapi(8)- restapi-sql:用户自主的服务
学习函数式编程初衷是看到自己熟悉的oop编程语言和sql数据库在现代商业社会中前景暗淡,准备完全放弃windows技术栈转到分布式大数据技术领域的.但是在现实中理想总是不如人意,本来想在一个规模较小的 ...
- Kafka权威指南阅读笔记(第六章)
Broker配置 Kafka可以同时拥有可靠的主题和非可靠的主题.非可靠的主题允许丢失. 复制系数 主题级别的配置参数是 replication.factor,在Broker级别则可以通过defaul ...
- nginx配置中location匹配规则详解
一.概述 nginx官方文档给出location语法如下: 1 location [=|~|~*|^~] uri { … } 其中,方括号中的四种标识符是可选项,用来改变请求字符串和uri的匹配方式. ...
- vue 父子组件通信详解
这是一篇详细讲解vue父子组件之间通信的文章,初始学习vue的时候,总是搞不清楚几个情况 通过props在父子组件传值时,v-bind:data="data",props接收的到底 ...
- fenby C语言 P16
while先判断,不符合,不执行 dowhile后判断,不符合,执行一次 #include <stdio.h> int main(){ int i=1,sum=0; do{ sum=sum ...
- Dubbo学习系列之十六(ELK海量日志分析框架)
外卖公司如何匹配骑手和订单?淘宝如何进行商品推荐?或者读者兴趣匹配?还有海量数据存储搜索.实时日志分析.应用程序监控等场景,Elasticsearch或许可以提供一些思路,作为业界最具影响力的海量搜索 ...
- 图数据库PageRank算法
目录: 定义 计算原理 定义: 假设对象A具有指向它的对象T1 ... Tn.参数d是阻尼系数,取值范围在0和1之间,通常将d设置为0.85.C(A)被定义为从对象A出去的连接数. 对象A的PageR ...
- Phpstudy隐藏后门
Phpstudy隐藏后门 1.事件背景 Phpstudy软件是国内的一款免费的PHP调试环境的程序集成包,通过集成Apache.PHP.MySQL.phpMyAdmin.ZendOptimizer多款 ...
- numpy.array 合并和分割
# 导包 import numpy as np numpy.array 的合并 .concatenate() 一维数组 x = np.array([1, 2, 3]) # array([1, 2, 3 ...
- 卡特兰数&&prufer序列&&BSGS水题集
首先说一下BSGS的一个坑点: 解方程A^x≡B(mod p) 需要特判一个东西=>A%p==B%p==0? 如果相等的话puts("1")反之则无解. 因为如果A%p=0, ...