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. 【环境学习】ThinkPHP5 5.0.22/5.1.29 远程代码执行漏洞

    环境保留:2019.4.4-4.10 环境搭建: 这里我使用的是:vulhub vulhub目录结构:vulhub/thinkphp/5-rcess 测试地址(开放一段时间供大家学习):http:// ...

  2. ASP.NET Core 2.0 多应用实现Cookie共享

    前言 .NET Core 2.0 发布之后,在Authentication中间件部分,相关API有不少改动(官方文档),本文主要讲的就是实现应用Cookie共享,对Cookie中间件使用不了解的可以去 ...

  3. Swift5 语言参考(六) 声明

    一个声明引入了一个新的名称或构建到你的程序.例如,您使用声明来引入函数和方法,引入变量和常量,以及定义枚举,结构,类和协议类型.您还可以使用声明来扩展现有命名类型的行为,并将符号导入到其他地方声明的程 ...

  4. TakePhoto实现拍照得到图片和从相册得到图片

    在学郭霖大神的第一行代码的时候,学到利用相机拍照和从本地相册取照片的那一小节的时候,代码写出来但是出了很多问题,APP老是崩溃,一番百度最终还是没有找到解决办法 无奈只能用别人现成的轮子了,然后就发现 ...

  5. 关于OC中的几种延迟执行方式

    第一种: [UIView animateWithDuration: delay: options: animations:^{ self.btn.transform = CGAffineTransfo ...

  6. Spring4 mvc+maven 框架搭建(2)

    在上一篇博客中,数据库数据和mybatis相关的java代码已经生成,接下来就可以使用IDE工具来搭建框架了. 在这里,我使用maven构建和管理代码,使用jdk1.8环境. 首先打开Eclipse, ...

  7. Android返回系统Home桌面

    Intent intent = new Intent(); // 为Intent设置Action.Category属性 intent.setAction(Intent.ACTION_MAIN);// ...

  8. php -- 格式化字符串

    ----- 003-output.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv=" ...

  9. 世界上最短的bash脚本

    世界上最短的bash脚本长这样: #!/bin/bash 为啥呢?见下图: 推荐一篇文章,讲解为啥shell脚本开头总是"#!/bin/bash".文风太清奇,不好翻译,看原文吧: ...

  10. docker OCI runtime

    Open Container Initiative(OCI)目前有2个标准:runtime-spec以及image-spec.前者规定了如何运行解压过的filesystem bundle.OCI规定了 ...