【问题标题】:Getting siblings of array of functions获取函数数组的兄弟姐妹
【发布时间】:2014-04-23 04:35:33
【问题描述】:

有没有办法在数组中获取函数的兄弟函数?

我有一个函数数组,类似于:

$thingy = [
  'do_something' => function() {
    // call $thingy['do_something_else']()?
  },

  'do_something_else' => function() {

    return 1234;
  }
];

有没有办法可以从do_something 拨打do_something_else?在其他语言中,如 javascript,您应该可以使用 this 或使用变量名 thingy

【问题讨论】:

  • 这不是一个对象有什么原因吗?
  • 我认为除了将函数声明为类的方法(而不是数组成员)之外,没有任何方法可以隐式执行您想要的操作。令人误解的是,在 JavaScript 中,函数有一个 this 名称,它隐含地是父对象,但不是必须。您可以使用.bind 或通过各种其他方式重新分配它。事实上,它是 JavaScript 中主要混乱的根源。
  • @RichardChristensen 不是真的,但动态添加函数更容易(不必使用create_function),而且我在上面做了一些数组函数。

标签: php


【解决方案1】:

是的。您可以通过引用传递$thingy 来实现这一点:

$thingy = [
    'do_something' => function() use (&$thingy) {
        echo $thingy['do_something_else'](); // just an example
    },
    'do_something_else' => function() {
        return 1234;
    }
];

示例用法:

$thingy['do_something']();

输出:

1234

Demo

【讨论】:

    【解决方案2】:

    做了一点挖掘,如果您更愿意使用对象而不是数组。你可以使用这个找到的小 php 脚本:

    https://gist.github.com/Mihailoff/3700483

    查看与您类似的问题:

    Creating anonymous objects in php

    它允许您创建 AnObj(),然后允许您在创建匿名函数时保持 OOP 方法。

    使用上面链接的 php 文件,你可以做到这一点。

    $thingy = new AnObj(array(
        'do_something' => function(){
            echo 'do_something';
        },
        'do_something_else' => function( $thingy ){
            $thingy->do_something();
            echo 'do_something_else';
        }
    ));
    
    $thingy->do_something_else( $thingy );
    

    尽可能使用对象只是我个人的偏好。

    【讨论】:

    • OP 已经在使用 Closure 对象,这是一种非常简洁的方式。我认为没有必要为此开设单独的课程。不过,这只是我的看法。
    • 正如您所见,您可以将$thingy 传递给do_something_else() 函数,该函数允许更动态的编码过程,可以允许更多$thingies,它们都具有略微不同的do_something()要传递给原始$thingy 的函数。就像使用数组一样,每次发生变化时,您总是必须定义 $thingy 。这对我来说允许更多的代码可重用性和松散耦合的设计。当然,这确实是一个偏好问题。
    • 对。不过,这取决于用例。为另一种方法 +1!
    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 2019-05-06
    • 1970-01-01
    • 2012-02-27
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多