深入php面向对象和模式
前两章是php历史和概论,略过。
第三章 对象基础
3.1 类和对象
类,是用于生成对象的代码模版。
public 公有的,都可调用。 protected 保护的, 只有本类和子类可以调用。 private 私有的, 只有本类可以调用,子类也不能。
使用->来调用类的属性和方法: $product->title
构造方法:__construct() 会被自动调用。
继承: extends 子类继承父类会在实例化的时候自动调用所有public 和 protected方法。
要引用一个类而不是对象的方法,可以使用::而不是->, 所以 parent::__construct()
静态方法: static 以类作为作用域的函数。
class StaticExample {
static public $num=0;
static public function sayHello() {
print "hello";
}
} print StaticExample::$num;
StaticExample::sayHello(); 要从当前类(不是子类)中访问静态方法或属性,可以使用self关键字
self::$num; 根据定义, 我们不能在对象中调用静态方法, 因此静态方法和属性又被称为类变量和属性。因此不能在静态方法中使用伪变量$this
常量属性: const 一般只能用大写字母来命名常量
const AVAILABLE = 0; 像静态属性一样, 只能通过类而不能通过类的实例访问常量属性。
抽象类: abstract
抽象类不能直接被实例化,抽象类中只定义(或部分定义)子类需要的方法。子类可以继承它并且通过实现其中的抽象方法,使抽象类具体化。
abstract public function write();
抽象类的每个子类都必须实现抽象类中的所有抽象方法。
接口: interface 接口职能定义功能,而不包含实现的内容。
interface Chargeable {
public function getPrice();
}
任何实现接口的类都要实现接口中所定义的所有方法。
抛出异常: 使用throw 和 Exception对象来抛出异常,这会停止执行当前方法。
if($i=0){
throw new Exception('this is a error message');
} 或
try{
...
} catch (Exception $e) {
...
}
析构方法: 在对象被垃圾收集器收集前(即对象从内存中删除之前)自动调用。
__destruct()
__clone()复制对象
class CopyMe {}
$first = new CopyMe();
$second = $first;
//php4: $second和$first是两个完全不同的对象。
//php5: $second和$first指向同一个对象。
php中对象的赋值和传递都是通过引用进行的。
回调
一个简单的回调案例
function f1($arg1, $arg2)
{
echo __FUNCTION__.'exec, the args is:'.$arg1.' '.$arg2;
echo "<br>";
}
call_user_func('f1', 'han', 'wen');
call_user_func_array('f1', array('f1', array('han', 'wen')));
目前在我看来回调函数就是通过函数call_user_func和call_user_func_array来指定函数名和参数来调用函数,具体用途还不太清楚。
匿名函数和闭包Closure
$func = function() {
}; //带结束符
$func = function( $param ) {
echo $param;
};
$func( 'some string' );
//输出:
//some string
这篇文章不错http://www.cnblogs.com/melonblog/archive/2013/05/01/3052611.html
顺便发现一个强大函数preg_replace_callback
对象与设计
内聚: 是一个模块内部各成分之间相关联程度的度量。
耦合:紧密相连,依赖太重
深入php面向对象和模式的更多相关文章
- JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法)
JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法) 一丶正则的用法 创建正则对象: 方式一: var reg=new ...
- 面向对象架构模式之:领域模型(Domain Model)
一:面向对象设计中最简单的部分与最难的部分 如果说事务脚本是 面向过程 的,那么领域模型就是 面向对象 的.面向对象的一个很重要的点就是:“把事情交给最适合的类去做”,即:“你得在一个个领域类之间跳转 ...
- 【JavaScript】 JS面向对象的模式与实践 (重点整治原型这个熊孩子 (/= _ =)/~┴┴ )
参考书籍 <JavaScript高级语言程序设计>—— Nicholas C.Zakas <你不知道的JavaScript> —— KYLE SIMPSON 在JS的面向 ...
- 读《深入PHP 面向对象、模式与实践》笔记
1. include() 和require() 语句的不同在于它们如何处理错误.使用require()调用文件发生错误时,将会停止整个程序;调用include()时遇到相同的错误,则会生成警告并停止执 ...
- 读《深入php面向对象、模式与实践》有感(三)
命令模式: 第一次接触到这个命令模式的时候,感觉它很像一个简化的mvc框架.从不同的路径访问,再由控制器来判断所要调用的具体php文件. <?php class CommandContext{ ...
- 读《深入php面向对象、模式与实践》有感(二)
书中关于设计模式的介绍很详细. 一.单例模式 作者建了一个preferences类来解释什么是单例模式.这个preferences类并非我第一次见到,在android中也有这个类,不过以前都是只管用即 ...
- 面向对象DAO模式
DAO模式编写数据访问层代码步骤? 1. 接口 增.删.改.查的方法 方法的返回类型为泛型集合 Int rows=select语句的条数 If(rows>0) 方法的返回类型为泛型集合 If( ...
- 《深入PHP:面向对象、模式与实践》(一)
第1章 PHP:设计与管理 本章主要介绍了本书有哪些内容. 第2章 PHP与对象 本章总结了PHP面向对象特性的发展过程,逐步介绍对象的概念. PHP/FI:支持变量.关联数组和函数.没有对象. ...
- 读《深入php面向对象、模式与实践》有感(一)
什么样的代码需要改进?书中给出了四个标准(我个人比较认可这四个标准,实际开发中也的确时常遇到): 一.代码重复 用书中的原话讲:“如果你在写代码的时候,总是感觉似曾相识,很可能你的代码已经重复了”. ...
随机推荐
- 应注意的Flex&Bison潜规则
1.Flex的二义性模式 语法分析器匹配输入时匹配尽可能多的字符串 如果两个模式都可以匹配的话,匹配在程序中更早出的模式. 针对这一点的理解,在语法分析文件当中,token的识别,应从特殊到一般的过程 ...
- salvage 数据块打捞工具
基本上所有数据库都是按块存储数据的,每种数据库的块都有自己有特征,我们可以找出特征,当数据库文件丢失,甚至文件系统完全损坏时,从硬盘扇区中把数据页打捞出来,从页从数据页中恢复出行数据.根据这个原理,开 ...
- thinkphp3.2引入php 实例化类
如果你的类库没有采用命名空间的话,需要使用import方法先加载类库文件,然后再进行实例化,例如:我们定义了一个Counter类(位于Com/Sina/Util/Counter.class.php): ...
- StringBuilder的Append()方法会比+=效率高
StringBuilder strSql = new StringBuilder(); strSql.Append("select top 1 id from " + databa ...
- 使用c#检测文件正在被那个进程占用
要检测文件被那个进程占用,需要使用微软提供的工具Handle.exe,这里有微软提供的下载 我们可以在c#中调用Handle.exe 来检测到底哪个进程占用了文件 string fileName = ...
- linux 神器之wget
1.什么是Wget? 首页,它是网络命令中最基本的.最好用的命令之一; 文字接口网页浏览器的好工具. 它(GNU Wget)是一个非交互从网上下载的自由工具(功能).它支持http.ftp.https ...
- phpcms v9二级栏目生成到根目录后三级栏目无法访问的解决办法
这个栏目问题折腾了我一天多,可怜我这个美工又不会程序!!! 我的问题是: 我的栏目设置如下: 一级栏目[生成到根目录(是)]> 二级栏目[生成到根目录(是)] > 三级栏目[生成到根目录( ...
- linux 输入子系统(4)---- input子系统的初始化
Input子系统的初始化函数为input_init(),如下: static int __init input_init(void) { int err; input_init_abs_bypass( ...
- MDI-多文档窗体
1.IsMdicontainer属性设置是否为多文档窗体 this.IsMdiContainer = true; 2.MdiParent属性设置为父窗体 Frm_Child frm = new Frm ...
- 第二章 约束和排序数据(SQL基础)
第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时,条件包括边界值: ...