可从类访问的wp_head中的Add_action

时间:2019-06-12 作者:Chris J. Zähller

给定此代码:

class test_class {

    function greeting() {
        echo \'Howdy! Test is successful!\';
    }

    function greeting_head() {
      //Close PHP tags
    ?>
        <?php greeting() ?>
    <?php //Open PHP tags
    }
}

add_action( \'wp_head\', array( \'test_class\', \'greeting_head\' ) );
greeting() 未定义。如何从外部访问iftest_class?

更新:我最终使用了Sally J.的解决方案

之前的更新:我尝试了Adnane的解决方案,但没有成功,但它让我找到了正确的答案。

class test_class {

    public static function greeting() {
        return \'Howdy! Test is successful!\';
    }

    function greeting_head() {
        echo self::greeting();
    }
}

add_action( \'wp_head\', array( \'test_class\', \'greeting_head\' ) );
显然,我是在以非静态的方式调用静态函数。See this question.

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

在提供callable/callbackadd_action():

add_action( \'wp_head\', array( \'test_class\', \'greeting_head\' ) );
所以你应该greeting_head() 您的test_class 班但你还需要greeting() 静态方法:

class test_class {

    public static function greeting() {
        echo \'Howdy! Test is successful!\';
    }

    public static function greeting_head() {
        self::greeting();
    }
}
除非使用单例模式,否则需要使用self 关键字从静态方法访问方法和属性;例如,在上面的代码中,您可以看到我正在使用self::greeting() 而不是$this->greeting().

但我不建议使用静态类方法,除非绝对必要,而且您可以保持类的现状&mdash除外,使用$this->greeting()greeting_head() 方法;并在提供add_action() 回调:

class test_class {

    function greeting() {
        echo \'Howdy! Test is successful!\';
    }

    function greeting_head() {
        $this->greeting();
    }
}

$test_class = new test_class;

add_action( \'wp_head\', array( $test_class, \'greeting_head\' ) );
这个答案并没有涵盖PHP类的所有内容,但我希望它能帮助您;如果您需要进一步的指导,您可以在堆栈溢出上进行搜索,甚至可以在WordPress堆栈交换上进行搜索……)

更新完整性,

出现此错误是因为您试图访问名为的全局函数greeting 这显然不存在,因为PHP抛出了该错误:

greeting() 未定义。

如何从外部访问iftest_class?“&mdash;使用$this 关键词:$this->greeting(), 正如Adnane和我在最初的回答中提到的那样。或使用self::greeting() 正如我在最初的回答中所说的那样。

(Update)如果从外部test_class“&mdash;实际上,正确的问题应该是,“如何访问greeting() 方法,因为您实际上正在调用test_class::greeting() 从…起test_class::greeting_head(). :)

当前问题中的代码将导致以下PHP通知(请参见add_action() 以上注释)

非静态方法test\\u class::greeting\\u head()不应静态调用

此外,如果只使用$this 在您的原件中greeting_head():

未捕获错误:不在对象上下文中时使用$this

对于这个问题:

你能给我指一些关于使用静态类方法的利弊的文档吗?

SO网友:Adnane Zarrouk

1-内部class 您正在尝试调用函数greeting() 这不是电流的方法class 因此php将尝试在class 如果函数不存在,将显示致命错误消息。

要在类内调用此函数,需要将其作为方法调用:

$this->greeting();
2-在内部使用php标记不是一个好主意class

This is the right Way :

class test_class {

    function greeting() {
        return \'Howdy! Test is successful!\';
    }

    function greeting_head() {
        echo $this->greeting();
    }
}

add_action( \'wp_head\', array( \'test_class\', \'greeting_head\' ) );

相关推荐

重写规则不起作用:如果文件存在,则重定向到php脚本

我想用add_rewrite_rule 但没有成功。我想实现的是,如果URLwww.myhomepage.com/custom-media-files/2/screenshot_15_1.jpg 将用户重定向到位于www.myhomepage.com/screenshotaccess.php 其中,我检查用户是否具有打开文件的权限。编辑:所以我试着编辑htaccess文件,现在看起来像这样,但仍然不起作用。当文件直接存储在URL后面时,该规则似乎不适用。如果我转到没有文件的URL,则该规则有效。#BEGI