php Collection类的设计

用。net开发已经很多年了,最近接触到php,发现php也很好玩。不过发现它里面没有集合Collection类,只有数组,并且数组很强。这里我用数组来包装成一个集合Collection,代码如下:

class Collection{private $_members=array();public  function addItem($obj,$key=null){if($key){if(isset($this->_members[$key])){throw  new exception("Key \"$key\" already in use!");}else{$this->_members[$key]=$obj;}}else{$this->_members[]=$obj;}}public function removeItem($key){if(isset($this->_members[$key])){unset($this->_members[$key]);}else{throw new exception("Invalid Key \"$key\"!");}}public function getItem($key){if(isset($this->_members[$key])){return $this->_members[$key];}else{throw new  exception("Invalid Key \"$key\"!");}}public function Keys(){return array_keys($this->_members);}public function legth(){return sizeof($this->_members);}public function exists($key){return (isset($this->_members[$key]));}
}

现在我们来测试一下这个集合是否好用。

我们首先建立一个集合元素类Course:

class  Course
{private $_id;private $_courseCode;private $_name;public function __construct($id,$courseCode,$name){$this->_id=$id;$this->_courseCode=$courseCode;$this->_name=$name;}public function getName(){return $this->_name;}public function getID(){return $this->_id;}public function getCourseCode(){return $this->_courseCode;}public function __toString(){return $this->_name;}
}

测试代码如下:
$courses=new Collection();
$courses->addItem(new Course(1, "001", "语文"),1);
$courses->addItem(new Course(2, "002", "数学"),2);
$obj=$courses->getItem(1);
print $obj;
我想这个集合类应该可以满足我们平日开发的需求了吧。
可是我们现在。net里面有个对象延迟加载,举个例子来说吧,假如现在有Student这个对象,它应该有很多Course,但是我们希望在访问Course之前Course是不会加载的。也就是说在实例化Student的时候Course个数为0,当我们需要Course的时候它才真正从数据库读取相应数据。就是需要我们把Collection做成惰性实例化。
修改后的Collection代码如下:

