PHP之面向对象PHP之面向对象(面向对象是什么)
PHP之面向对象(面向对象是什么)
一、总结
一句话总结:
面向对象就是类:类都要 属性 和 方法
比如人:属性比如身高体重,方法比如吃饭喝水
面向对象中 ,方法即是函数 ; 属性即是变量 ,只是面相对象中一般说方法和属性
1、面向对象自己涉及到的实例?
比如怪物,有普通怪物,精英怪物,boss怪物,不同怪物的血量,攻击防御等都是不同的,先设置怪物基类,里面有基础属性比如血量,攻击,有基础方法,比如攻击,不同的怪物继承这个类,然后根据需求设置不同的血量和攻击
二、PHP之面向对象(上)(转)
转自:PHP之面向对象(上)
https://www.cnblogs.com/lzhlearn/p/5806159.html
面向过程 :每个小系统有着明确的开始和和结束 。开始和结束之间有着严谨的因果关系。
比如 :上帝创造一个人,如果有70亿人那就很麻烦
随机函数先获取随机的数字 作为数组的下标,然后再从数组中获取对应下标的数字。
面向对象
引入例子 :女娲 人身蛇尾 , 用女娲造人引出类和实例 : 女娲造人前先 思考 人的形象 然后再造人
所以 :人的形象是抽象的,用来说明人的特点;而每一个人都是具体的,且符合人的形象
类 :所有对象共同点的一个抽象!(就是一个 制造说明书)
对象 :就是根据说明书制造出来的具体对象
类中有什么? 属性(比如人:身高,体重,姓名)
能干什么?功能(说活,吃饭)
用 变量 和 函数 分别模拟 属性 和 功能
面向对象中 ,方法即是函数 ; 属性即是变量 ,只是面相对象中一般说方法和属性
new 类名();//直接产生一个对象并返回该对象
$a = new 类名(); //那么a对象就包含 类中声明的所有属性(类似关联数组)
要调用对应的属性值可以 $a -> name (name不用$);要调用对应的方法 $a -> say()
面向对象oo(object oriented)oop加编程
声明类的时候 :
内存分配给类一个空间,,里面存放着类定义的属性和函数
new对象的时候 :
1、 申请内存,生成对象(属性集合)
2、 如果有构造函执行
3、 返回对象的地址
内存分配图
语法就是法律; 规范 就是 道德
(1)属性的初始化 不能是表达式 如 : $a = 1+3 ; java中是允许的
(2)同一个域内(比如一个类中),函数不能重复定义(即是名字不能一样)
(3)在一个类里面,如果要调用系统同名的自定义函数,需要用$this,否则调用系统函数 ; 此外一个类里面 一个函数调用 不是他内部的变量或者它调用其他函数也要加 $this
构造函数 : __construct() , 注意前面是两个下划线 ; 当new对象(产生对象),调用 ; 构造函数不能被重载即是不能再有同名的
析构函数 :__destruct()在对象被销毁的时候调用的函数 。
如何销毁对象 :
1、显式销毁,unset(),直接赋值为null或者其他值
2、执行完最后一行代码时自动销毁(如果之前已经销毁,则不再销毁)
对变量指向销毁问题
$a = new People(); //创建一个对象(new People()),并把使用权给变量$a($a是一个变量名,指向这个对象)
$a = $b = $c ; //3个变量都指向内存中的同一个对象
unset($a);//unset,即是销毁对象(object),但有其他变量$b等仍然指向对象,那么该对象将不能被销毁,但是$a为null不再指向这个对象
this绑定
当一个对象调用一个它对应类的方法时,该方法执行之前先完成一个绑定,即是用
$this绑定到调用此方法的对象(这样才能在方法内对这个对象的属性进行操纵),因为方法内如果想访问调用者(即是对象)的属性必须用$this;否则则理解为方法内部的一个局部变量
Java中不一样,函数不需要this也能访问方法外的变量
封装
封装的概念 : 通过修饰符 改变属性或者函数的访问权限 ,达到保护的作用。
光是封装起来是没意义的,还要供外部交互才行;所以通过一个开放的接口(即是一个函数)供外部操纵;内部的操作,不需要外部知道,从而隐藏内部的一些细节 。
如: 洗衣机,你只要点击启动程序的按钮就能洗衣服,不需要知道洗衣机内部怎么运行
权限修饰符 :private protected public
private修饰的属性只能在其 类里面 才能被访问到。
protected 本类和子类能访问
private访问权限的bug : 对象之间能够相互操作同一个类中的属性,导致一个对象能够修改另一个对象的属性。
fatal error(致命错误)
封装 操作数据库的 类
类似把某个功能的一段代码放在一个类中 ; 类里面的方法相互调用
用面向对象的思想 对数据库操作 (mysql封装类)
比如把连接数据的操作封装到一个连接函数中
连接数据库
发送 查询
对于select语句 返回查询数据数据
关闭mysql连接
继承
子类继承父类的属性和方法,再进一步拓展自己的属性和方法;父类的属性 和方法一般是一个归纳(所有对象都有的),提高代码的重新性
拥有问题 :子类继承父类,子类有父类所有的属性和方法,在子类里面能够操作父类中非private修饰的属性或者方法,但是父类中对于private修饰的属性或者方法子类无法操作(类外的范围限制)
调用与覆盖问题 : 子类里面调用对应的属性时,子类没有覆盖父类中的属性或者方法,则调用父类中的属性或方法,否则只调用子类中的,无论传参数是否对。private的调用除外
注意继承父类之后,子类再声明与父类一样的属性,权限符只能越来越宽松或者一样 。 如果父类的属性有static,子类也必须有才能声明
★类内一般声明只属性和方法,实例化或者输出等语句要写在方法里或者类外,否则报错
如果子类有和父类一样的方法,能使用parent::方法名()指定调用父类的
构造函数是可以被继承的;如果子类中没有写构造函数,在实例化子类的时候就会调用父类的构造方法。如果子类重新写则覆盖且只调用子类的。
因此如果父类的构造函数是必须要调用,最好使用parent::__construct()调用一下(java不同,它会先调用父构造再调用子构造;php调用子构造)
比如 :数据库类中 父类构造函数有连接数据库,如果子类写了其他的话构造函数,则连接失败 (Java不同,父子都调用)
在类外对象名只能调用类中public修饰的属性,其他的属性可以通过方法来调用。一般不写则默认为public
多态
只抽象声明父类,具体的工作由子类对象完成
java出现多态是因为它是强类型语言(即是定义了类型不能随便改变),声明的类型 后 传送参数必须是该类型 。 声明参数时,声明为父类型,传参时,能够传子类型。以达到多态的效果。比如:
多颜色手电筒问题 :声明手电筒,并接受玻璃的参数。然后玻璃有多种颜色,以达到不同效果。则为多态
php是弱类型语言,本身没有对类型没有检测,因此简直变态,后来5.3以后,引入了对于对象类型的参数检测。限制了灵活性达到多态
static 静态属性
一般当 某个属性或者方法 是所有对象固有的(即是不改变),则声明为静态属性,节省内存,随时类名调用;无论函数调用多少次,只初始化第一次.,如 static $a = 1;
静态属性存在于类内存中,而不是对象的内存中。只要有类就能访问到,因此一个静态属性只有一个,改1全变;只能 类名::属性名 访问
静态方法
普通方法和静态方法都存在 类内存 中 且只有一个
但是静态方法用类名调用,不用this绑定;普通方法需要有对象才能用this绑定调用
安装ecshop的时候出现strict standard错误提示,原因是版本高,代码书写语法有误,静态方法调用非静态方法时出现问题。
非静态方法,是不能由类名静态调用的.但是 PHP中的面向对象检测的并不严格,
只要该方法没有$this,就会转化静态方法来调用.
但是,在PHP5.3的strict级别下,或者PHP5.4的默认级别
都已经对类名::非静态方法做了提示
则会提示:Strict Standards: Non-static method Human::eat() should not be called statically
不能静态的去调用非静态方法 ; 有static修饰的变量和函数不能出现$this
isset($this) 这个时候判断有没对象进行绑定;
代码分析
this就是指向当前对象实例的指针,不指向任何其他对象或类
self, parent的用法 (::(域运算符号))
self:指向类本身,也就是self是不指向任何已经实例化的对象 ,self使用来指向类中的静态属性或者方法
self::$staticProperty
self::staticMothed;
parent: 指向父类的指针,一般我们使用parent来调用父类的构造函数。
在引入自身的静态属性/静态方法,以及父类的方法时,可以用到.
parent::$staticProperty
parent::Mothed;
★应该选择this还是parent
总结使用
1: 修饰类的属性与方法为静态属性,静态方法
2: static::method(), 延迟绑定
3: 在函数/方法中,声明静态变量用
PHP之面向对象PHP之面向对象(面向对象是什么)的更多相关文章
- C#面向对象设计模式纵横谈——1.面向对象设计模式与原则
一:设计模式简介 每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心. ---- Christopher Alexander 软件设计领域设计模式: 设计模式描述了软件设计过 ...
- Java面向对象编程 第一章 面向对象开发方法概述
一.软件开发经历的生命周期: ①软件分析 ②软件设计 ③软件编码 ④ 软件测试 ⑤ 软件部署 ⑥软件维护 二.为了提高软件开发效率,降低软件开发成本,一个优良的软件系统应该具备以下特点: ① 可重用性 ...
- [.net 面向对象编程基础] (11) 面向对象三大特性——封装
[.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...
- [.net 面向对象编程基础] (12) 面向对象三大特性——继承
[.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
[.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...
- S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则
注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html < ...
- 初步学习JAVA面向对象初步认识及面向对象内存分析图举例说明
1. 说到面向对象, 一个绕不开的话题,就是面向过程. 面向过程适合简单.不需要协作的事务. 面向过程 = 分解问题 + 逻辑为先 = 先细节,再整体. 对比面向过程, 面向对象是模块化的, 当我们思 ...
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
- 081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字
081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字 本文知识点:new关键字 说明:因为时间紧张,本人写博客过程中只是 ...
- 080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则
080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则 本文知识点:单一职责原则 说明:因为时间紧张,本人写博客过程中只是 ...
随机推荐
- google 搜索结果在新标签页打开
google->setting->search setting->Where results open->勾选
- 成都传智播客Java/PHP培训就业率高
依据传智播客的数据统计,传智播客的学员有五分之中的一个的能在毕业前找到惬意的工作,一半的学员能在毕业后一个月之内找到惬意的工作,一般在毕业后两个月之内绝大多数同学都能找到惬意的工作.而且传智播客毕业学 ...
- Oracle 优化器
http://blog.csdn.net/it_man/article/details/8185370一.优化器基本知识 Oracle在执行一个SQL之前,首先要分析一下语句的执行计划,然后再按执 ...
- HP Vertica Analytics Platform 评測
1.vertica概念 面向数据分析的数据仓库系统解决方式 2.vertica关键特性 Ø 标准的SQL接口:能够利用已有的BI.ETL.Hadoop/MapReduce和OLTP环境 Ø 高可用 ...
- virtualbox 4.3.10 ubuntu 12.04 mount share folder bug
virtualbox 4.3.10 不能mount共享文件夹,这是一个bug,参考如下链接 https://www.virtualbox.org/ticket/12879 执行以下命令即可:sudo ...
- python学习(六)元组学习
元组就是列表的一种,不过元组具有不可变性,而且是用圆括号访问的. 索引(下表索引或者键索引都是用的中括号) #!/usr/bin/python # 这节来学习元组, tuple, 基本上就像一个不可以 ...
- 【WPF学习笔记】之如何点击“新建”按钮,在面板中加载一条条的“用户控件”的信息:动画系列之(四)
...... 承接上一系列动画三. 在主界面后台代码设置嵌套第二个用户控件. using System; using System.Collections.Generic; using System. ...
- mnesia的脏读和事物读的测试
在mnesia中,有脏读脏写等以及事物读写,它们的差异通过测试不难发现: 代码如下: -module(mnesia_read_test). -compile(export_all). -record( ...
- Android_YouthArea之ApeendTextView
这次给我自己的项目打个广告:http://sj.qq.com/myapp/detail.htm?apkName=com.youthcommunity 这款APP 不同于SoHOT是积极的,是年轻人的信 ...
- MySQL mysqlbinlog
MySQL binlog日志记录了MySQL数据库从启用日志以来所有对当前数据库的变更.binlog日志属于二进制文件,我们可以从binlog提取出来生成可读的文本或者SQL语句来重建当前数据库以及根 ...