一、“魔术”函数 - 自动调用

  魔术方法 在面向对象有一些特别的方法,无需特别定义,已自动具备某些功能,例如构造函数__construt,这些方法统称魔术方法,在日后的编程中,可以使用这些方法的特性设计出独特的算法。

  __get() 定义:__get(‘属性名’),调用不存在属性时调用

    作用: 可通过判断权限让外部直接调用私有属性 防止外部调用不存在属性时报错

  __set() 定义: __set(‘属性名’,’值’),定义不存在属性时调用

    作用: 可通过判断权限让外部给私有属性赋值 防止外部定义私有属性时报错

  __tostring() 定义:__ tostring(),当对象被当作字符串输出时调用,需在最后返回一个字符串代替之

    作用: 防止对象被直接当作字符串使用

  __autoload() 定义: __ autoload(‘类名’),当实例化失败时促发,通常用于自动加载

    作用:避免加载过多的没用的类库,可以确保在调用时才加载

  __isset() 定义:__isset(‘属性名’),当对1个不存在的属性使用isset时调用

    作用: 防止外部借isset方法判断类是否存在某属性,实际意义不大

 

 __unset() 定义: __unset(‘属性名’),对1个不存在的属性使用unset时调用

    作用:没什么实际使用意义

  __call() 定义:__call(‘方法名’,’参数数组’),当调用1个不存在的方法时调用 动态调用方法:call_user_func_array(array($this,$method),$parm)

    作用 提示调用方法失败 让外部动态调用私有方法等

二、静态属性与静态方法

  1)static关键字是在类中描述成员属性和成员方法是静态的。static的成员是属于类的,不属于任何实例化对象

  2)类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类似于全局函数

  3)静态属性的属性/方法不会跟随对象重新创建,它只会随类而变化,它们在类的创建(即申明类的时候)是已经存在。但动态方法必须是创建对象后才存在。

  4)因为静态成员是在类的第一次加载的时候就被创建。所以类的外部不需要对象而使用类名就可以访问到静态成员。静态成员在我们做项目的时候目的就是使用类名去访问。

  5)类里面的静态方法只能访问类的静态属性。在类里面的静态方法不能访问类的非静态成员,原因很简单,我们想要在本类的方法中访问本类的其他成员,我们需要使用$this这个引用,而$this这个引用指针是代表调动此方法的对象,我们说了静态的方法是不对象调用的,而使用类名来访问,所以根本就没有对象的存在,也就没有$this这个引用了

  6)在静态方法中访问其他静态成员我们使用一个特殊的类“self”;“self”和$this相似,只不过是代表这个静态方法所在的类;即 “self::成员属性” 的方式

三、const关键字

   const是一个定义常量的关键字,在PHP中定义常量使用的是”define()”这个函数,但是在类里面定义常量使用的是”const”这个关键字

  用”const”修饰的成员属性的访问方式和”static”修饰的成员访问的方式差不多,也是使用”类名”,在方法里面使用”self”关键字。但是不用使用”$”符号,也不能使用对象来访问。

四、clone关键字:

   有的时候我们需要在一个项目里面,使用两个或多个一样的对象,如果你使用“new”关键字重新创建对象的话,再赋值上相同的属性,这样做比较烦琐而且也容易出错,所以要根据一个对象完全克隆出一个一模一样的对象,是非常有必要的,而且克隆以后,两个对象互不干扰。

  对象直接相互赋值是引用传递,使用”clone”这个关键字克隆对象  

  值传递与引用传递

     值传递:当两个变量(整型,字符串等)相互赋值时,在内存会复制原变量的内存,另起一块内存

    引用传递:通常发生在两个对象相互赋值时。两个变量会同时指向同一块内存

  使用意义:如果构造函数非常复杂,或者需要多另外一个完全相同的对象时,可以使用克隆

  PHP5定义了一个特殊的方法名“__clone()”方法,是在对象克隆时自动调用的方法,用“__clone()”方法将建立一个与原对象拥有相同属性和方法的对象,如果想在克隆后改变原对象的内容,需要在__clone()中重写原本的属性和方法, ”__clone()”方法可以没有参数

