类是把具有相似特性的对象归纳到一个类中,类就是一组相同属性和行为的对象的集合。类和对象的关系:类是相似对象的描述,先有类,再有对象。类是对象的抽象,对象是类的实例。通过class关键字创建类,成员属性是在类中声明的变量,一个类可以包含多个成员属性,成员属性可以有默认值,也可以没有默认值,如果有默认值的话,值不能是变量、表达式、函数和方法的调用,只能是一个值。在类中声明的方法,就是成员方法,一个类可以包含多个成员方法。实例化对象:通过new关键字 + 类名 来实例化类,实例化类的结果产生对象。每个对象都是独立的,不一样。在类外部,通过对象引用名->属性,访问或设置成员属性,通过对象引用名->方法,调用成员方法。在类内部,通过$this->属性名,访问成员属性,通过$this->方法,调用成员方法,$this代表当前的对象。

php内存分配:php内存分为这几部分:栈空间段:空间小,CPU访问速度快,适合存放代码中临时创建的一些变量(临时数据寄存,用于存储占用空间不变,而且比较小的数据类型的内存段:整形,浮点,布尔),栈是后进先出的结构。堆空间段:用于存储进程运行中动态分配的一个内存段,堆空间的大小是不固定的,堆内存的大小可以进行动态的扩展或缩减。可以用堆来存放数据长度可变,占用内存比较大的数据:字符串,数组,对象,都是存储在堆内存段中。代码段:代码段用于存放一些可执行文件的操作命令的,它是可执行程序在内存中的一段镜像,代码段需要防止在运行时被非法修改,所以只允许我们读取操作,不允许写入。函数就存储在代码段中。初始化静态段(数据段):用来存放可执行文件中已初始化的全局变量,也就是存储程序静态分配的变量。在函数中用static关键字声明的静态变量(局部的),保存在初始化静态段中,还有类的静态属性和静态方法也是保存在初始化静态段中。对象在内存中是如何来分配的:在用new关键字创建对象后,对象的引用保存在栈里,对象保存在堆里,对象的方法保存在代码段里。

php的构造函数:__construct,通过构造函数来完成对象数据初始化的工作。在每次用new创建新对象的时候,首先会自动调用类的构造函数。可以在构造函数的参数中为类的成员属性赋默认值。

php的析构函数:__destruct,析构函数,不能带有参数,析构函数会在对象的所有引用被删除或显式的销毁之前会被调用。通过析构函数释放资源,包括结果集,数据库连接等。给对象引用赋值为 null 可以显式调用析构函数。

面向对象的封装性:封装就是把我们的成员属性和成员方法封装起来,封装的目的在于,不想让类的外面“看到”。使用访问修饰符可以实现封装。封装的好处在于可以吧不想暴露给类外面的属性和方法,全部都隐藏起来,把类内部的细节不想让别人看到,这是就可以对成员进行访问控制。php5中的三种访问控制修饰符:public,默认值,在类的内部和外部(通过对象访问)。protected:受保护的,在类的内部或子类中可以访问,但在类的外部,通过对象无法访问。private:私有的,只能在类的内部进行访问。

php魔术方法:(自动调用)__construct()  __destruct()  __set()  __get()  __isset()  __unset()      __set($propertyName,$propertyVal):在类的外部(通过对象引用)对私有的或受保护的或者未定义的成员属性进行 赋值 的时候会自动调用。__get($propertyName):在类的外部(通过对象引用)对私有的或受保护的或者未定义的成员属性进行 读取 的时候会自动调用。

__isset() :当在类的外部对私有的,受保护的或者未定义的成员属性进行isset()或者empty()调用时,会自动调用__isset()魔术方法。

__unset() :当在类的外部对私有的,受保护的或者未定义的成员属性进行unset()调用时,会自动调用__unset()魔术方法。

使用extends关键字实现继承,PHP是单继承的,继承可以实现代码的高可重用性,高可扩展性。父类--基类--超类。子类--派生类--扩展类。

通过parent::关键字在子类中调用父类中被重写的方法。如果子类的关键字和父类一样,相当于子类重写了父类的方法。

父类中的 final 方法不能被子类重写。

