php面向对象高级-魔术方法与迭代器
1,魔术方法__set与__get, __call
>这些魔术方法,将在相关的属性或者方法不存在时调用
>函数原型
.function __set( $property, $value ):传递属性的名字和新的值
.function __get( $property ):传递属性的名字,并且返回属性的值
.function __call( $methods, $args ):传递方法的名字和一个数字索引的数组,数组包含传递的参数,第一个参数的索引是0
class Coordinate {
private $arr = array( 'x' => null, 'y' => null );
function __get( $property ) {
if( array_key_exists( $property, $this->arr ) ){
return $this->arr[$property];
}else {
print "不能访问一个不存在的键名" . PHP_EOL;
}
}
function __set( $property, $value ) {
if( array_key_exists( $property, $this->arr ) ) {
$this->arr[$property] = $value;
}else {
print "不能设置一个不存在的键名" . PHP_EOL;
}
}
}
$obj = new Coordinate();
$obj->x = 10;
echo $obj->x . PHP_EOL;
$obj->n = 20;
echo $obj->n . PHP_EOL;
2,__call的应用
>通过__call可以使HelloWorldDelegator的实例调用HelloWorld的任意存在的方法
class HelloWorld {
function display( $count ){
for( $i = 0 ; $i < $count; $i++ ) {
echo "Hello World $i " . PHP_EOL;
}
return $count;
}
}
class HelloWorldDelegator {
private $obj;
function __construct(){
$this->obj = new HelloWorld();
}
function __call( $method, $args ) {
return call_user_func_array( array( $this->obj, $method ), $args );
}
}
$obj = new HelloWorldDelegator();
print $obj->display( 3 );
print PHP_EOL;
$obj->show();
3,迭代
>实现一个自己的迭代器,可以通过实现Iterator接口
Iterator接口原型:
Iterator extends Traversable {
/* Methods */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public bool valid ( void )
}
class NumberSquared implements Iterator {
private $start;
private $end;
private $cur;
function __construct ( $start, $end ){
$this->start = $start;
$this->end = $end;
}
function rewind(){
$this->cur = $this->start;
}
function key(){
return $this->cur;
}
function current(){
return pow( $this->cur, 2 );
}
function next(){
$this->cur++;
}
function valid(){
return $this->cur <= $this->end;
}
}
$obj = new NumberSquared( 3, 9 );
foreach( $obj as $key => $value ){
print "the square of $key is $value" . PHP_EOL;
}
类本身一般用来表示数据和拥有与这些数据的交互方法,所以一般不需要一个纯粹的类迭代器,我们可以实现另一个接口:IteratorAggregate,接口摘要如下:
IteratorAggregate extends Traversable {
/* Methods */
abstract public Traversable getIterator ( void )
}
这个接口只有一个方法,作用是创建一个外部的迭代器接口
改造后的迭代,实现了迭代器与数据处理的分离:
class NumberSquared implements IteratorAggregate {
private $start;
private $end;
function __construct( $start, $end ) {
$this->start = $start;
$this->end = $end;
}
function getIterator(){
return new NumberSquaredIterator( $this );
}
function getStart(){
return $this->start;
}
function getEnd(){
return $this->end;
}
}
class NumberSquaredIterator implements Iterator {
private $cur;
private $obj;
function __construct( $obj ) {
$this->obj = $obj;
}
function rewind(){
$this->cur = $this->obj->getStart();
}
function key(){
return $this->cur;
}
function next(){
$this->cur++;
}
function current(){
return pow( $this->cur, 2 );
}
function valid(){
return $this->cur <= $this->obj->getEnd();
}
}
$obj = new NumberSquared( 3, 9 );
foreach( $obj as $key => $value ) {
print "the $key is $value " . PHP_EOL;
}
php面向对象高级-魔术方法与迭代器的更多相关文章
- Python 面向对象(三) 魔术方法
__getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...
- PHP面向对象之魔术方法复习
魔术方法复习 2014-9-2 10:08:00 NotePad++ By jiancaigege 飞鸿影~========================= 1.__construct() 构造方法 ...
- Python - 面向对象编程 - 魔术方法(双下划线方法)
什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...
- Python面向对象之魔术方法
__str__ 改变对象的字符串显示.可以理解为使用print函数打印一个对象时,会自动调用对象的__str__方法 class Student: def __init__(self, name, a ...
- 十八、Python面向对象之魔术方法
1.类的比较 class A(object): def __init__(self,value): self.value = value def __eq__(self,other): return ...
- PHP面向对象的魔术方法.png(不间断更新)
- Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础
本节内容: 1. 面向对象高级语法部分 1.1 静态方法.类方法.属性方法 1.2 类的特殊方法 1.3 反射 2. 异常处理 3. Socket开发基础 1. ...
- 前端学PHP之面向对象系列第二篇——魔术方法
× 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...
- PHP面向对象常见的关键字和魔术方法
在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...
随机推荐
- 文件寄生——寻找宿主的不归路(NTFS文件流实际应用)
咱们今天来研究下NTFS文件流: NTFS文件系统实现了多文件流特性,NTFS环境一个文件默认使用的是未命名的文件流,同时可创建其他命名的文件流,windows资源管理器默认不显示出文件的命名文件流, ...
- 利用koa打造restful API
概述 最近学习利用koa搭建API接口,小有所得,现在记录下来,供以后开发时参考,相信对其他人也有用. 就目前我所知道的而言,API有2种,一种是jsonp这种API,前端通过ajax来进行跨域请求获 ...
- 【Spark基础】:RDD
我的代码实践:https://github.com/wwcom614/Spark 1.RDD是Spark提供的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式 ...
- JAVA常见安全问题复现
地址来源于乌云知识库,作者z_zz_zzz 0x01 任意文件下载 web.xml的配置: <servlet> <description></description> ...
- HuLu机器学习问题与解答系列(1-8)
声明:本系列文章转载自微信公众号HULU,本人只是搬运工,仅供学习,如有不妥,后续告知删除. 嗨,欢迎回来,希望你能保持定期回顾的好习惯噢!下面是Hulu机器学习问题与解答系列的前8篇内容,点击主题名 ...
- (转) CentOS7.4 + MySQL8.0 + Git + Gogs搭建
原文:https://blog.csdn.net/qq_16075483/article/details/80295793 1.装系统,这个不会的下面就不用看了2.CentOS7.X安装MySQL8. ...
- Struts框架核心工作流程与原理
1.Struts2架构图 这是Struts2官方站点提供的Struts 2 的整体结构. 执行流程图 2.Struts2部分类介绍 这部分从Struts2参考文档中翻译就可以了. ActionM ...
- Android _关于fragment切换重新加载的解决分享给大家
在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment但是,这样会有一个问题 ,应该很多朋友都遇到过:每次切换的时候,Fragment都会重新实例化,也就是运行 ...
- 为什么要设置Java环境变量(windows)
在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PATH.正确地配置这些环境变量,是能够顺利学习.开发的前提.而经常出现的问题是:有的学习者能够按照提示 ...
- zepto中的touch库与fastclick
1. touch库实现了什么和引入背景 click事件在移动端上会有 300ms 的延迟,同时因为需要 长按 , 双触击 等富交互,所以我们通常都会引入类似 zepto 这样的库.zepto 中tou ...