将函数和类的名称存储在数组中,并从同一类中调用它

时间:2018-06-23 05:47:47

标签: php arrays

我正在使用WordPress Admin Page。我需要为不同的标签存储函数名称。并将它们应用于不同的标签。标签名称由$_GET[]从网站网址获取

我可以像这样Foo::{$value['function']}();来应用功能 但是foreach中的类名称也应该是动态的。假设我有两个Foo和Bar。Foo包含方法-generateSettingsPage()和Bar包含generatePaymentsPage()方法。我需要按如下方式要求这些方法foreach循环中的以下代码

下面是我在“我的课程”中使用的函数中的代码

class Foo{
   public static function adminPageContents(){
    $currenttab = (isset($_REQUEST['tab'])) ? esc_html($_REQUEST['tab']) : 'settings';
    $tabcontents = array(
        'settings'  => array(
            'name' => esc_html__( 'General Settings', WP_SEVENT_SLUG ),
            'function' => 'generateSettingsPage',
            'class' => 'Foo',
        ),
        'payments'  => array(
            'name' => esc_html__( 'Payments Settings', WP_SEVENT_SLUG ),
            'function' => 'generatePaymentsPage',
            'class' => 'Bar',
         ),
    );

    ?>

        <div class="sevent-main-admin-container">
            <?php
                // self::generateSettingsPage();
                foreach ($tabcontents as $key => $value) {
                    if ($key == $currenttab) {
                        $value['class']::{$value['function']}(); //Something need to be changed here
                    }
                }
            ?>
        </div>

    <?php
   }

   public static function generateSettingsPage(){echo 'works';}

}

class Bar{
   public static function generatePaymentsPage(){}
}

我具有选项卡中的功能:

Fatal error: Class 'Foo' not found

问题是我如何成功运行那些功能?

2 个答案:

答案 0 :(得分:0)

如果我要使用静态类,则可以像下面那样进行操作,而不必使用call_user_func,而是将方法用花括号括起来。

<?php
class Foo {
    public static function Init() {
        $tabcontents = [
            ['function' => 'A'],
            ['function' => 'B'],
            ['function' => 'C'],
        ];

        $result = [];
        foreach ($tabcontents as $key => $value) {
            $result[] = Foo::{$value['function']}();
        }

        return $result;
    }

    public static function A() {return 'A';}
    public static function B() {return 'B';}
    public static function C() {return 'C';}
}

print_r(Foo::Init());

https://3v4l.org/ZTuaf

结果:

Array
(
    [0] => A
    [1] => B
    [2] => C
)

此外,您可以像下面那样进行操作,只需调用该方法即可,而无需循环。

<?php
class Foo {
    public static function Init($tab) {
        ob_start();
        echo '<div class="sevent-main-admin-container">';
        if (method_exists('Foo', 'generate'.$tab.'Page')) {
           echo Foo::{'generate'.$tab.'Page'}(); 
        } else {
            echo 'Not found';
        }
        echo '</div>';
        return ob_get_clean();
    }

    public static function generateAPage() {return 'A';}
    public static function generateBPage() {return 'B';}
    public static function generateCPage() {return 'C';}
}


$_REQUEST['tab'] = 'A';

echo Foo::Init($_REQUEST['tab']).PHP_EOL;

echo Foo::Init('Z');

结果:

<div class="sevent-main-admin-container">A</div>
<div class="sevent-main-admin-container">Not found</div>

https://3v4l.org/EORZr

编辑:

<?php
class Factory {
    public static function Init($tab) {
        $tabcontents = array(
            'settings'  => array(
                'function' => 'generateSettingsPage',
                'class' => 'Foo',
            ),
            'payments'  => array(
                'function' => 'generatePaymentsPage',
                'class' => 'Bar',
             ),
        );

        ob_start();
        echo '<div class="sevent-main-admin-container">';
        if (method_exists($tabcontents[$tab]['class'], $tabcontents[$tab]['function'])) {
            echo call_user_func([$tabcontents[$tab]['class'], $tabcontents[$tab]['function']]);
        } else {
            echo 'Not found';
        }
        echo '</div>';
        return ob_get_clean();
    }
}


class Foo {
    public static function generateSettingsPage() {return 'Foo::generateSettingsPage';}
    public static function generatePaymentsPage() {return 'Foo::generatePaymentsPage';}
}

class Bar {
    public static function generateSettingsPage() {return 'Bar::generateSettingsPage';}
    public static function generatePaymentsPage() {return 'Bar::generatePaymentsPage';}
}

echo Factory::Init('settings').PHP_EOL;
echo Factory::Init('payments').PHP_EOL;

echo Factory::Init('Z');

https://3v4l.org/mCqbB

结果:

<div class="sevent-main-admin-container">Foo::generateSettingsPage</div>
<div class="sevent-main-admin-container">Bar::generatePaymentsPage</div>
<div class="sevent-main-admin-container">Not found</div>

答案 1 :(得分:0)

您的问题是您尝试调用call_user_func()中的函数的方式,而不是将此(self::$value['function'])当作是调用$value['function']中的函数self的方式,正在寻找名为self::$value['function']的变量。相反,您应该使用...

call_user_func(array(__CLASS__, $value['function']));

在这里,可调用项被声明为一个数组,以类名和函数名作为两个参数。 manual

中的示例
// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod'));