嗨,目前我正在为我自己的主插件开发一个子插件。请参见下面的主要插件代码
<?php
class MyClass
{
function __construct()
{
function test1()
{
echo \'hii- test1\';
}
$this->autoload_function();
}
function autoload_function()
{
$my_array = array(
"test1"
);
foreach ($my_array as $my_function)
{
call_user_func($my_function);
}
}
}
$var = new MyClass();
?>
My sub plugin need to add more values to $my_array and i am allowed to use do_action or apply_filtere in main plugin.
我补充道
apply_filters
, 这样我就可以在我的子插件中修改$my\\u数组。
my-class.php
<?php
class MyClass
{
function __construct()
{
function test1()
{
echo \'hii- test1\';
}
$this->autoload_function();
}
function autoload_function()
{
$my_array = array(
"test1"
);
apply_filters(\'modify_array\', $my_array);
foreach ($my_array as $my_function)
{
call_user_func($my_function);
}
}
}
$var = new MyClass();
?>
在我的子插件中,我检查了过滤器,我可以看到过滤器工作正常,因此我可以修改子插件中$my\\u数组的值。
my-newpage.php
add_filter (\'modify_array\', \'modify_array_function\', 0);
function modify_array_function($my_array){
array_push($my_array, \'test2\')
}
在这里,我可以看到新的值被添加到数组中,但现在我必须在我的子插件中定义test2函数。
function test2(){
echo \'hii- test2\';
}
当我在我的子插件中编写test2函数时,我发现了以下错误。
警告:call\\u user\\u func()要求参数1是有效的回调,类\'MyClass\' does not have a method\'test2\'
现在我该如何解决这个问题?我是否需要在子插件中添加更多操作或过滤器。
The issue is due to call_user_func(\'test2\');
is called inside my-class.php 但是test2函数是在mycalss之外定义的。它是在我的子插件中定义的强>
请帮助解决此错误。
最合适的回答,由SO网友:Sally CJ 整理而成
所以我假设你的子插件加载在主插件之后,对吗?
在这里,我可以看到新的值被添加到数组中,但现在我必须在我的子插件中定义test2函数
如果你确定test2
已成功添加到阵列test2
正在从MyClass::autoload_function()
, 然后你可以试着用早钩like init
定义test2
,类似于:
<?php
/* Plugin Name: My Sub Plugin */
// Defines the test2() function.
function my_define_test2() {
function test2(){
echo \'hii- test2\';
}
}
// Now hook on init to ensure test2() is defined before your main plugin
// is loaded.
add_action( \'init\', \'my_define_test2\', 1 );
// And then add test2() to $my_array (that you defined in the main plugin).
add_filter( \'modify_array\', \'modify_array_function\' );
function modify_array_function( $my_array ) {
array_push( $my_array, \'test2\' );
return $my_array; // remember, filters must always return something =)
}
然而,如果
MyClass
当WordPress加载插件时,会立即实例化,比如这样,那么我认为您不可能定义
test2
之前
MyClass
已实例化。除非可能,如果你使用
Must Use 插件。
<?php
/* Plugin Name: My Main Plugin */
class MyClass { ... }
$var = new MyClass();