是否在挂钩上附加私有函数?

时间:2012-10-02 作者:barakuda28

我有一节课,有一些私人&;公共职能。问题是,我不希望某些函数能够在类的外部调用,所以我希望将它们设置为私有的。但是我需要在特定的钩子上钩住它们,如果它们是私有的,钩子就不能调用它们。是否有一些解决方法?

4 个回复
SO网友:fuxia

不,那是不可能的。当WordPress调用一个方法时,它必须是公共的。您可以编写一个在钩子上调用的公共方法,钩子在内部调用私有方法<不过我不确定这是否有意义…

SO网友:Adam

这里有一个例子;

add_action( \'template_redirect\', array( \'someClass\', \'init\' ));

class someClass {

    protected static $content = \'oh yeah, private!\';    

    public static function init() {
        $class = __CLASS__;
        new $class;
    }

    private function __construct() {
        add_filter(\'the_content\', array(&$this, \'get_this_function\'));
    }

    public static function get_this_function(){
         return self::my_funk_she_on();
    }

    private static function my_funk_she_on(){
        return self::$content;
    }

}
在此示例中,我正在筛选the_content 通过传递从私有变量获取其值的私有函数。既然你不能直接把这叫做我的get_this_function 是将返回私有内容的内容,这是我传递给构造函数的内容,该构造函数在template_redirect.

顺便说一下,您不需要使用静态方法,有些人建议不要使用静态方法,但请随意使用。

SO网友:Pirate of KGP

通常,钩子在类之外执行。它已在类或类方法内调用。所以你不能把它用在钩子里。如果强制执行,则必须首先在公共方法内实例化,然后将公共方法用于任何挂钩。示例:

<?php
class tlSmAdminMenu{
    public function __construct(){
        add_action(\'admin_menu\', array( $this, \'add_menu_page\'));
    }
    public function add_menu_page(){
        add_menu_page(\'Themelines Plugin\', \'TL Social Monster\', \'manage_options\', \'tl_social_monster\', array( $this, \'admin_menu_cb\'), \'
dashicons-networking\', 110);
    }
    public function admin_menu_cb(){
        $this->doStaff();
    }
    private function doStaff(){
        echo "<center><h1>THEMELINES SOCIAL MONSTER</h1></center>";
    }
}
if(class_exists(\'tlSmAdminMenu\')){
    $tl_sm_obj= new tlSmAdminMenu();
}
?>

SO网友:Alexander K.

对于PHP 5.4或更高版本,可以使用闭包和bindTo() 方法:

$cb = function(){
  $this->callPrivateMethod();
};

$cb->bindTo($this);

add_action(\'init\', $cb);
上述代码在类的范围内执行,因此$this 是有效值。

结束

相关推荐

如何在Functions.php中使用PHP手动修复WordPress库代码?

Wordpress为内置的gallery功能输出了一些非常糟糕的代码,这已经被谈论了很多次了。这是负责库输出的核心代码(在/wp-includes/media.php中):function gallery_shortcode($attr) { global $post; static $instance = 0; $instance++; // Allow plugins/themes to override the de