Bir sınıftan kısa kod işleyicisiyle PHP hatası


13

Şu anda bir eklenti için kısa kod eklemek için aşağıdaki genel akışı kullanıyorum.

class MyPlugin {

    private $myvar;

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

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

Şimdi bu sınıf ve yöntemi çağrıldığında aşağıdaki hatayı alıyorum.

Önemli hata: $ this nesnesinde değilken $ kullanarak ...

(Satır no, yazdırdığım yer $this->myvar)

Bu Wordpress'in sonunda bir sorun mu var yoksa yanlış yaptığım bir şey var mı? Gerçekten basit bir şey gibi görünüyor.


konu dışı - işlevi yapın static.
kaiser

Yanıtlar:


31

Hata dediği gibi kullanmak için sınıfın bir örneğine ihtiyacınız var $this. En az üç olasılık vardır:

Her şeyi statik yapın

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

Ama bu artık gerçek OOP değil, sadece isim aralığı.

Önce gerçek bir nesne oluşturun

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

Bu çalışıyor. Ancak , herhangi biri kısa kodu değiştirmek isterse bazı belirsiz sorunlarla karşılaşırsınız .

Sınıf örneğini sağlamak için bir yöntem ekleyin:

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

Şimdi, birisi nesne örneğini almak istediğinde, şunu yazmak zorundadır:

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

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

Eski çözüm: Sınıfınızda nesne oluşturun

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 ... wordpress.org adresindeki add_shortcode dokümantasyon sayfasında bu kadarını söylemediğinden bu paha biçilmez bilgi. Çözümü anladım ama kötü bir uygulama olarak karar verdiğinizden ve daha iyi bir çözümünüz olduğundan bu sorunu çözüldü olarak işaretliyorum :)
xmaestro

Bu eski soruyu açtığım için gerçekten üzgünüm, ama bu satırın ne yaptığını ayrıntılı bir şekilde anlatabilir misiniz NULL === self::$instance and self::$instance = new self;? Biraz nedeniyle karışık duyuyorum ===ve andolmadan kullanılır, ancak ifne demek istediğimi biliyorum.
Sven

@Sven Bu, ikinci bir örneği önlemek için yapılan bir kontroldür. Bu sınıfı Singleton yapıyor… Bugünlerde bunu yapmam. Bu cevabı yeniden yazacağım.
fuxia

Bunun için teşekkürler! Sanırım şimdi doğru yolda olduğumu düşünüyorum, ancak WordPress & OOP ;-) kullanmak ne kadar karmaşık olabiliyorsa da
Sven

2
@ WordPress çekirdeği mümkün olduğunca anti-OOP olarak yazılmıştır. Yeni kod bile, PHP dünyasının geri kalanının son on yıl boyunca öğrendiği her şeyi, örneğin bağımlılık enjeksiyonunu yok sayar. Yani evet, WordPress eklentileri ve temalarındaki OOP her zaman hacklidir. : /
fuxia

7

Sınıf içinde bu şekilde, kısa kod kullanabilirsiniz

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

Başka bir sınıftan kısa kod içeriğine erişmek istiyorsanız. Bunu yapabilirsin.

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
Bu çözümü gerçekten çok seviyorum. Gerçekten temiz ve anlaşılır. React.js geliştirici tarafı bundan memnun.
AaronDancer

1

Statik olarak adlandırılması gerekmediği sürece, kullanmadan önce sınıfınızın bir örneğini oluşturduğunuzdan emin olun. Bir yöntemi statik olarak çağırdığınızda hiçbir örnek kullanmazsınız ve bu nedenle herhangi bir üye değişkene veya yönteme erişimi yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.