【问题标题】:How to call a function from an array, which is in a class如何从类中的数组调用函数
【发布时间】:2012-06-05 05:38:39
【问题描述】:

我的问题是,我有一个函数存储在一个数组中,该数组是类的一部分。我想使用call_user_func() 从这个数组中调用一个函数,但是我似乎不知道如何写这个。

从不在类中的数组中调用函数可以这样完成。

 $thearray = array( 0 => 'funcone', 1 => 'functwo');
 call_user_func($thearray[0]);

但是,当我尝试对类中的数组执行此操作时,它确实发送了工作,我想是因为我需要以某种方式引用该类。我知道你可以从这样的类中调用一个函数:

 call_user_func(array($myclass, 'funcone'));

但我的问题是如何使用 call_user_func() 从类中的数组调用函数;我希望有人可以帮助我,我有一种感觉,这只是它的写作方式的问题。

【问题讨论】:

  • 检查funcone是公共非静态函数

标签: php arrays class function


【解决方案1】:

假设类中的数组是公开的,你可以这样做:

call_user_func(array($myclass, $myclass->thearray[0]));

这回答了你的问题吗?

更新

我尝试了以下方法并且成功了:

<?php
class Foo {
    public function bar() {
        echo "quux\n";
    }

    public $baz = array('bar');
}

$foo = new Foo();
call_user_func(array($foo, $foo->baz[0]));

shell$ php userfunc.php 
quux

【讨论】:

  • 恐怕不起作用,我在询问之前尝试过这样做,这似乎合乎逻辑,但不幸的是它没有。
  • @Alex 你能描述一下你的类结构吗?
  • 它只是我为测试天气而创建的一个类,我可以从其中的数组中调用一个函数,因为我有一种感觉,我可能会遇到麻烦;它只有两个公共函数和一个变量,该变量有一个包含两个函数名称的数组,就像上面的那个。
  • @Alex 我尝试了一个示例程序,它似乎可以工作。希望这是您的要求。
  • 太棒了!成功了,你先生太棒了,非常感谢你,所以结果证明这是一个公开变量的案例,是吗?
【解决方案2】:

试试这个?

call_user_func(array($this, $thearray[0]));

http://codepad.org/lCCUJYLK

【讨论】:

  • 没关系;但这不是我的问题,我试图调用一个数组中的函数,该函数在一个类中,就像我在上面展示的那样;不仅仅是一个类中的函数。
  • 我不确定我明白了。你是什​​么意思说'数组内的函数'?如果 $thearray 是您的私有变量,那么只需调用它$this-&gt;thearray[0]
【解决方案3】:

请耐心等待,因为它会有点长。 :)

好吧,我认为我们可以通过 PHP 的 overloading 概念来实现这一点,正如你们大多数人所知,它与其他面向对象的语言完全不同。

来自 PHP 手册的重载页面 - Overloading in PHP provides means to dynamically "create" properties and methods. These dynamic entities are processed via magic methods one can establish in a class for various action types. (http://www.php.net/manual/en/language.oop5.overloading.php)

这种重载魔法很大程度上取决于 PHP 的 magic methods

如果你看到魔法方法列表,这里可以帮助我们的是__call()

每次调用不存在的类方法时都会调用魔术方法__call。

这将帮助我们防止抛出任何错误/设置任何自定义消息。所以,这里有一个我们可以用来解决上述问题的例子。

<?php
class Test
{
    private $arr = array( 'funcone', 'functwo' );

    public function __call( $func_name, $func_args ) {
        echo "Method called: " . $func_name . "\n";
        echo "Arguments passed: " . $func_args . "\n";

        // this will call the desired function.
        call_user_func( array( $this, $this->arr[ $func_args ] ) );
    }
}

$obj = new Test;
// run the first function in the array
$obj->runTest(0);
?>

希望对您有所帮助。如果这不起作用,我相信它可以通过一些试验和错误进行调整。 (现在,我说的是 PHP,对吗?调整... ;))

【讨论】:

  • 感谢您提供详细的答案,我试图在课堂外调用函数,@g13n 为我回答了这个问题;无论如何,谢谢,这似乎是一个有趣的方法。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多