为什么需要在数组中包装一个函数($ this,function)


8

我是PHP和WordPress的新手,所以请保持温柔!

我正在构建一个插件-遵循一些教程,使其全部正常工作。

我的问题是,为什么要调用的函数包含在array($this, function)?中?例如,我的类中有此构造函数代码

 function __construct() {
      add_action( 'admin_init',array( $this, 'getStuffDone' ) );
 }

getStuffDone函数可以正常启动-但是为什么必须采用其所使用的格式?

非常感谢任何见解。


1
我不知道有足够的了解OOP给一个信息的答案,但一些研究,给出了几个很好的参考:使用add_action与类PHP传递给函数
Howdy_McGee

切勿在构造函数中注册回调。这使您的代码不可测试。
fuxia

@toscho链接到示例正确的初始化设置?调用专用的init()函数还是从构造函数中调用某些东西?
lkraav 2015年

@lkraav参见gmazzap 对这个问题回答
fuxia

Answers:


6

这是一个PHP回调。您需要使用语法来保留对类实例的引用。

这么说吧-如果您没有$this,调用者如何知道这getStuffDone是您类的方法,而不仅仅是常规的PHP函数?没有。

array( $this, 'getStuffDone' )对PHP 使用says:

嗨,兄弟,您需要getStuffDone在我的此类的实例上调用该方法


我不了解的内容,可能是我的阅读方式,但是Passing下的第一句话说except language constructs such as: array(),但是这里我们要传递一个数组。这是错字还是我看错了句子?
Howdy_McGee

不,这是对的,但是它是指函数,而不是方法。阅读正下方的段落。
TheDeadMedic 2015年

5

ADD_ACTION()函数定义的格式如下:

 function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
     return add_filter($tag, $function_to_add, $priority, $accepted_args);
 }

所以根据它看起来像它期望的(string,string,int,int)

在传统的php文件中,第二个参数只是您的函数名称之一。

所以你会 add_action('admin_init','my_init_function')

看来您正在使用一个类来封装您的插件。其他类可能在其中具有相同名称的函数(getStuffDone)。

因此,仅在引用类时才知道您的函数,这就是为什么必须指定类$this以及函数名称的原因。

如果要在类中引用函数,则必须使用 数组可调用语法

另请参见codex.wordpress.org


1

请参阅“ 用户贡献的注释 ” 下的文档:

“要add_action() 在使用类构建插件或主题时使用,需要使用数组可调用语法。您需要将函数add_action()作为数组传递,并$this以第一个元素作为传递,然后传递类方法的名称...”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.