《深入PHP:面向对象、模式与实践》(一)
第1章 PHP:设计与管理
本章主要介绍了本书有哪些内容。
第2章 PHP与对象
本章总结了PHP面向对象特性的发展过程,逐步介绍对象的概念。
PHP/FI:支持变量、关联数组和函数。没有对象。
PHP3:加入对类的支持,但不能访问父类中被覆盖的方法。
PHP4:可以在子类中覆盖和访问父类的方法。对象在PHP脚本的传递依然会创建副本,但可以强制按引用传递(对象前面加&)。
PHP5:明确支持对象和面向对象程序设计。默认按引用的方式传递对象。拥有更多扩展和增强对PHP对象的支持,比如命名空间、私有和保护类型的方法及属性、异常等。
第3章 对象基础
本章主要介绍PHP的核心面向对象特性。
3.1 类和对象
本节目标,理解类和对象的关系。
3.1.1 编写第一个类
类是生成对象的代码模板。
使用 class 关键字和类名来声明类。类名是任意数字和字母的组合,不能以数字开头。和一个类关联的代码必须用大括号括起来。
class ShopProduct {
// 类体
}
3.1.2 第一个对象
对象是根据类中定义的模板所构造的数据,是类的实例。使用 new 操作符来生成类对象。
$product1 = new ShopProduct();
$product2 = new ShopProduct();
同一个类的对象是同一类型的不同实例。
3.2 设置类中的属性
类的属性也被称为成员变量,在声明和赋值前加一个代表可见性的关键字(public、protected 或 private)。
在PHP4中,所有的属性都用 var 关键字声明,其效果和使用等价于 public 。
class ShopProduct {
// 类体
public $title = "Apple";
}
访问成员变量:使用 -> 字符来连接对象变量和属性名。
$product1 = new ShopProduct();
echo $product1->title; // 输出"Apple"
作用域为 public 的属性既可以被读取,也可以被赋值。可以动态地设置属性,但不推荐这种做法。
3.3 使用方法
属性让对象存储数据,方法让对象执行任务。
方法的声明:修饰词 + function关键字 + 方法名 + (),并且必须在类中声明。
如果在方法声明中省略了可见性关键字,那么方法被隐性声明为 public。
在PHP4中,方法的声明不能增加可见性关键字,否则程序报错。PHP4中所有的方法都是 public 型。
方法的调用:大部分情况下使用 -> 连接对象变量和方法名来调用方法。
$this伪变量 把类指向一个对象实例。
创建构造方法
创建对象时,构造方法会被自动调用。
在 PHP5 之前的版本,构造方法使用和所在类相同的名字。在 PHP5 中,构造方法被命名为__construct(),但之前的命名方式依然有效。
可预测性是面向对象编程的重要部分。
3.4 参数和类型
在 PHP 中,定义方法和函数不需要指定参数的数据类型。这既是一种便利,也是一种麻烦。
3.4.1 基本类型
PHP是一种弱类型语言,声明变量时不需要指定为特定的数据类型。但是,每个变量值都是一种数据类型。
基本数据类型:一个例子
该例子展示了一个数据类型相关的问题:类方法希望一个参数是布尔型,传过来的字符串 "false" 被解析为 true,从而导致类方法进行错误的处理。
处理数据类型问题时,一定要考虑数据类型处理,需要在检测类型、转换类型和良好清晰的文档之间平衡。
在面向对象开发中,“专注特定任务,忽略上下文”是一个重要的设计原则。
3.4.2 获得提示:对象类型
参数变量可以包含任何基本类型的数据,也可以包含任何类型的对象。
在方法定义中,如果其参数接受一个对象,那么应该在该参数前面增加类型提示,也就是将类名放在方法参数前面。
方法参数的类型提示不能用于某种基本数据类型,比如字符串和整型,但可以强制使用数组作为参数,这被称为数组提示。
3.5 继承
继承是从一个基类得到一个或多个派生类的机制。子类可以增加父类之外的新功能。
3.5.1 继承问题
书中举例说明ShopProduct类中的CD和图书这两部分会产生冗余的属性和方法,但是分别创建CD和图书这两个类又会造成代码重复。通过继承,把CD和图书当成单独的类,又能使用父类公共的属性和方法,同时允许每个类处理不同的方法调用。
3.5.2 使用继承
创建继承树的第一步是找到现有基类元素中不适合放在一起,或者不需要进行特殊处理的类方法。
使用 extends 关键字来声明子类。子类默认继承父类所有的 public 和 protected 方法或属性(不能继承 private 方法或属性)。
理解继承的一种方式是“搜索”。对属性或者方法的访问,如果没有在当前子类中找到,就会查找父类中的默认实现。
1. 构造方法和属性
引用一个类而不是对象的方法,使用 :: 而不是 ->,例如 parent::__construct()。
子类实现自己的构造方法时,先调用父类的构造方法,再设置自己的属性,使得父类不知道子类的信息,让每个子类只处理自己的数据。
2. 调用被覆写的方法
parent关键字可以在任何覆写父类方法的方法中使用。
覆写一个父类的方法时,应该先调用父类的方法,再继续写其他的扩展功能。
3.5.3 public、protected、private:管理类的访问
类中的元素可以被声明为 public、protected 或 private。
- 在任何地方都可以访问 public 属性或方法。
- 可以在当前类或子类中访问 protected 属性或方法,其他外部代码无权访问。
- 只能在当前类中访问 private 属性或方法。
一般来说,最好将类属性初始化为 private 或 protected,然后在需要的时候再放松限制条件。有些类方法如果只为类中其他方法提供本地功能,与类外部的代码没有联系,应该将其设置为 private 或 protected。
1. 访问方法
当客户端程序员需要使用类中的属性值时,比较好的做法是不要允许直接访问属性,而是提供访问方法来取得需要的值。访问方法还可以设置属性的可见性(protected或private),来阻止程序员直接操作属性。
2. ShopProduct类
本小节改进了ShopProduct类及其子类,所有的属性被设置为 private 或 protected,所有的方法被设置为 public。
《深入PHP:面向对象、模式与实践》(一)的更多相关文章
- tcp/ip原理/三次握手/四次挥手
@ tcp/ip原理 1.1 tcp/ip三次握手 1.1.1 建立过程说明 a) 由主机A发送建立TCP连接的请求报文, 其中报文中包含seq序列号, 是由发送端随机生成的, 并且还将报文中SY ...
- 白话TCP/IP原理
TCP/IP(Transmission-Control-Protocol/Internet-Protocol),中文译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议 ...
- <TCP/IP原理> (四) IP编址
1.IP地址的基本概念:作用.结构.类型 2.特殊地址:作用.特征 网络地址.广播地址(直接.受限) 0.0.0.0 环回地址 3.单播.多播.广播地址:特征 4.专用地址:作用.范围 5.计算和应用 ...
- <TCP/IP原理> (二) OSI模型和TCP/IP协议族
1.OSI参考模型 1)作用 2)各层的名称和功能 2.对分层网络协议体系的理解 1)不同节点:层次组成不同,作用不同 2)横向理解:虚通信.对等实体.协议.PDU 3)纵向理解:封装与解封.服务.接 ...
- <TCP/IP原理> (一)
1.协议和标准 2.标准化组织 3.Internet标准:RFC 4.Internet的管理机构 一.协议和标准 1.协议(Protocol) 一组控制数据通信的规则 三要素:语法(syntax).语 ...
- TCP/IP原理浅析
TCP/IP概述 TCP/IP起源于1969年美国国防部(DOD:The United States Department Of Defense)高级研究项目管理局(APRA:AdvancedRese ...
- [转] TCP/IP原理、基础以及在Linux上的实现
导言:本篇作为理论基础,将向我们讲述TCP/IP的基本原理以及重要的协议细节,并在此基础上介绍了TCP/IP在LINUX上的实现. OSI参考模型及TCP/IP参考模型 OSI模型(open syst ...
- TCP/IP原理简述
TCP/IP与OSI TCP/IP工作在第4层,在TCP/IP协议簇中,有两个不同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议),它们分别承载不同的应用.TCP协议提供可靠的服务,UDP ...
- <TCP/IP原理> (三) 底层网络技术
传输介质 局域网(LAN) 交换(Switching) 广域网(WAN) 连接设备 第三章 底层网络技术 引言 1)Interne不是一种新的网络 建立在底层网络上的网际网 底层网络——“物理网”,网 ...
- 在深谈TCP/IP三步握手&四步挥手原理及衍生问题—长文解剖IP
如果对网络工程基础不牢,建议通读<细说OSI七层协议模型及OSI参考模型中的数据封装过程?> 下面就是TCP/IP(Transmission Control Protoco/Interne ...
随机推荐
- spark技术热点问题互动问答2
决胜云计算大数据时代” Spark亚太研究院100期公益大讲堂 [第3期互动问答分享] Q1: groupbykey是排好序的吗?分组排序怎么实现? groupByKey在一个由(K,V)对组成的数据 ...
- CodeVS 1226 倒水问题【DFS/BFS】
题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...
- UVALive 5097 Cross the Wall
贪心思想,$dp$,斜率优化. 首先将人按照$w$从大到小排序,如果$w$一样,按$h$从大到小排.这样一来,某位置之后,比该位置$h$小的都是不需要考虑的. 因此,形成了如下图所示的结果: 即第一个 ...
- 训练指南 UVALive - 5135 (双连通分量)
layout: post title: 训练指南 UVALive - 5135 (双连通分量) author: "luowentaoaa" catalog: true mathja ...
- [转载]数学【p1900】 自我数
题目描述-->p1900 自我数 本文转自@keambar 转载已经原作者同意 分析: 思路还是比较好给出的: 用类似筛选素数的方法筛选自我数. 但是要注意到题目限制的空间仅有4M,不够开10^ ...
- UVA Phone List (字典树)(查询是否有前缀或自身是其他的前缀)
Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16341 Accepted: 5228 Descr ...
- 水流(water)(BFS)(DFS)
水流(water) 时间限制: 1 Sec 内存限制: 64 MB提交: 9 解决: 2[提交][状态][讨论版] 题目描述 全球气候变暖,小镇A面临水灾,于是你必须买一些泵把水抽走.泵的抽水能力 ...
- hadoop遇到的问题(汇总)
1. 如果Map和reduce的输出不一致,需要显示的设置Map的输出,没有根据参数进行推导的原因是类型擦除 combiner是在copy数据到机器之前可以进行的一些数据的合并,这和数据有关,不是所有 ...
- 5、Django实战第5天:首页和登录页面的配置
从这天开始我们需要用到前端源码,需要的朋友可以进行小额打赏(15元),打赏二维码在博客的右侧,打赏后可以凭截图联系463951510@qq.com,博主收到邮件后会立即回复发送所有源码素材,实战过程中 ...
- java中的3大特性之多态
一.多态:一个对象具有多种表现形态(父类的引用类型变量指向了子类的对象) 二.多态的满足条件:1.必须要有继承关系2.必须要有方法的重写 三.int[]a; //a引用类型变量-->//引用in ...