एक वर्ग से शोर्ट हैंडलर के साथ PHP त्रुटि


13

वर्तमान में मैं एक प्लगइन के लिए शोर्ट जोड़ने के लिए निम्नलिखित सामान्य प्रवाह का उपयोग कर रहा हूं।

class MyPlugin {

    private $myvar;

    function baztag_func() {
        print $this->myvar;            
    }
}

add_shortcode( 'baztag', array('MyPlugin', 'baztag_func') );

अब जब यह वर्ग और इसे विधि कहा जाता है, तो मुझे निम्नलिखित त्रुटि मिलती है।

घातक त्रुटि: $ का उपयोग करना जब वस्तु संदर्भ में नहीं ...

(पंक्ति संख्या वह जगह है जहाँ मैंने मुद्रित किया है $this->myvar)

क्या यह Wordpress के अंत में एक समस्या है या कुछ गलत है? यह वास्तव में कुछ सरल लग रहा है।


बंद विषय - समारोह बनाओ static
कैसर

जवाबों:


31

जैसा कि त्रुटि कहती है कि आपको उपयोग करने के लिए कक्षा के एक उदाहरण की आवश्यकता है $this। कम से कम तीन संभावनाएँ हैं:

सब कुछ स्थिर कर दो

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' ) );

लेकिन यह वास्तविक ओओपी नहीं है, बस नामकरण है।

पहले एक वास्तविक वस्तु बनाएं

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' ) );

यह काम। लेकिन आप कुछ अस्पष्ट समस्याओं में भाग लेते हैं यदि कोई शोर्ट को बदलना चाहता है।

इसलिए वर्ग उदाहरण प्रदान करने के लिए एक विधि जोड़ें:

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' ] );

अब, जब कोई वस्तु प्राप्त करना चाहता है, तो उसे लिखना होगा:

$shortcode_handler = apply_filters( 'get_my_plugin_instance', NULL );

if ( is_a( $shortcode_handler, 'My_Plugin ' ) )
{
    // do something with that instance.
}

पुराना समाधान: अपनी कक्षा में वस्तु बनाएं

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' ) );

thanx man ... thats अनमोल जानकारी के बाद से wordpress.org ने उनके add_shortcode प्रलेखन पृष्ठ पर यह बहुत कुछ नहीं बताया। मैंने इसका हल निकाल लिया था, लेकिन जब से आपने फैसला किया है कि एक बुरा अभ्यास है और आपके पास एक बेहतर समाधान है, तो मैं इस समस्या को हल के रूप में चिह्नित करता
हूं

मैं वास्तव में इस पुराने प्रश्न को खो देने के लिए माफी चाहता हूं, लेकिन क्या आप इस बात की विस्तृत व्याख्या कर सकते हैं कि यह रेखा क्या करती है NULL === self::$instance and self::$instance = new self;:? मैं थोड़ा उलझन में हूँ क्योंकि ===और andउपयोग किया जाता है, लेकिन बिना if, अगर आप जानते हैं कि मेरा क्या मतलब है।
स्वेन

@ Sven यह दूसरी आवृत्ति को रोकने के लिए जाँच है। यह इस वर्ग को सिंगलटन बनाता है ... मैं आजकल ऐसा नहीं करूंगा। मैं इस उत्तर को फिर से लिखूंगा।
FUXIA

उसके लिए धन्यवाद! मुझे लगता है कि अब मैं सही रास्ते पर हूं, हालांकि यह आश्चर्यजनक है कि यह वर्डप्रेस और ओओपी का उपयोग कैसे जटिल हो सकता है; ;-)
स्वेन

2
@ सीन वर्डप्रेस कोर को यथासंभव ओओपी विरोधी लिखा जाता है। यहां तक ​​कि नया कोड उन सभी चीजों को नजरअंदाज करता है जो पिछले दस वर्षों के दौरान पीएचपी दुनिया के बाकी हिस्सों ने सीखे हैं, उदाहरण के लिए निर्भरता इंजेक्शन। तो हाँ, WordPress plugins और themes में OOP हमेशा hackish होता है। : /
FUXIA

7

आप इस तरह का उपयोग कर सकते हैं, कक्षा के अंदर शोर्ट

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();

यदि आप एक अन्य वर्ग से शोर्ट सामग्री का उपयोग करना चाहते हैं। आप ऐसा कर सकते हैं।

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

1
मुझे वास्तव में यह समाधान पसंद है। यह वास्तव में साफ और समझ में आता है। मेरे लिए React.js डेवलपर पक्ष इससे खुश है।
एरोनडैंसर

1

सुनिश्चित करें कि आप इसे उपयोग करने से पहले अपनी कक्षा का एक उदाहरण बनाते हैं जब तक कि आप सुनिश्चित न हों कि इसे सांख्यिकीय रूप से कहा जाना चाहिए। जब आप किसी विधि को सांख्यिकीय रूप से कहते हैं, तो आप किसी भी उदाहरण का उपयोग नहीं करते हैं और इसलिए इसका किसी भी सदस्य चर या विधियों तक पहुँच नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.