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等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...
随机推荐
- 【算法python实现】 -- 不同路径
原题:https://leetcode-cn.com/problems/unique-paths/ 问题描述 n行m列的表格,从a[0][0]出发,每次只能右移一步或者下移一步,求到a[n-1][m- ...
- Code Chef April Cook-Off 2019题解
传送门 \(PEWDSVTS\) 我哪根筋不对了要把所有可行的拿出来\(sort\)一下--还有忘开\(long\ long\)真的好难受-- int main(){ // freopen(" ...
- underscore.js源码研究(8)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- 03-03 java 顺序语句结构,选择结构if语句
顺序结构: /* 流程控制语句:可以控制程序的执行流程. 分类: 顺序结构 选择结构 循环结构 顺序结构: 从上往下,依次执行. */ class ShunXuJieGouDemo { public ...
- 关于Python2和Python3之间的文本模型改变
原文地址:http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html#what-act ...
- Docker中使用createdump调试coreclr
应用上线后可能出现一些问题,通过源码排查,日志分析都不能确定具体原因的情况下,可以使用dump转存文件分析,netcore对于linux系统dump提供了createdump工具,配合lldb sos ...
- 修复/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory问题
在配置MongDB的是时候出现这/lib/ld-linux.so.2问题 [root@localhost local]# /usr/local/mongodb/mongodb/bin/mongod - ...
- TFS2018环境搭建一硬件要求
本文关于微软的团队协作工具TFS2018搭建 1.操作系统要求 TFS可以安装在Windows Server和Windows PC操作系统中,但是TFS2018和2018只支持64位操作系统中,早期的 ...
- charles重复发包工具/repeat
重复发包工具/repeat Charles 让你选择一个请求并重复,在测试后端接口的时候非常有用: Charles将请求重新发送到服务器,并将响应显示为新请求. 如果您进行后端更改并希望测试它们,用了 ...
- IntelliJ IDEA(Ultimate版本)的下载、安装和WordCount的初步使用(本地模式和集群模式)
不多说,直接上干货! IntelliJ IDEA号称当前Java开发效率最高的IDE工具.IntelliJ IDEA有两个版本:社区版(Community)和旗舰版(Ultimate).社区版时免费的 ...