PHP-Fehler mit Shortcode-Handler aus einer Klasse
-
-
** offtopic ** -mache die Funktion `static`.**off topic** - make the function `static`.
- 0
- 2012-09-27
- kaiser
-
3 Antworten
- Stimmen
-
- 2012-08-10
Wie der Fehlerbesagt,benötigen Sieeine Instanz der Klasse,um
$this
zu verwenden. Esgibt mindestens drei Möglichkeiten:Machen Sie alles statisch
class My_Plugin { private static $var = 'foo'; static function foo() { return self::$var; // never echo or print in a shortcode! } } add_shortcode( 'baztag', array( 'My_Plugin', 'foo' ) );
Aber dasist keinechtes OOPmehr,nurnochein Namespace.
Erstein reales Objekterstellen
class My_Plugin { private $var = 'foo'; public function foo() { return $this->var; // never echo or print in a shortcode! } } $My_Plugin = new My_Plugin; add_shortcode( 'baztag', array( $My_Plugin, 'foo' ) );
Das…funktioniert. Sie stoßenjedoch aufeinige
As the error says you need an instance of the class to use
$this
. There are at least three possibilities:Make everything static
class My_Plugin { private static $var = 'foo'; static function foo() { return self::$var; // never echo or print in a shortcode! } } add_shortcode( 'baztag', array( 'My_Plugin', 'foo' ) );
But that’s not real OOP anymore, just namespacing.
Create a real object first
class My_Plugin { private $var = 'foo'; public function foo() { return $this->var; // never echo or print in a shortcode! } } $My_Plugin = new My_Plugin; add_shortcode( 'baztag', array( $My_Plugin, 'foo' ) );
This … works. But you run into some obscure problems if anyone wants to replace the shortcode.
So add a method to provide the class instance:
final class My_Plugin { private $var = 'foo'; public function __construct() { add_filter( 'get_my_plugin_instance', [ $this, 'get_instance' ] ); } public function get_instance() { return $this; // return the object } public function foo() { return $this->var; // never echo or print in a shortcode! } } add_shortcode( 'baztag', [ new My_Plugin, 'foo' ] );
Now, when someone wants to get the object instance, s/he just has to write:
$shortcode_handler = apply_filters( 'get_my_plugin_instance', NULL ); if ( is_a( $shortcode_handler, 'My_Plugin ' ) ) { // do something with that instance. }
Old solution: create the object in your class
class My_Plugin { private $var = 'foo'; protected static $instance = NULL; public static function get_instance() { // create an object NULL === self::$instance and self::$instance = new self; return self::$instance; // return the object } public function foo() { return $this->var; // never echo or print in a shortcode! } } add_shortcode( 'baztag', array( My_Plugin::get_instance(), 'foo' ) );
-
Danke Mann ... das sind unbezahlbare Informationen,da wordpress.org auf der Dokumentationsseitefür add_shortcodenicht so vielgesagt hat.Ich hatte die Lösung herausgefunden,aber da Sie dies als schlechte Praxis ausgeschlossen haben und Sieeine bessere Lösung haben,markiereich dieses Problem alsgelöst :)thanx man ... thats priceless info since wordpress.org did not tell this much on their add_shortcode documentation page. I had figured out the solution but since you have ruled that out as a bad practice and you have a better solution so i mark this problem as solved:)
- 0
- 2012-08-10
- xmaestro
-
Estutmir wirklich leid,diese alte Frage ausgraben zumüssen,aber können Siebitte nähererläutern,was diese Zeilebewirkt: `NULL===self :: $instance und self :: $instance=new self;`?Ichbin etwas verwirrt,weil "===" und "und" verwendet werden,aber ohne "wenn",wenn Sie wissen,wasichmeine.I am really sorry to dig up this old question, but could you plase elaborate what this line does: `NULL === self::$instance and self::$instance = new self;`? I am a bit confused because `===` and `and` are used, but without `if`, if you know what I mean.
- 0
- 2015-01-03
- Sven
-
@Sven Diesisteine Überprüfung,umeine zweite Instanz zu verhindern.Dasmacht diese Klasse zueinem Singleton ... das würdeich heutzutagenichttun.Ich werde diese Antwort umschreiben.@Sven This is a check to prevent a second instance. It makes this class a Singleton … I wouldn’t do that nowadays. I will rewrite this answer.
- 0
- 2015-01-03
- fuxia
-
Dank dafür!Ich denkejetztbin ich auf dem richtigen Weg,obwohleserstaunlichist,wie kompliziertes sein kann,WordPress & OOP zu verwenden ;-)Thanks for that! I think now I am on the right track, although it is astonishing how complicated it can be using WordPress & OOP ;-)
- 0
- 2015-01-03
- Sven
-
@Sven WordPress Coreist sogut wiemöglichgegen OOPgeschrieben.Selbstneuer Codeignoriert all die Dinge,die der Rest der PHP-Weltin den letzten zehn Jahrengelernt hat,beispielsweise die Abhängigkeitsinjektion.Alsoja,OOPin WordPress-Plugins und -Themenistimmer hackisch.:/@Sven WordPress core is written pretty much as anti-OOP as possible. Even new code ignores all the things the rest of the PHP world has learned during the last ten years, dependency injection for example. So yes, OOP in WordPress plugins and themes is always hackish. :/
- 2
- 2015-01-03
- fuxia
-
Das `add_shortcode` Gerätist von der dunklen Seite!Dieser Codeist ziemlich dumm.+1 auf die Tatsache,dass WordPress das $ # ANTIOOPportieren oder deportierenmuss;.Die Abschreibungerfordertin hohem Maße Migrationspläne.The `add_shortcode` device is from the dark side! This code is pretty dope. +1 on the fact that WordPress needs to port or deport the $#ANTIOOP;. Deprecation needs migration plans in a major way.
- 0
- 2016-02-17
- Nathan Powell
-
add_filter ('get_my_plugin_instance',[$this,'get_instance']); Wie würdeich Parameterbei 'get_instance' übergeben?Als 'get_instance [params]'?Vielen Dank.add_filter( 'get_my_plugin_instance', [ $this, 'get_instance' ] ); How would I pass params at 'get_instance'? As 'get_instance[params]'? Thanks.
- 0
- 2018-12-10
- b_dubb
-
@b_dubb Sie übergeben die Parameter an den Konstruktor.@b_dubb You pass the parameters to the constructor.
- 0
- 2018-12-10
- fuxia
-
@fuxia und das würde so aussehen ....?@fuxia and that would look like .... ?
- 0
- 2018-12-12
- b_dubb
-
@b_dubb Oh,warte,jetztbekommeich deine Frage.Sie übergeben dem überhaupt keine Parameter.@b_dubb Oh, wait, now I get your question. You don't pass parameters to that at all.
- 0
- 2018-12-12
- fuxia
-
`add_shortcode ('baztag',[neues My_Plugin ($params),'foo']);``add_shortcode( 'baztag', [ new My_Plugin($params), 'foo' ] );`
- 0
- 2018-12-28
- b_dubb
-
- 2015-06-25
Sie können soeinen Shortcodeinnerhalb der Klasse
verwendenclass stockData{ function __construct() { add_shortcode( 'your_shortcode_name', array( $this, 'showData' ) ); //add_action('login_enqueue_scripts', array( $this,'my_admin_head')); } function showData(){ return '<h1>My shortcode content</h1>' ; } } $object=new stockData();
Wenn Sie auf Shortcode-Inhalteeiner anderen Klasse zugreifenmöchten.Sie können diestun.
class my_PluginClass { public function __construct( $Object ) { $test = add_shortcode( 'your_shortcode_name', array( $Object, 'your_method_name' ) ); } } class CustomHandlerClass{ public function your_method_name( $atts, $content ) { return '<h1>My shortcode content</h1>' ; } } $Customobject = new CustomHandlerClass(); $Plugin = new my_PluginClass( $Customobject );
You can use like this, shortcode inside the Class
class stockData{ function __construct() { add_shortcode( 'your_shortcode_name', array( $this, 'showData' ) ); //add_action('login_enqueue_scripts', array( $this,'my_admin_head')); } function showData(){ return '<h1>My shortcode content</h1>' ; } } $object=new stockData();
If you want access shortcode content from another class. You can do like this.
class my_PluginClass { public function __construct( $Object ) { $test = add_shortcode( 'your_shortcode_name', array( $Object, 'your_method_name' ) ); } } class CustomHandlerClass{ public function your_method_name( $atts, $content ) { return '<h1>My shortcode content</h1>' ; } } $Customobject = new CustomHandlerClass(); $Plugin = new my_PluginClass( $Customobject );
-
Diese Lösunggefälltmir sehrgut.Esist wirklich sauber und verständlich.Die Entwicklerseite von React.js vonmirist damit zufrieden.I really like this solution. It's really clean and understandable. The React.js developer side of me is happy with this.
- 1
- 2017-04-13
- AaronDancer
-
- 2012-08-10
Stellen Sie sicher,dass Sieeine Instanz Ihrer Klasseerstellen,bevor Sie sie verwenden,es sei denn,Sie sind sicher,dass sie statisch aufgerufen werden soll.Wenn Sieeine Methode statisch aufrufen,verwenden Sie keine Instanzen und haben daher keinen Zugriff auf Mitgliedsvariablen oder -methoden.
Make sure that you make an instance of your class before using it unless you are sure it's supposed to be called statically. When you call a method statically, you don't use any instances and therefore it doesn't have access to any member variables or methods.
Derzeit verwendeich denfolgendengenerischen Ablauf zum Hinzufügen des Shortcodesfürein Plugin.
Wenn diese Klasse undihre Methode aufgerufen werden,wird derfolgende Fehler angezeigt:
(In Zeile Nr. habeich den
$this->myvar
gedruckt)Ist diesein Problembei Wordpress odergibt esetwas,dasichfalschmache?Es scheintetwas wirklich Einfaches zu sein.