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面向对象高级-魔术方法与迭代器的更多相关文章

  1. Python 面向对象(三) 魔术方法

    __getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...

  2. PHP面向对象之魔术方法复习

    魔术方法复习 2014-9-2 10:08:00 NotePad++ By jiancaigege 飞鸿影~========================= 1.__construct() 构造方法 ...

  3. Python - 面向对象编程 - 魔术方法(双下划线方法)

    什么是魔术方法 在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法 有哪些重要的魔术方法? __new__ https://www.c ...

  4. Python面向对象之魔术方法

    __str__ 改变对象的字符串显示.可以理解为使用print函数打印一个对象时,会自动调用对象的__str__方法 class Student: def __init__(self, name, a ...

  5. 十八、Python面向对象之魔术方法

    1.类的比较 class A(object): def __init__(self,value): self.value = value def __eq__(self,other): return ...

  6. PHP面向对象的魔术方法.png(不间断更新)

  7. Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

    本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.   ...

  8. 前端学PHP之面向对象系列第二篇——魔术方法

    × 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...

  9. PHP面向对象常见的关键字和魔术方法

    在PHP5的面向对象程序设计中提供了一些常见的关键字,用来修饰类.成员属性或成员方法,使他们具有特定的功能,例如final.static.const等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...

随机推荐

  1. delphi char数组、string和Pchar的相互转换

    因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组.string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原 ...

  2. [JavaScript] iframe更改了src后,父页面history.back只能后退iframe而不能使自己后退解决办法

    浏览器的机制如此,在iframe导航变化后手动点击浏览器的后退按钮也依然只是后退iframe中的导航. 有一种解决方案是不要修改iframe.src,而是删除旧iframe元素,新建一个iframe元 ...

  3. Swift5 语言参考(十) 语法汇总

    词法结构 GRAMMAR OF WHITESPACE whitespace → whitespace-item whitespace opt whitespace-item → line-break ...

  4. 移动端测试接口--Fiddler抓包工具

    Fiddler抓包工具是一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据,可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求,支持监视.设置断 ...

  5. 文件压缩小项目haffman压缩

    文件压缩的原理: 文件压缩总体可以分为有损压缩和无损压缩两类,有损压缩是指对mp3等格式的文件,忽略一些无关紧要的信息,只保留一些关键的信息,但并不因此影响用户对于这些mp3格式文件的体验度,无损压缩 ...

  6. 在Ubuntu 16.04上利用Jexus+.Net Core+Linux版SQL Server部署ZKEACMS.Core

    百度传课视频地址:https://chuanke.baidu.com/v5849090-223278-1498090.html 一.SQL Server on Linux的安装 官方文档:https: ...

  7. 集合框架_DAY16

    1:List及其子类(掌握)     (1)List的特点:     Collection    |--List:元素有序(存入顺序和取出顺序一致),可重复.    |--Set:元素无序,唯一.   ...

  8. 线程中消费者生产者的实例代码(synchronized关键字)

    http://www.cnblogs.com/DreamDrive/p/6204665.html  这个是用Lock类实现的. 场景: 厨师类: import java.util.List; impo ...

  9. TensorFlow.js之安装与核心概念

    TensorFlow.js是通过WebGL加速.基于浏览器的机器学习js框架.通过tensorflow.js,我们可以在浏览器中开发机器学习.运行现有的模型或者重新训练现有的模型. 一.安装     ...

  10. Shell脚本 | 一键获取安卓应用活动名

    上篇文章提到,启动时间的计算需要用到应用启动页的活动名(Activity_Name). 如何获取活动名呢?通常有如下几种方式: 1.询问 Dev 同事 2.adb logcat ActivityMan ...