在函数中使用static关键字声明的变量时静态变量,第一次调用此函数时相当于初始化static变量,当函数执行完后,statice变量没有被释放,而是保持在了静态内存中,当我们再次调用这个函数的时候,会再次读取静态内存中的值,函数static变量的值在函数多次调用时,其值不会丢失,函数内部的static变量仅在函数内部是可见的。同样在类中也可以使用static关键字,用static关键字来定义类的静态属性和静态方法,通过static关键字声明的static成员属性和成员方法是属于类的,在类的内部和外部(脚本文件中)static属性和static方法不用实例化类的对象就可以访问,通过 类名::属性名 和 类名:: 方法名 来访问。此外,在类的内部可以通过self:: 关键字来访问static属性和static方法(推荐用self关键字),self关键字代表定义当前方法的类,在类的实例中也可以用self关键字来访问static属性,在类的内部不能用$this来引用static属性和static方法。在static方法内部,不能使用$this,在static方法中也不要引用非static内容(即没有用static修饰的属性或方法)。在类的外部,通过类的实例的引用也可以调用类的static方法。类的static属性,在类的多个实例间共享,其中一个实例修改了static属性值,在类的所有实例中都将得到更新。

http://php.net/manual/zh/language.oop5.late-static-bindings.php

在php脚本文件里面通过define或者const来定义常量。在类内部通过const关键字定义常量属性。常量属性的名称一般用大写。常量的值只能是值,不能是表达式或变量。在类内部通过类名或self访问常量属性,在类外部,通过类名来访问,不能通过类的实例的引用来访问。在类的内部也可以通过static关键字访问const常量。

通过 is_a() ,instanceof 来检测一个对象引用是否是一个类,父类或接口的实例。get_class()返回当前调用对象引用的类名。get_parent_class()返回类或者对象的父类名。is_subclass_of()检测一个对象(引用)是否是另外一个类的子类。

===================================

抽象类不能直接被实例化,只能通过子类来继承它,并且通过在子类中实现抽象类中的抽象方法使抽象类具体化,在抽象类中只需要定义子类需要的方法,也可以在抽象类中部分实现一些内容,把公共的部分先实现以下。在抽象类中必须要有抽象方法,抽象方法就一个抽象的思想,抽象方法没有具体的实现,通过 abstract 关键字来定义一个抽象方法,抽象方法没有方法体,只是声明了一个调用方式,不能定义具体的功能实现,子类在继承的时候必须实现所有的抽象方法,子类在实现父类抽象方法的时候,可见性可以和父类相同或者宽松,子类中也可以定义自己的方法。在一个类中,只要有一个类是抽象方法了,那么这个类就必须声明为abstract 抽象类。abstract抽象类不能被实例化。

接口就是一套规范或契约,是类和类之间的一种协议,接口也是对外提供服务的一种出口。在接口定义中必须是纯粹的模板,接口定义中只能定义功能,不能包含具体的实现内容。通过interface 关键字来定义接口,在接口定义中可以包含方法,也可以包含属性,接口中的方法必须定义成 public 的,不能定义方法体。通过implements关键字来实现接口,实现接口的时候必须实现接口中所有的方法。一个类可以实现多个接口,多个接口之间使用逗号分隔,多个接口中的方法是不能有重名的。一个类可以先继承另外一个类,在实现多个接口。接口也支持继承,并且一个接口可以继承多个接口,接口间的继承方式和类的继承一样,在接口中还可定义常量,接口常量不能被子类或者子接口所覆盖。

继承实现多态,接口实现多态。

===================================

魔术方法:__toString():当我们输出一个对象的时候,__toString()魔术方法会被自动调用,__toString()魔术方法需要返回以字符串。当我们的对象被当做函数的方式调用(即,在对象的引用后面加上左右括号(),来调用对象,也可以在调用对象的时候,向对象调用传递参数)的时候,会自动触发 __invoke() 魔术方法的调用。(通过func_get_args()函数可以得到调用函数时传递给函数的参数)。当调用一个对象的未定义或不可访问(例如:在类外部调用类的 private 方法)的方法的时候,__call()魔术方法会被自动调用,__call()魔术方法有两个参数:第一个是未定义的方法名,第二个是给未定义的函数传递的参数(在__call()内部以数组的形式保存),__call()魔术方法,相当于方法的重载。__callStatic()魔术方法在用静态方式调用一个不可访问或者不存在的static方法时,会被自动调用,__callStatic()魔术方法同样有两个参数:第一个是未定义的方法名,第二个是给未定义的函数传递的参数(在__callStatic()内部以数组的形式保存)。__clone():默认情况下,将对象的引用直接赋值给一个变量,是引用的赋值,两个都指向同一个对象。想得到两个一模一样的对象可以通过clone关键字完成。通过clone关键字可以将一个对象的属性和方法完全复制一份赋给另一个对象,clone完成后会得到两个一模一样的独立对象,各自占用不同的内存空间,一个对象的改变不会影响另一个对象。当我们使用clone关键字的时候,自动会调用(触发)一个魔术方法__clone()。__sleep():序列号对象的时候会自动调用。__wakeup():反序列化对象的时候会自动调用。(序列化一个对象是指将一个对象转换成字节流的形式,这样就可以将对象保存在文件中。)

