Như lỗi nói rằng bạn cần một thể hiện của lớp để sử dụng $this
. Có ít nhất ba khả năng:
Làm cho mọi thứ tĩnh
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' ) );
Nhưng đó không phải là OOP thực sự nữa, chỉ là không gian tên.
Tạo một đối tượng thực sự đầu tiên
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' ) );
Những công việc này. Nhưng bạn gặp phải một số vấn đề mơ hồ nếu có ai muốn thay thế shortcode.
Vì vậy, thêm một phương thức để cung cấp thể hiện của lớp:
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' ] );
Bây giờ, khi ai đó muốn lấy đối tượng, họ chỉ cần viết:
$shortcode_handler = apply_filters( 'get_my_plugin_instance', NULL );
if ( is_a( $shortcode_handler, 'My_Plugin ' ) )
{
// do something with that instance.
}
Giải pháp cũ: tạo đối tượng trong lớp của bạn
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' ) );
static
.