五、抽象类与抽象方法

  抽象方法是指类里面定义没有方法体的方法,所谓没有方法体指的是,在方法声明的时候没有大括号以及其中的内容,而是直接在声明是在方法名后面加分号结束,另外声明抽象方法是需要加关键字“abstract”来修饰;

  demo:  abstract function fun();

  只要类里面有一个方法是抽象方法,那么这个类就要定义为抽象类,抽象类也要用"abstract"关键字来修饰

  demo:  abstract class A;

  作用:规范系统中每个子类的某些方法命名规范,通常用于团队开发中。主要意义在于便于维护和后续工作人员理解代码。

  抽象方法必须在子类中实现

  在抽象类中可以有完全方法,在子类中不一定要实现

  在抽象类中,可以不存在抽象方法,但有抽象方法的类,必须是抽象类

  抽象类不可用实例化

  抽象方法都是不完全方法,但并非不完全方法都是抽象方法

  抽象方法不能是私有的,因为私有方法不能被重载

  接口是一种特殊的抽象类,其用途和抽象类相似,严格区分的话,接口应该比抽象类处于更底层的位置。

  接口只能声明不完全方法和常量

  接口定义: interface 类名

  接口实现: implements : class C implements Test

  接口支持多继承: class C implements Test,Test2,Test3……类C必须完成三个接口中所有的方法

  接口继承接口使用extends关键字

六、串行化

  把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化

  作用:

    1)可以通过网络上传输对象

    2)方便把对象保存至数据库中

  串行化: serialize(),把对象转化为二进制的字符串

  反串行化: unserialize(),把对象转化的二进制字符串再转化为对象

  __sleep():在对象串行化时执行,必须返回一个数组,数组表示要串行化中要保存的字段

  __wakeup():在对象反串行化时执行

面向对象(OOP)二的更多相关文章

  1. 拖拽系列二、利用JS面向对象OOP思想实现拖拽封装

    接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到 ...

  2. 如何吃透Python的面向对象(OOP)

    ​本篇可乐和大家一起来吃透 Python 的面向对象,类和实例. 面向对象(OOP) 解释:面向对象它是一种编程的思想,将现实事物抽象化为编程对象. 举例说明:喝可乐 ① 选择自己根据配方买对应的材料 ...

  3. PHP面向对象(OOP)编程入门教程

    面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行PHP的高级编程,对于提高 PHP编程能力和规划好Web开发构架都是非常有意义的.下面我们就 ...

  4. 深入理解OOP(二):多态和继承(继承)

    本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时 ...

  5. 【PHP面向对象(OOP)编程入门教程】1.什么是面向对象?

    面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成 ...

  6. php面向对象(OOP)编程完全教程

    摘自:http://www.php-note.com/article/detail/41 面向对象编程(OOP)是我们编程的一项基本技能,PHP5对OOP提供了良好的支持.如何使用OOP的思想来进行P ...

  7. Python进阶之面向对象编程(二)

    Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  8. 面向对象(OOP)基本概念

    面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...

  9. python-面向对象-01_面向对象(OOP)基本概念

    面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...

  10. Lua面向对象之二:类继承

    1.类继承 ①代码 Sharp = { } --① 父类 function Sharp:new() local new_sharp = { } self.__index = self --②,self ...

随机推荐

  1. Matlab常用函数(1)

    1.max() C = max(A)     A为向量,返回最大值.若为矩阵,以类向量为基准,返回每列的最大值的行向量.若为多维矩阵.切片返回每一个2维矩阵的行向 量. C = max(A,B)   ...

  2. mac下已装virtualbox运行genymotion还报错找不到虚拟机的解决办法

    sudo ln -s /usr/local/bin/VBoxManage /usr/bin/VBoxManage  

  3. C#中小数转化为string的问题

    在C#中,把小数转化为string, 比如 45.12, 转换为string时,应该就是"45.12" 但是在项目开发中,开发法国的branch时,由于culture使用的是FR- ...

  4. ERROR: JDWP Unable to get JNI 1.2 environment的解决方法

    当执行如下代码时: //从控制台获取输入 InputStream is = System.in; Scanner scanner = new Scanner(is); System.out.print ...

  5. 【转】log4j.properties 详解与配置步骤 - edward0830ly的专栏 - 博客频道 - CSDN.NET

    一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...

  6. jq中打开新页面 并获取携带值

    打开新页面:window.location.href = "./index.html?id=1"获取携带值: function GetRequest() { var url = l ...

  7. JSONCPP介绍

    描述JSON串 如何使用jsoncpp提供的数据结构来存储如下JSON串? // Configuration options { // Default encoding for text " ...

  8. Android代码笔记

    1. 如何监听Android的短信收发,自动填充验证码? getContentResolver().registerContentObserver(Uri.parse(SMS_URI_ALL), tr ...

  9. SpringBoot2.0 基础案例(04):定时任务和异步任务的使用方式

    一.定时任务 1.基本概念 按照指定时间执行的程序. 2.使用场景 数据分析 数据清理 系统服务监控 二.同步和异步 1.基本概念 同步调用 程序按照代码顺序依次执行,每一行程序都必须等待上一行程序执 ...

  10. ByteBuffer flip描述

    # 关于flip ByteBuffer 的filp函数, 将缓冲区的终止位置limit设置为当前位置, 缓冲区的游标position(当前位置)重设为0. 比如 我们有初始化一个ByteBuffer ...