PHP学习笔记——11.面向对象2

1.静态属性/方法

①定义

  在属性/方法前加static修饰,就称之为静态属性/方法

  普通属性/方法是依赖于对象的,必须在实例化对象后,
  才会出现在内存中,进行访问及操作

  而静态属性/方法不依赖于对象,当类声明后,即可进行访问操作
  因此,其只会有一份,不会根据对象的增加而增加

②调用及访问

  调用本类 self::$静态属性; self::静态方法();

  调用父类 parent::$静态属性; parent::静态方法();

  外部访问 类名::$静态属性; 类名::静态方法();

③延迟绑定

  父类中包含:a() b(self::a()) 子类中包含:a()
  当子类调用b()方法时,因其自身无b()方法,则找到父类的b()方法
  而b()方法中的self指其自身,也就是调用父类中的a()方法
  而将self改为static,则返回找到子类自身的a()方法

  总结:self是指当前所在的类;而static是指调用者

2.类常量

①定义

  只在类的内部发挥作用的常量称为类常量

  又可以理解为不可修改的静态属性

  在属性前添加const修饰,不能添加权限修饰符

  声明及使用时都不需要使用$符

②魔术常量

  PHP自带的类常量,无法设置值,其值是随着环境变化而改变的

  __FILE__ 文件的完整路径和文件名;常用于在初始化脚本时,检测网站的根目录
  __LINE__ 文件中当前的行号;常用于在DEBUG时,记录错误信息
  __DIR__ 文件所在目录
  __CLASS__ 返回当前的类名
  __METHOD__ 返回当前的方法名

3.单例模式

①作用

  为了防止某个类被多名开发者反复实例化,造成资源浪费
  而对其进行限制,只允许有一个实例存在,称为单例模式

②语法

  class 类名 {
    //创建一个静态的保护属性,用于存放实例化结果
    static protected $属性名;
    //将构造方法设置为最终及保护,防止被继承后重写或直接实例化
    final protected function __construct () {

    }
    //创建静态公共方法,用于在外部通过类直接调用
    static public function 方法名 () {
      //判断是否已经存在一个实例
      if(self::$属性名 instanceof self) {
        //若存在则直接返回
        return self::$属性名;
      }else{
        //若不存在,则实例化后再返回
        self::$属性名 = new self();
        return self::$属性名;
      }
    }
  }
  $对象 = 类名::方法名(); //通过调用类中的方法产生一个唯一的对象

③注解

  final修饰的类不能被继承;final修饰的方法可以被继承,但不能重写

  对象 instanceof 类名 可用于判断对象是否为该类的实例

4.抽象类

①定义

  类前添加abstract修饰则为抽象类;方法前加abstract修饰则为抽象方法

  抽象类不能被实例化;抽象方法不能有方法体,即{}

  用于统一所有子类所具有的功能,规范化操作、增强可拓展性

②语法

  abstract class 父类 {
    public abstract function 方法名();
  }

③注意

  有抽象方法(包括继承来的)的类一定是抽象类;抽象类里不一定有抽象方法

  要对抽象类进行实例化,需要先继承,并完成所有抽象方法

5.接口

①定义

  是抽象类的变体

  如果说类是对象的抽象,那么接口就是类的抽象

  接口组合成不同的类,而类则实例化出不同的对象

②语法

  interface 接口名 {
    public function 方法();
  }

  class 类名 implements 接口1,接口2,... {
    public function 方法(){

    }
  }

③注意

  因接口中方法必须是抽象的,所以不需要加abstract

  一个接口可以继承自另一个接口,与类的继承相同

④抽象类与接口的区别

  抽象类中可以有普通属性/方法/构造方法;接口中必须只有抽象方法

  抽象类中的方法可以是私有的;接口中的方法只能是公共的

  一个类只能继承自一个抽象类;一个类却可以实现多个接口

作者:@zhnoah
出处:http://www.cnblogs.com/zhnoah/
本文版权归本人和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 
接,否则保留追究法律责任的权利。

时间: 2024-10-13 00:59:00

PHP学习笔记——11.面向对象2的相关文章

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

《C++ Primer Plus》学习笔记11

<C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

cocos2dx游戏开发学习笔记3-lua面向对象分析

在lua中,可以通过元表来实现类.对象.继承等.与元表相关的方法有setmetatable().__index.getmetatable().__newindex. 具体什么是元表在这里就不细说了,网上很多介绍,这里主要讲与cocos2dx相关联的部分. 在lua-binding库中extern.lua里,有如下方法: --Create an class. function class(classname, super) local superType = type(super) local c

C++ Primer 学习笔记_66_面向对象编程 --定义基类和派生类[续]

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

sqlite学习笔记11:C语言中使用sqlite之删除记录

最后一节,这里记录下如何删除数据. 前面所有的代码都继承在这里了,在Ubuntu14.04和Mac10.9上亲测通过. #include <stdio.h> #include <stdlib.h> #include "sqlite/sqlite3.h" #define DB_NANE "sqlite/test.db" sqlite3 *db = NULL; char* sql = NULL; char *zErrMsg = NULL; con

C++ Primer 学习笔记_65_面向对象编程 --概述、定义基类和派生类

面向对象编程 --概述.定义基类和派生类 引言: 面向对象编程基于的三个基本概念:数据抽象.继承和动态绑定. 在C++中,用类进行数据抽象,用类派生从一个类继承另一个:派生类继承基类的成员.动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数. 继承和动态绑定在两个方面简化了我们的程序:[继承]能够容易地定义与其他类相似但又不相同的新类,[派生]能够更容易地编写忽略这些相似类型之间区别的程序. 面向对象编程:概述 面向对象编程的关键思想是多态性(polymorphism)

lua学习笔记11:lua中的小技巧

lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一 巧用or x = x or v 等价于: if not x then x = v end 如果x为nil或false,就给他赋值为 二 三元运算符实现 a and b or c 类似C语言: a ? b : c and 的运算由优先级高于or lua学习笔记11:lua中的小技巧,布布扣,bubuko.com