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等关键字.还有一些比较实用的魔术方法,用来提高类或对 ...
随机推荐
- react中组件的渲染
1.封装props对象 2.调用组件函数,得到返回的react元素 3.ReactDom把React元素转成真实的DOM元素并且插入到目标容器内部
- Weblogic 错误 <BEA-000403> <BEA-000438>解决办法
控制台提示如下错误: <Error> <Socket> <BEA-000438> <Unable to load performance pack. Us ...
- 【AWK】:常用总结
单机文本数据处理,常用AWK,总结一下AWK最常用的要点,备忘备查. 1.What is AWK(1)Aho.Weinberger.Kernighan三位发明者名字首字母:(2)一个行文本处理工具: ...
- 修改tomcat默认端口号
修改tomcat端口号 端口修改tomcat tomcat服务器的默认端口号是8080 1 只启动一个tomcat的情况 当我们不想使用8080端口,需要修改为其他端口时,我们可以: 1, 打开tom ...
- Smart/400开发上手4: 调试Cobol代码 (DEBUG with QBATCH)
Step1:Compile Cobol source CB TIM07 using *SRCDBG option例如:CB MEMBER(TIM07) OPTION(*SRCDBG) WORKU(TI ...
- GITLAB安装笔记
CentOS 7 最小安装后操作 设置时区timedatectl set-timezone Asia/Shanghai 添加 Gitlab 清华源 vi /etc/yum.repos.d/gitlab ...
- Oracle 扩展表空间大小的几种方式
环境:windows操作系统 增加表空间大小的四种方法Meathod1:给表空间增加数据文件 ALTER TABLESPACE app_data ADD DATAFILE 'D:\ORACLE\PRO ...
- Java代码调用Oracle的存储过程,存储函数和包
Java代码调用存储过程和存储函数要使用CallableStatement接口 查看API文档: 上代码: java代码调用如下的存储过程和函数: 查询某个员工的姓名 月薪 职位 create or ...
- (转)OpenSSL CVE-2016-0800 和 CVE-2016-0703 漏洞修复细节拾趣
原文:https://www.freebuf.com/vuls/97727.html 1. 引子 本来最近和360 Nirvan Team的DQ430愉快的参加某加密厂商的年度大会,结果openssl ...
- OAuth 2.0 安全案例回顾
原文:http://drops.wooyun.org/papers/598 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协议(如OpenID)更流行的原因是,业务双方不仅要求账号本身 ...