类和对象:
    类是生成对象的模板,对象是活动组件;
    面向对象编程实际操作都是通过类的实例(而不是类本身)完成的;
    
访问控制(public、protected、private):
(1) 在任何地方都可以访问public属性和方法;
(2) 只能在当前类中才能访问private方法和属性,即使在子类中也不能访问;
(3) 可以在当前类或子类中访问protected方法或属性,其他外部代码无权访问(实例化对象也不可以访问);

子类与父类:
    子类默认继承父类所有的public和protected方法(但是没有继承private方法和属性);

静态方法和属性:
    (1) 我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们,这样的方法和属性是“静态的(static)”,必须用static关键词来声明;
    (2) 静态方法是以类作为作用域的函数,静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。
    (3) 只有在使用parent关键词调用方法的时候,才能对一个非静态方法进行静态形式的调用,除非是访问一个被覆写的方法,否则永远只能使用::访问被明确声明为static的方法和属性;
    (4) 只能通过类而不是类的实例来访问静态方法和属性;
    
常量属性:
    只能通过类而不是类的实例来访问常量属性;
    
抽象类:
    (1) 抽象类至少包含一个抽象方法。抽象方法用abstract关键字声明,其中不能有具体内容,你可以像声明普通方法那样声明抽象方法,但要以分号而不是方法结束语。
    (2) 抽象类的每个子类都必须实现抽象类中的所有抽象方法,或者把它们自身也声明为抽象方法。
    (3)扩展类不仅仅负责简单实现抽象类中的方法,还必须重新声明方法。新的实现方法的访问控制不能比抽象方法的访问控制更严格。新的实现方法的参数个数应该和抽象方法的参数个数一样,重新生成对应的类型提示。
    
接口:
    (1)抽象类提供了具体实现的标准,而接口(interface)则是纯粹的模板。接口只能定义功能,而不包含实现的内容。接口可用关键字interface来声明。接口可以包含属性和方法声明,但是方法体为空。
    (2)任何实现接口的类都要实现接口中所定义的所有方法,否则该类必须声明为abstract。
    (3)一个类可以同时继承一个父类和实现任意个接口,extends子句应该在implements子句之前:

class FooClass extends FooBaseClass implements Ainterface,Binterface[,...]{
//......
}

延迟静态绑定:static关键字

    abstract class DomainObject {

    }
//子类一
class User extends DomainObject {
public static function create(){
return new User();
}
}
//子类二
class Document extends DomainObject {
public static function create(){
return new Document();
}
}
print_r(User::create()); //可以正常运行,并且得到一个对象

观察以上代码大家肯定对这样的重复代码感到有点不爽,有没有更好的办法吗?于是开始不新的尝试...于是有了下面的简化...

  abstract class DomainObject {
public static function create(){
return new self();
}
}
class User extends DomainObject {}
class Document extends DomainObject {}

这样写看起来很整洁。实际上对该类所起的作用与$this对对象所起的作用并不完全相同。self指的不是调用上下文,它指的解析上下文,因此,如果运行上面的例子,会得到:
    print_r(User::create()); // Fatal error: Cannot instantiate abstract class DomainObject in ....on line xxx
    
    因此,self被解析为定义create()的DomainObject,而不是解析为调用self的User类。PHP 5.3之前,在这方面都有严格的限制,产生过很多笨拙的解决方案。PHP 5.3中引入了延迟静态绑定的概念。该特性最明显的标志就是新关键字static。static类似于self,但它指的是被调用的类而不是包含类。在本例中,它的意思是调用User:create()将生成一个新User对象,而不是试图实例化一个DomainObject对象。因此,现在在静态上下文件中使用继承关系。

  abstract class DomainObject {
public static function create(){
return new static();
}
}
class User extends DomainObject {}
class Document extends DomainObject {}

 拦截器方法
    __get($property) //访问未定义的属性时被调用
    __set($property,$value) //给未定义的属性赋值时被调用
    __isset($property) //对未定义的属性调用isset()时被调用
    __unset($property) //对未定义的属性调用unset()时被调用
    __call($method,$arg_array) //调用未定义的方法时被调用

  __clone() //当在一个对象上调用clone关键字时,其__clone()方法就会被自动调用
    __autoload() //当PHP引擎遇到试图实例化未知类的操作时,会调用__autoload()方法,并将类名当做字符串参数传递给它

