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

  魔术方法 在面向对象有一些特别的方法,无需特别定义,已自动具备某些功能,例如构造函数__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. ansible案例-安装nginx

    一.创建目录: mkidr -p playbook/{files,templates}   二.自定义index.html文件 $ vim playbook/templates/index.html. ...

  2. 树莓派 Learning 002 装机后的必要操作 --- 00 修改键盘布局

    树莓派 装机后的必要操作 - 修改键盘布局 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 上网查,发现树莓派的键盘布局不对,树莓派(ras ...

  3. Luogu 3825 [NOI2017]游戏

    Luogu的spj现在挂了,要去其他OJ提交. 2-SAT 发现如果不考虑$x$的情况,这就成为一个2-SAT的裸题了,我们有$O(n + m)$的方法可以解决它. 那加上$x$的情况怎么弄……岂不是 ...

  4. Entity Framework Code-First(6):Database Initialization

    Database Initialization: We have seen that Code First creates a database automatically in the Simple ...

  5. TMF大数据分析指南 Unleashing Business Value in Big Data(一)

    大数据分析指南 TMF Frameworx最佳实践 Unleashing Business Value in Big Data 前言 此文节选自TMF Big Data Analytics Guide ...

  6. 蚂蚁金服HR电话面

    1.先自我介绍一下. 2.问到项目问题.(项目介绍,用到哪些技术,如何测试的.) 3.一些基础知识. a) list.map.set是继承了collection的吗?  List:1.可以允许重复的对 ...

  7. go语言web开发框架_Iris框架讲解(五)MVC包使用

    在Iris框架中,封装了mvc包作为对mvc架构的支持,方便开发者遵循mvc的开发原则进行开发. iris框架支持请求数据.模型.持久数据分层处理,并支持各层级模块代码绑定执行. MVC即:model ...

  8. pyMongo 一些基本操作

    1. find() 函数, 可以在函数体内直接指定 filter, sort, projection(限制field), 语法如下: datas = col.find( filter = {" ...

  9. Spring MVC 基于URL的映射规则(注解版)

    好几天没有跟进Spring MVC的学习了,之前看了点源码都忘的差不多了.这次就跟着之前的问题,继续总结下Spring MVC中的小知识. 关于SpringMVC的小demo可以参考这里! url-p ...

  10. springIOC源码解析之BeanDefinition的注册

    ApplicationContext类结构 context是一个存储上下文结构的东西,里面会引用BeanFactory  BeanFactory类结构 我们从这句代码开始分析,(本文spring采用的 ...