2015-08-14 2 views
0

В настоящее время я создаю плагин класса для почтовой системы.php class - Создайте крошечную обертку

Однако я хотел бы сделать своего рода классную оболочку, чтобы использовать ее как простую функцию. Но мне нужно зарегистрировать в своем классе некоторые скрипты и константу, а затем запустить класс.

С помощью текущей оболочки я запустил функцию _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 
    } 

} 

ответ

0

Позвонив new Post_Like(); вы создаете экземпляр класса, выполняя конструктор.

Если вы хотите этого избежать, и поскольку вы определили это как одноэлементный, вы можете сделать contructor private.

Попробуйте следующее:

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

} 
+0

Спасибо за ваш ответ. Однако без запуска класса new Post_Like(); он не может работать. Сценарии не регистрируются, потому что фильтр вызывается до того, как запускается сообщение get. Но если я сохраню строку, она работает, но у меня все еще есть двойное или несколько объявлений конструктора. Так что это не решило мою проблему. Я сделал класс extends, чтобы он наконец-то работал. – freaky

Смежные вопросы