PHP之OOP要点摘要的更多相关文章

  1. Java基础进阶:时间类要点摘要,时间Date类实现格式化与解析源码实现详解,LocalDateTime时间类格式化与解析源码实现详解,Period,Duration获取时间间隔与源码实现,程序异常解析与处理方式

    要点摘要 课堂笔记 日期相关 JDK7 日期类-Date 概述 表示一个时间点对象,这个时间点是以1970年1月1日为参考点; 作用 可以通过该类的对象,表示一个时间,并面向对象操作时间; 构造方法 ...

  2. 基于TextRank算法的文本摘要

    本文介绍TextRank算法及其在多篇单领域文本数据中抽取句子组成摘要中的应用. TextRank 算法是一种用于文本的基于图的排序算法,通过把文本分割成若干组成单元(句子),构建节点连接图,用句子之 ...

  3. 【mysql中myisam和innodb的区别】

    单击进入源网页 要点摘要: 1.查看mysql存储引擎的状态mysql> show engines; 2.查看mysql默认的存储引擎mysql> show variables like ...

  4. Odoo10 变化

    官方在 https://www.odoo.com/forum/help-1/question/fyi-what-has-odoo-r-d-been-working-on-lately-106945 发 ...

  5. Java基础进阶:APi使用,Math,Arrarys,Objects工具类,自动拆装箱,字符串与基本数据类型互转,递归算法源码,冒泡排序源码实现,快排实现源码,附重难点,代码实现源码,课堂笔记,课后扩展及答案

    要点摘要 Math: 类中么有构造方法,内部方法是静态的,可以直接类名.方式调用 常用: Math.abs(int a):返回参数绝对值 Math.ceil(double a):返回大于或等于参数的最 ...

  6. OOP多态和继承要点

         早期绑定和多态 C#函数重载的签名规则是用参数的类型和数量判断,而不是函数的名字. 函数返回值不作为重载签名. 修饰符不作为签名的一部分,如static 同函数中,多个参数名称要唯一 ref ...

  7. iOS - 对OOA、OOD、OOP的理解

    很多人在求职的时候,会遇到一个这样的问题:“对OOD/OOP有较深的理解”,这个时候有人就会问OOD.OOP是什么呢?那么今天咱们就一块来看一下OOA.OOD.OOP到底是什么! (一)OOA--面向 ...

  8. 有关利用python获取网页, 以及KDD近几年论文标题与摘要链接

    最近一直在看KDD的论文,不过,由于老师并没有什么合理的方向性,所以考虑把kdd中的大部分内容都利用python将所有标题.摘要获取下来. 还有一个原因在于,看acm上的摘要,都只显示了两行,再看多点 ...

  9. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要系列文章索引

    从发表第一篇文章到最后一篇文章,时间间隔有整整一个月,虽只有5篇文章,但每一篇文章都是我吸收<LEARNING HARD C#学习笔记>这本书的内容要点及网上各位大牛们的经验,没有半点废话 ...

随机推荐

  1. How to convert webp to png/jpg/gif in MacOS

    Environment I'm using OS X 10.11.4 and have homebrew 1.0.5 installed. Introduction I recently downlo ...

  2. 《Spark 官方文档》机器学习库(MLlib)指南

    spark-2.0.2 机器学习库(MLlib)指南 MLlib是Spark的机器学习(ML)库.旨在简化机器学习的工程实践工作,并方便扩展到更大规模.MLlib由一些通用的学习算法和工具组成,包括分 ...

  3. 浅析Java.lang.ProcessBuilder类

    最近由于工作需要把用户配置的Hive命令在Linux环境下执行,专门做了一个用户管理界面特地研究了这个不经常用得ProcessBuilder类.所以把自己的学习的资料总结一下. 一.概述      P ...

  4. [课程设计]Scrum 3.2 多鱼点餐系统开发进度(页面优化&下单详细信息页面)

    Scrum 3.2 多鱼点餐系统开发进度(页面优化&下单详细信息页面)  1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选 ...

  5. hibernate的HQL语句

    1.in的用法 obj.goods_return_status in (:ids) 然后在给ids赋值

  6. 一个 div 实现扇形图(锥形渐变)

    需要引用的js文件<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min ...

  7. JavaScript浏览器对象(BOM)中有关设备、浏览器屏幕高度和宽度的API介绍

    JavaScript世界中,有很多看起来能够帮我们知道网页宽度和高度的API,但太繁多了,而且容易弄混.不容易区分它们.下面我就来介绍一下,这些API到底是什么意思,之间的区别又在哪里. 一.设备的分 ...

  8. DateEdit控件的使用

    按照年月日时分秒显示时间 1. 设置Mask.EditMask和DisplayFormat,EditFormat属性,设置为一致:'yyyy-MM-dd HH:mm';  //按照想要的显示格式设置此 ...

  9. 修改客户端连接的服务器IP地址(内部使用)

    登录系统时如果出现 “验证失败”,或者,无法登陆系统,请修改服务器端IP地址,修改方法如下: 注意: (1)修改服务器端IP地址时,要提前关闭/退出客户端.建议也看看“Windows的任务管理器”中是 ...

  10. R中数据拆分和整合

    library(data.table)ID <- c(NA,1,2,2)IDTime <- c(1,2,NA,1)TimeX1 <- c(5,3,NA,2)X1X2 <- c( ...