===================================

以下是进阶篇的内容:面向对象的设计原则,自动加载类,类型提示,traits,命名空间,spl的使用,反射的使用,php常用设计模式

PHP 面向对象编程笔记 (麦子 php 第二阶段)的更多相关文章

  1. javascript面向对象编程笔记(基本数据类型,数组,循环及条件表达式)

    javascript面向对象编程指南 最近在看这本书,以下是我的笔记,仅供参考. 第二章 基本数据类型.数组.循环及条件表达式 2.1 变量 区分大小写 2.3 基本数据类型 数字:包括浮点数与整数 ...

  2. javascript面向对象编程笔记

    对象:一切事物皆是对象.对象是一个整体,对外提供一些操作.比如说一个收音机是一个对象,我们不需要知道它的内部结构是什么,只需要会使用外部的按钮就可以使用收音机. 面向对象:面向对象语言的标志是他们都有 ...

  3. 面向对象编程笔记--static

    通过static方法,提供静态的不需要实例化即可访问的方法或属性.所有的调用者可以使用同一个类(不实例化)或对象(只实例化一次),可以应用的场景: 1)各个调用者共享数据,协同工作. 2)对象只可以实 ...

  4. javascript面向对象编程笔记(函数之闭包)

    3 函数 3.5 闭包(closures) 3.5.1 作用域链 与很多程序设计语言不同,javascript不存在大括号级的作用域,但它有函数作用域,即在函数内定义的变量在函数外是不可见的.但如果该 ...

  5. javascript面向对象编程笔记(函数)

    第三章 函数 3.1 什么是函数 一般来说,函数声明通常由以下几部分组成: function子句 函数名称 函数所需参数 函数体 return子句.如果某个函数没有显示的返回值,默认它的返回值为und ...

  6. Java编程基础阶段笔记 day 07 面向对象编程(上)

    ​ 面向对象编程 笔记Notes 面向对象三条学习主线 面向过程 VS 面向对象 类和对象 创建对象例子 面向对象的内存分析 类的属性:成员变量 成员变量 VS 局部变量 类的方法 方法的重载 可变个 ...

  7. PHP面向对象编程 对象的基本概念 PHP面向对象的基本实践 PHP面向对象的高级实践 PHP面向对象的特殊实践

    再次梳理一下面向对象编程的要点. 此文是以php为例,但思想是通用的. 总结的PHP面向对象编程笔记 对象的基本概念 对象的基本构成 对象包含两部分 一.对象的组成元素 是对象的数据模型,用于描述对象 ...

  8. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  9. C#学习笔记(六)——面向对象编程简介

    一.面向对象编程的含义 *   是一种模块化编程方法,使代码的重用性大大的增加. *   oop技术使得项目的设计阶段需要的精力大大的增加,但是一旦对某种类型的数据表达方式达成一致,这种表达方式就可以 ...

随机推荐

  1. Oracle运行依赖的服务

    1.Oracle ORCL VSS Writer Service. Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(比如磁盘,阵列等) ...

  2. 有关在新版mac上 git 环境变量的配置问题

    前段时间买的新版 mpb ,各种环境什么都没有配置,想着在网上边搜边摸索着将各种开发工具逐步配置齐全,各种问题不断出现,不知道是不是新版的原因不兼容. 其中 git 的配置尤为奇怪.在git官网上直接 ...

  3. CompletionService的poll方法

    1.poll():马上返回完成的任务,若没有,则返回null 2.poll(long timeout, TimeUnit unit): 等待timeout时间,如果大于最短任务完成时间,则获取任务结果 ...

  4. 网络防火墙之iptables的前世今生和归宿

    任何事物都有一个从无到有,再归于无的过程.是的,我这里用了一个绝对词:任何. 防火墙 在计算机领域中,防火墙(英文:Firewall)是一项协助确保信息安全的设备,会依照特定的规则,允许或是限制传输的 ...

  5. day2-基础 变量,判断,循环

    1.第一个程序 print ("Hello World!") 输出: 1 Hello World 2.第一个变量 a = ( print (a) 输出: Hello World 3 ...

  6. 收放卷winder计算器

    简单收放卷计算器v0.1

  7. angularjs filter详解

    过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果. 主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等. ng内置了一些过滤器, ...

  8. 48. Rotate Image (matrix retation, transpose) Amazon problem

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  9. NodeJS服务器端平台实践记录

    [2015 node.js learning notes]by lijun 01-note Nodejs是服务器端的javascript,是一种单线程.异步I/O.事件驱动型的javascript:其 ...

  10. 动态规划(DP),最大矩阵和

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=74 http://poj.org/problem?id=1050 解题 ...