我试图玩PHP5.3和关闭.

我在这里看到(清单7中的对象关闭:http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html)可以在回调函数中使用$this,但不是.所以我试图给$$作为使用变量:

$self = $this;
$foo = function() use($self) { //do something with $self }

所以要用同样的例子:

class Dog
{
private $_name;
protected $_color;

public function __construct($name,$color)
{
     $this->_name = $name;
     $this->_color = $color;
}
public function greet($greeting)
{
     $self = $this;
     return function() use ($greeting,$self) {
         echo "$greeting,I am a {$self->_color} dog named {$self->_name}.";
     };
}
}

$dog = new Dog("Rover","red");
$dog->greet("Hello");

Output:
Hello,I am a red dog named Rover.

首先这个例子不打印字符串但是返回函数,但这不是我的问题.

其次,我无法访问私有或受保护,因为回调函数是一个全局函数,而不是在上下文中从Dog对象.不是我的问题与以下相同:

function greet($greeting,$object) {
    echo "$greeting,I am a {$self->_color} dog named {$self->_name}.";
}

而且我要 :

public function greet($greeting) {
    echo "$greeting,I am a {$self->_color} dog named {$self->_name}.";
}

哪个来自狗而不是全球.

嗯,你不能使用$this的全部原因是因为闭包是后台的对象(Closure类).

这有两种方法.首先,添加__invoke方法(如果调用$obj(),调用)..

class Dog {

    public function __invoke($method) {
        $args = func_get_args();
        array_shift($args); //get rid of the method name
        if (is_callable(array($this,$method))) {
            return call_user_func_array(array($this,$method),$args);
        } else {
            throw new BadMethodCallException('UnkNown method: '.$method);
        }
    }

    public function greet($greeting) {
        $self = $this;
        return function() use ($greeting,$self) {
            $self('do_greet',$greeting);
        };
    }

    protected function do_greet($greeting) {
        echo "$greeting,I am a {$this->_color} dog named {$this->_name}.";
    }
}

如果您想要修改主机对象时关闭不变,您可以将返回函数更改为:

public function greet($greeting) {
    $self = (clone) $this;
    return function() use ($greeting,$self) {
        $self('do_greet',$greeting);
    };
}

另一个选择是提供一个通用的getter:

class Dog {

    public function __get($name) {
        return isset($this->$name) ? $this->$name : null;
    }

}

有关更多信息,请参阅:http://www.php.net/manual/en/language.oop5.magic.php

php – 根据类定义一个闭包作为方法的更多相关文章

  1. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  2. swift之ARC

    Swift使用自动引用计数来跟踪并管理应用使用的内存。大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情。为了保证不会发生上述的情况,ARC跟踪与类的实例相关的属性、常量以及变量的数量。解决实例间的强引用环Swift提供两种方法来解决强引用环:弱引用和无主引用。在Swift语言中,推荐用可选类型来作为可能没有值的引用的类型。

  3. Swift的函数与函数指针、闭包Closure等相关内容介绍

  4. 《The Swift Programming Language》2.0版之自动引用计数

    Swift1.0文档翻译:TimothyYeSwift1.0文档校对:HawsteinSwift2.0文档校对及翻译润色:ChannePS:之前1.0版中文版看不懂地方在对比英文版后就懂了,还是之前翻译的不够准确啊。,而不是Person),它们的值会被自动初始化为nil,目前还不会引用到Person类的实例。由于Person类的新实例被赋值给了reference1变量,所以reference1到Person类的新实例之间建立了一个强引用。在你将john和number73赋值为nil后,强引用关系如下图:P

  5. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  6. Swift排序Sort函数用法

    简书地址:http://www.jianshu.com/p/ad71c94e7bc6摘自stackoverflow的问答用了几分钟做的简单翻译一个例子直接贴代码,不过多解释下面是闭包的进阶使用

  7. Swift2.0初见笔记

    Swift2.01.简单值1.使用let来声明常量,常量无法改变;使用var来声明变量.2.常量或者变量的类型必须和你赋给它们的值一样。后面的东西都会被忽略,并且整个表达式返回nil。在switch里,枚举成员使用缩写.Hearts来引用,因为self的值已经知道是一个suit。SimpleClass的声明不需要标记任何方法因为类中的方法经常会修改类。

  8. swift学习2 元组 tuples

    swift中出现了一种新的数据结构,非常牛掰的元组tuples如果懂PHP的猿,会发现这个元组和PHP的数组非常类似,同样是可以默认不指定key,也可以指定key目前的学习疑问是,如何进行元组的遍历?

  9. Swift2.1-自动引用计数

    官方文档Swift使用自动引用计数机制来追踪和管理你的app的内存。在大多数情况,这意味着Swift的内存管理机制会一直起作用,你不需要自己考虑内存管理。注意引用计数只应用于类的实例。因此,当你断开john和unit4A变量所持有的强引用时,引用计数并不会降为0,实例也不会被ARC销毁:注意,当你把这两个变量设为nil时,没有任何一个析构函数被调用。若引用不能声明为常量。在Swift中,推荐使用可选类型描述可能没有值的类型。

  10. Swift 编程语言入门教程

    Swift是供iOS和OSX应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来是的编程更加简单、灵活和有趣。Swift已经存在了多年。基于这些基础,Swift引入了很多新功能和结合面向过程和面向对象的功能。Swift对新的程序员也是友好的。Swift集成了现代编程语言思想,以及Apple工程文化的智慧。Swift是编写iOS和OSX应用的梦幻方式,并且会持续推进新功能的引入。2Swift入门一个新语言的学习应该从打印"Hello

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部