class Collection {private $_members = array();    //collection members
private $_onload;               //holder for callback function
private $_isLoaded = false;     //flag that indicates whether the callback//has been invoked
public function addItem($obj, $key = null) {$this->_checkCallback();      //_checkCallback is defined a little later
        if($key) {if(isset($this->_members[$key])) {throw new KeyInUseException("Key \"$key\" already in use!");} else {$this->_members[$key] = $obj;}} else {$this->_members[] = $obj;}}public function removeItem($key) {$this->_checkCallback();if(isset($this->_members[$key])) {unset($this->_members[$key]);} else {throw new KeyInvalidException("Invalid key \"$key\"!");}  }public function getItem($key) {$this->_checkCallback();if(isset($this->_members[$key])) {return $this->_members[$key];} else {throw new KeyInvalidException("Invalid key \"$key\"!");}}public function keys() {$this->_checkCallback();return array_keys($this->_members);}public function length() {$this->_checkCallback();return sizeof($this->_members);}public function exists($key) {$this->_checkCallback();return (isset($this->_members[$key]));}/*** Use this method to define a function to be * invoked prior to accessing the collection.  * The function should take a collection as a * its sole parameter.*/public function setLoadCallback($functionName, $objOrClass = null) {if($objOrClass) {$callback = array($objOrClass, $functionName);} else {$callback = $functionName;}//make sure the function/method is validif(!is_callable($callback, false, $callableName)) {throw new Exception("$callableName is not callable " . "as a parameter to onload");return false;}$this->_onload = $callback;}/*** Check to see if a callback has been defined and if so,* whether or not it has already been called.  If not,* invoke the callback function.*/private function _checkCallback() {if(isset($this->_onload) && !$this->_isLoaded) {$this->_isLoaded = true;call_user_func($this->_onload, $this);}}
}

所需的Student如下:

class CourseCollection extends Collection {public function addItem(Course $obj,$key=null) {parent::addItem($obj,$key);}
}
class Student{private $_id;private $_name;public $course;public	function __construct($id,$name){$this->_id=$id;$this->_name=$name;$this->course=new CourseCollection();$this->course->setLoadCallback('loadCourses',$this);}public function getName(){return $this->_name;}public function getID(){return $this->_id;}public function __toString(){return $this->_name;}public function loadCourses(Collection $col){$col->addItem(new Course(1, "001", "语文"),1);$col->addItem(new Course(2, "002", "数学"),2);}
}

调用代码如下:

$student=new Student(1, "majiang");
print $student->getName();
print $student->course->getItem(1);

 

转载于:https://www.cnblogs.com/majiang/archive/2012/11/23/2783779.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不当败家子的原因......

1 实在是太真实!▼2 有钱就是可以为所欲为(素材来源网络,侵删)▼3 在哪都要有仪式感!▼4 送自己去孤儿院......▼5 万万没想到...(图源网络,侵删)▼6 这都能催的?▼…

如何将 Linq 的查询结果转为 HashSet ?

咨询区 Jamie&#xff1a;我的类中有一个 ISet 类型的属性&#xff0c;我想将 linq 查询的结果赋给它&#xff0c;因为是 ISet 类型&#xff0c;所以我不知道是否有高效的方法将 linq 查询结果给之&#xff1f;简单来说&#xff0c;就像下面这样&#xff1a;ISet<T> foo …

ecs使用脚本安装oracle

ECS最低配置&#xff1a;CPU: 2核 内存&#xff1a;2G 数据盘&#xff1a;20G安装脚本分为 oracle11g 4个小版本&#xff0c;下载地址&#xff1a; http://zy-res.oss-cn-hangzhou-internal.aliyuncs.com/oracle/oracle11201.shhttp://zy-res.oss-cn-hangzhou-internal.aliyun…

我不信奉Scrum,我信奉敏捷

Scrum一直以来争论不断。虽然创始人Ken在演讲中曾说过即使是白痴也可以用Scrum&#xff0c;但是依然有很多人认为Scrum对团队成员的素质要求非常高。另据统计&#xff0c;75%以上的Scrum都可以称得上失败。 去年十月&#xff0c;有幸参加了Outsofting鲍央舟老师的Scrum培训。培…

仿京东商城源码java_Java+SSM实现类似京东的3C电子商城系统

需求分析基于Spring, SpringMVC, Mybatis 实现一个类似仿京东商城的3C电子商城系统, 能够实现商品管理与展示, 加入购物车, 支付购买等功能, 项目采用java技术进行开发。运行环境java, jdk1.8,tomcat8.5,mysql5.6,EclispseEE项目技术java, spring springmvc, mybatis, bootstra…

跨浏览器开发:CSS代码的金科玉律

作为Web设计师&#xff0c;你的网站在各种浏览器中有完全一样的表现是很多人的目标&#xff0c;然而这是一个永远无法真正实现的目标&#xff0c;很多人认为&#xff0c;完美的跨浏览器兼容并不必要&#xff0c;这样说虽然没错&#xff0c;但在很多情形&#xff0c;一种近似的兼…

Refit结合Polly访问ASP.NET Core Web API

前言在.NET Core应用中访问ASP.NET Core Web API接口&#xff0c;常用的方式是使用IHttpClientFactory生成HttpClient实例&#xff0c;并通过结合Polly策略&#xff0c;以实现重试&#xff0c;熔断等机制。在本文中&#xff0c;我们将介绍如何使用Refit&#xff0c;结合Polly访…

10个经典的爆炸化学反应,个个都是你惹不起的“暴脾气”

全世界只有3.14 % 的人关注了爆炸吧知识没有放过火&#xff0c;没有爆炸过&#xff0c;就不算真正学化学的。还有谁能比化学狗们的胆子更大、回忆更深刻吗&#xff1f;化学狗们能活到现在简直是个奇迹&#xff5e;&#xff5e;&#xff5e;懂的就默默转了吧&#xff01;小编整理…

根目录下各文件夹的作用

"/"目录下有好多文件&#xff0c;究竟有什么作用&#xff1f;整理综合了网上的一些资料&#xff0c;以RHEL6为标准。 一、管理类文件夹&#xff1a; /boot&#xff1a;包括内核和其它系统启动时使用的文件。 /initrd&#xff08;RHEL6中没有&#xff09;&#xff1a;…

java result元素_Java JDBC 中获取 ResultSet 的大小

当我们执行完一条Sql语句&#xff0c;获取到一个 ResultSet 对象后&#xff0c;有时我们需要立即知道到底返回了多少个元素&#xff0c;但是 ResultSet 并没有提供一个 size() 方法 or length 的属性&#xff0c;我们可以一个一个调用 next() 去累加计算&#xff0c;但是我们还…

wpf中的datagrid中如何显示图片

2012-09-11 10:55 在datagrid中添加一个模板列&#xff0c;xaml内容如下&#xff1a; <DataGridTemplateColumn Header"头像" Width"SizeToCells" IsReadOnly"True"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> &…

狗为什么吃屎?真相男默女泪,但看完后你也会流口水......

全世界只有3.14 % 的人关注了爆炸吧知识别人笑狗太疯癫狗笑他人看不穿据说&#xff0c;200%的网友在学习一门新语言时&#xff0c;都会从最基本的日常问候语开始学起&#xff0c;例如——骂人。危险动作&#xff0c;请勿模仿。那但凡是学过汉语的人应该都知道&#xff0c;咱们中…

linux limit

linux ulimit调优 2010-05-21 23:54:39| 分类&#xff1a; linux | 标签&#xff1a; |字号大中小 订阅 1,说明:ulimit用于shell启动进程所占用的资源.2,类别:shell内建命令3,语法格式:ulimit [-acdfHlmnpsStvw] [size]4,参数介绍:-H 设置硬件资源限制.-S 设置软件资源限制.-a …

java跨平台的特性_【简答题】什么是跨平台特性?Java怎样实现跨平台特性?

编制检索工具体系的基本要求是()。A、按需编制B、种类适当C、结构合理D、分工清楚E、著录标引规范儿童逻辑思维处于萌芽阶段是在()。A.4岁左右B.6岁左右C.8岁左右D.10岁左右幼儿鉴赏幼儿文学的特殊性是由幼儿的()所决定的。A.生活环境B.时代特征C.年龄心理特征D.个体工作面瓦斯…

WPF开发登录窗口之——添加文本输入框用户控件

WPF开发者QQ群&#xff1a; 340500857 | 微信群 目前人数太多&#xff0c;暂不开放窗口开发完成后&#xff0c;接下来就是开发客户区中的输入框控件&#xff0c;但在开发之前&#xff0c;我们先开发一个输入框基类&#xff0c;然后通过继承的方式去实现文本输入框与密码输入框…

JSTL分割字符 fn:split()

2019独角兽企业重金招聘Python工程师标准>>> <% page language"java" contentType"text/html; charsetUTF-8"%> <% taglib uri"http://java.sun.com/jsp/jstl/core" prefix"c"%> <% taglib uri"http:/…

javascript 中的暗物质 - 闭包

1. 诡异的闭包 javascript 中有一个特殊的特性 - 闭包&#xff0c;对于 .NET 程序员来说&#xff0c;比较熟悉的是面向对象的程序设计 OOP, 而来自函数式语言的闭包则显得比较诡异&#xff0c;许多程序员对它敬而远之。 对于闭包我们还是要从函数式语言的特点说起。 不知道你有…

女友的前男友教我该怎么照顾她......

1 总觉得不太对劲&#xff1f;▼2 这回复真神&#xff01;&#xff08;via.机智得赵老师&#xff09;▼3 奇怪的知识又增加了......▼4 卖茶小妹真的与时俱进...&#xff08;via.外卖小哥金城武&#xff09;▼5 超大容量花露水没见过吧&#xff1f;&#xff01;▼6 别人在…

笔记本电脑优化指南

一、旧本本运行如飞的八大绝技 由于目前技术以及其他因素的限制&#xff0c;主流配置的笔记本电脑仍然与主流台式机的性能有相当的差距&#xff0c;这差距表现出来的就是流畅度&#xff0c;但是只要优化得当&#xff0c;二手本本也能运行如飞&#xff01;1.系统优化首先&#…

浅谈.Net异步编程的前世今生----EAP篇

前言在上一篇博文中&#xff0c;我们提到了APM模型实现异步编程的模式&#xff0c;通过使用APM模型&#xff0c;可以简化.Net中编写异步程序的方式&#xff0c;但APM模型本身依然存在一些缺点&#xff0c;如无法得知操作进度&#xff0c;不能取消异步操作等。针对这些缺点&…