我正在使用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
问题是我如何成功运行那些功能?
答案 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());
结果:
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>
编辑:
<?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');
结果:
<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'));