В настоящее время я делаю плагин класса для системы, подобной посту.
Тем не менее, я хотел бы сделать своего рода оболочку класса, чтобы использовать ее в качестве простой функции. Но мне нужно зарегистрировать в моем классе некоторые сценарии и константы, а затем запустить класс.
С текущей оберткой я заставил ее повторно выполнить функцию _contruct класса. Я хочу инициализировать класс, тогда, когда я вызову крошечную оболочку, он не будет выполнять экземпляр contrucct и получит только правильную функцию класса.
Как я могу сделать это? Имеет ли это смысл?
Вот мой пример кода:
if(!class_exists('Post_Like')) {
class Post_Like {
static private $instance = null;
static public function getInstance() {
if(self::$instance == null) {
self::$instance = new self;
}
return self::$instance;
}
public function __construct() {
$this->define_constants();
// Load public/admin CSS and JS.
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts'));
// register actions for ajax
add_action( 'wp_ajax_nopriv_post_like', array($this, 'post_like') );
add_action( 'wp_ajax_post_like', array($this, 'post_like') );
}
public function define_constants() {
define('POST_LIKE_PATH', trailingslashit(str_replace('\\', '/', dirname(__FILE__))));
define('POST_LIKE_URL', site_url(str_replace(trailingslashit(str_replace('\\', '/',ABSPATH)), '', POST_LIKE_PATH)));
}
public function enqueue_scripts() {
// enqueue js scripts
}
public function post_like() {
// do some stuff
}
public function post_already_like() {
// do some stuff
}
// I want to wrap this function to use it anywhere easily
public function get_post_like() {
// do some stuff
}
}
}
new Post_Like();
if(!function_exists('Post_Like')) {
/**
* Tiny wrapper function
*/
function get_post_like() {
$Post_Like = Post_Like::getInstance();
return $Post_Like->get_post_like(); // it execute _contruct, I want to avoid that
}
}
По телефону new Post_Like();
вы создаете экземпляр класса, выполняя конструктор.
Если вы хотите избежать этого, и, поскольку вы определили это как одиночный, вы можете сделать этот конструктор приватным.
Попробуйте следующее:
if(!class_exists('Post_Like')) {
class Post_Like {
static private $instance = null;
static public function getInstance() {
if(self::$instance == null) {
self::$instance = new self;
}
return self::$instance;
}
private function __construct() {
$this->define_constants();
// Load public/admin CSS and JS.
add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts'));
// register actions for ajax
add_action( 'wp_ajax_nopriv_post_like', array($this, 'post_like') );
add_action( 'wp_ajax_post_like', array($this, 'post_like') );
}
public function define_constants() {
define('POST_LIKE_PATH', trailingslashit(str_replace('\\', '/', dirname(__FILE__))));
define('POST_LIKE_URL', site_url(str_replace(trailingslashit(str_replace('\\', '/',ABSPATH)), '', POST_LIKE_PATH)));
}
public function enqueue_scripts() {
// enqueue js scripts
}
public function post_like() {
// do some stuff
}
public function post_already_like() {
// do some stuff
}
// I want to wrap this function to use it anywhere easily
public function get_post_like() {
// do some stuff
}
}
}
// new Post_Like(); <-- unnecessary
// you need to check for a function called 'get_post_like' rather than the class name
if(!function_exists('get_post_like')) {
function get_post_like() {
return Post_Like::getInstance()->get_post_like();
}
}
Других решений пока нет …