2017-03-29 9 views
0

Ich mag würde zu, wenn eine Klasse instanziieren einen Namen zu übergeben können, die für voran einen Methodennamen in dieser Klasse verwendet werden soll, habe ich bisher in diesemDynamischer Methodenname innerhalb einer Klasse?

<?php 
if (! class_exists('My_Class')) { 
    /** 
    * Creates filter method 
    * 
    * @since 1.0.0 
    */ 
    class My_Class { 

     /** 
     * Prefix for method names 
     * 
     * @var string $name Name of the filter prefix. 
     */ 
     private $name; 

     /** 
     * Version. 
     * 
     * @var string 
     */ 
     private $version = '1.0.0'; 

     /** 
     * Initialize the class and set its properties. 
     * 
     * @since 1.0.0 
     * @param string $name The name for the method prefix. 
     * @param string $version The version of this plugin. 
     */ 
     public function __construct($name, $version) { 
      $this->name = $name; 
      $this->version = $version; 
      add_filter('my_filter_name', $name . '_my_folder'); 
     } 

     /** 
     * Function for filtering folder array 
     * 
     * Each plugin has to set its own array of paths and url. 
     * 
     * @param array $import_array Array with folder values. 
     * @return array    Modified array with folder values. 
     */ 
     public function $name . _my_folder() { 
      $import_array[$this->name]['folder']  = plugin_dir_path(__FILE__) . 'includes/layout'; 
      $import_array[$this->name]['folder_url'] = plugin_dir_url(__FILE__) . 'includes/layout'; 
      return $import_array; 
     } 

    } 
} 

Die Idee ist, dass ich würde es nur nennen wie

$first_object = new My_Class('first'); 
$second_object = new My_Class('second'); 

Dies ist so, dass ich das in mehreren gleichen Plugins verwenden kann, mit unterschiedlichen Namen, je nach Art des Plugins.

Das offensichtliche Problem ist function $name . _my_folder().

Ich lese etwas über __call() magische Methode, aber ich bin mir nicht sicher, ob dies in diesem Fall verwendet werden kann, oder wie man es anwendet.

Kann dies getan werden?

+0

Warum brauchen Sie das? Es ist absolut eine schlechte Idee, es so zu benutzen. Es scheint wie ein schlechtes OOP-Design. Bitte beschreiben Sie Ihren Anwendungsfall dafür. –

+0

In WordPress können Sie Filter verwenden, um die Funktionsweise einer Funktion zu ändern, wenn sie die Funktion "apply_filters" enthält. Ich muss in der Lage sein, an vorhandene Array, Array mit allen Plugin-URLs (gleich aussehende Plugins, mit verschiedenen Import-Dateien) anzuhängen. Dafür kann ich manuell Funktionen schreiben und sie zum Filter hinzufügen, was eine langwierige und langwierige Aufgabe ist, wenn es viele solcher Plugins gibt, also ist meine Idee, nur ein Objekt zu erstellen, das dies für mich tun wird, da nur der Präfix-Name der Funktion verwendet für Filterwechsel (und Array-Schlüssel) –

Antwort

1

Warum machen Sie nicht Name Parameter der Methode?

So:

add_filter('my_filter_name', [$this, 'methodName'], 10, 1); 

dritte Parameter Priorität des Filters und der vierte ist die Anzahl der akzeptierten args.

public function methodName($name) {} 

und es so nennen:

apply_filters('my_filter_name', $value, $arg); 
+0

Ich werde sehen, ob dies funktioniert. In der Theorie sollte es, ich habe das schon mal gemacht, weiß nicht warum ich das überhaupt nicht benutzt habe. Danke –

+0

Andernfalls können Sie Magic '__call ($ name, $ args)' Methode aber Parameter ist eine bessere Lösung. –

+0

Mit einigen Modifikationen funktioniert das, aber der 'plugin_dir_path (__FILE__)' zeigt immer auf eines der 2 Plugins. Es registriert zwei Plugins, und das Array ist mit 2 Arrays gefüllt, was großartig ist (der Name wird im Array korrekt übergeben), aber der Pfad ist in beiden Fällen der gleiche ... –

-1

Ich bin kein Experte, aber ich denke, dass Sie die Standardversion im Konstruktor festlegen müssen ... Ich bin mir nicht sicher, aber Sie können es versuchen.

public function __construct($name, $version="1.0.0") { 
     $this->name = $name; 
     $this->version = $version; 
     add_filter('my_filter_name', $name . '_my_folder'); 
    } 
+0

Das hat wirklich nichts mit der Frage zu tun, und es ist nicht notwendig, zu tun ... –

Verwandte Themen