web-dev-qa-db-fra.com

Attacher une fonction privée à un crochet?

J'ai une classe avec des fonctions privées et publiques. Le fait est que je ne veux pas que certaines des fonctions puissent être appelées hors site de la classe, alors je veux les rendre privées. Mais je dois les accrocher à des crochets particuliers et les crochets ne peuvent pas les appeler s'ils sont privés. Y at-il une solution de contournement pour cela?

2
barakuda28

Non c'est impossible. Lorsque WordPress appelle une méthode, celle-ci doit être publique. Vous pouvez écrire une méthode publique appelée au crochet qui appelle une méthode privée à l'intérieur.
Je ne sais pas si cela a du sens…

4
fuxia

Voici un exemple;

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;
    }

}

Dans cet exemple, je filtre the_content en transmettant une fonction privée qui tire sa valeur d'une variable privée. Maintenant, comme vous ne pouvez pas appeler cela directement, mon get_this_function est ce qui va retourner ce qui est privé et c'est ce que je passe dans mon constructeur qui ajoute le filtre approprié sur template_redirect.

Vous n'avez pas besoin d'utiliser des méthodes statiques, certains recommandent de ne pas le faire, mais faites comme bon vous semble.

1
userabuser

Généralement, hook effectue en dehors d'une classe. Il a été appelé dans une classe ou une méthode de classe. Donc, vous ne pouvez pas l'utiliser dans un crochet. Si vous le faites avec force, vous devrez d'abord instancier dans une méthode publique, puis utilisez la méthode publique dans n'importe quel hook. Exemple:

<?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();
}
?>
0
Pirate of KGP