Errore PHP con gestore di shortcode da una classe
-
-
**fuoritema ** - rendi lafunzione `statica`.**off topic** - make the function `static`.
- 0
- 2012-09-27
- kaiser
-
3 risposta
- voti
-
- 2012-08-10
Come dice l'errore,ènecessaria un'istanza della classeper utilizzare
$this
. Ci sono almenotrepossibilità:Renditutto statico
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' ) );
Ma questonon èpiù un vero OOP,solo uno spazio deinomi.
Creaprima un oggetto reale
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' ) );
Questo ...funziona. Mati imbattiin alcuni problemi oscuri se qualcuno vuole sostituire lo shortcode.
Quindi aggiungi unmetodoperfornire l'istanza della classe:
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' ] );
Ora,quando qualcuno vuole ottenere l'istanza dell'oggetto,deve solo scrivere:
$shortcode_handler = apply_filters( 'get_my_plugin_instance', NULL ); if ( is_a( $shortcode_handler, 'My_Plugin ' ) ) { // do something with that instance. }
Vecchia soluzione: crea l'oggettonellatua classe
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' ) );
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' ) );
-
grazie uomo ... questa è un'informazioneinestimabilepoiché wordpress.orgnon ha dettomolto sulla loropagina di documentazione add_shortcode.Avevotrovato la soluzionema dalmomento che l'haiesclusa come una cattivapraticae hai una soluzionemigliore,contrassegno questoproblema come risolto :)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
-
Mi dispiace davvero scavare questa vecchia domanda,mapotrestiperfavoreelaborare ciò chefa questa riga: `NULL===self :: $instance and self :: $instance=new self;`?Sono unpo 'confusoperché vengono usati "==="e "and",ma senza "if",se capisci cosaintendo.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 Questo è un controlloperprevenire una secondaistanza.Rende questa classe un Singleton ...non lofarei algiorno d'oggi.Riscriverò questa risposta.@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
-
Grazieper quello!Penso diessere sulla stradagiusta,anche se è sorprendente quantopossaessere complicato usare WordPress & OOP ;-)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 core è scrittopiù omeno come anti-OOPpossibile.Ancheilnuovo codiceignoratutte le cose cheil resto delmondo PHP haimparatonegli ultimi dieci anni,adesempio l'iniezione di dipendenze.Quindi sì,l'OOPnei plugine neitemi di WordPress è sempre hacker.:/@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
-
Il dispositivo `add_shortcode`proviene dal lato oscuro!Questo codice èpiuttosto stimolante.+1 sulfatto che WordPress deveportare o deportare $ # ANTIOOP ;.Il ritironecessita dipiani dimigrazionein modo sostanziale.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']); Comepotreipassarei parametri a "get_instance"?Come "get_instance [params]"?Grazie.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 Passii parametri al costruttore.@b_dubb You pass the parameters to the constructor.
- 0
- 2018-12-10
- fuxia
-
@fuxiae che sembrerebbe ....?@fuxia and that would look like .... ?
- 0
- 2018-12-12
- b_dubb
-
@b_dubb Oh,aspetta,ora ho latua domanda.Non sipassano affattoparametri a quello.@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',[new My_Plugin ($params),'foo']);``add_shortcode( 'baztag', [ new My_Plugin($params), 'foo' ] );`
- 0
- 2018-12-28
- b_dubb
-
- 2015-06-25
Puoi usarein questomodo,shortcode all'interno della classe
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();
Se desideri accedere al contenuto dello shortcode di un'altra classe.Puoifare così.
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 );
-
Mipiacemolto questa soluzione.È davveropulitoe comprensibile.Ilmio lato sviluppatore di React.js è contento di questo.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
Assicurati di creare un'istanza dellatua classeprima di usarla,ameno chetunon sia sicuro che debbaessere chiamata staticamente.Quando chiami unmetodoin modo statico,non usi alcunaistanzae quindinon ha accesso anessuna variabile ometodomembro.
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.
Attualmente sto utilizzandoil seguenteflussogenericoper aggiungere lo shortcodeper unplugin.
Ora,quando questa classee il suometodo vengono chiamati,ottengoil seguenteerrore.
(La rigano è dove ho stampato
$this->myvar
)È unproblema daparte di Wordpress o c'è qualcosa che sto sbagliando?Sembraessere qualcosa di veramente semplice.