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,一切皆对象. 之前不是一直在学的用面向函 ...
随机推荐
- python编程系列---tcp服务端的简单实现
流程如下: """tcp服务端创建流程1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求2. 绑定端口3. server_soc ...
- office visio 2019 下载激活
安装 下载 office ed2k://|file|cn_office_professional_plus_2019_x86_x64_dvd_5e5be643.iso|3775004672|1E4FF ...
- node.js的File模块
1.Node.js是什么? (1) Nodejs是为了开发高性能的服务器而诞生的一种技术 (2) 简单的说 Node.js 就是运行在服务端的 JavaScript,基于V8进行运行 (3) Node ...
- django-模板之for empty(十一)
当值为空时,会调用empty下面的值
- 小白 Python 爬虫部署 Linux
前言 前面国庆节的时候写过一个简易的爬虫. <Python 简易爬虫实战> 还没看过的同学可以先看一下,这只爬虫主要用来爬取各个博客平台的阅读量等数据,一直以来都是每天晚上我自己手动在本地 ...
- js中const,var,let区别
1.const定义的变量不可以修改,而且必须初始化(常量) const b = 5 // 正确 // const b // 错误,必须初始化 // b = 4 // 错误,不可被修改 console. ...
- Python爬虫常用小技巧之设置代理IP
设置代理IP的原因 我们在使用Python爬虫爬取一个网站时,通常会频繁访问该网站.假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问.所以你可以设置一些代理服务器来 ...
- Java 发展历程
JDK 1.0 1991年4月,由 James Gosling 博士领导的绿色计划(Green Project)开始启动,此计划的目的是开发一种能够在各种消费性电子产品(如机顶盒.冰箱.收音机等)上运 ...
- 通过 Django Pagination 实现简单分页
作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 当博客上发布的文章越来越多时,通常需要进行分页显示,以免所有的文章都堆积在一个页面, ...
- [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录
为了更好的阅读体验,欢迎阅读原文.原文链接在此. [windows篇] 使用Hexo建立个人博客,自定义域名https加密,搜索引擎google,baidu,360收录 Part 2: Using G ...