是否有插件生命周期文档?

时间:2012-07-24 作者:RitonLaJoie

是否有一些文档可以解释插件的生命周期?

我正在启动一个OOP风格的新插件,我刚刚发现我的主类正在实例化a lot (感谢Xdebug和Netbeans)<我想知道为什么,这让我很恼火,因为我正在实例化Dropbox API对象,我真的没想到WordPress会这么多地实例化我的主类。

我在Codex和Google上都没有找到任何与插件生命周期相关的东西。

2 个回复
SO网友:Ralf912

我正在启动一个OOP风格的新插件

“OOP风格”对你意味着什么?用class语句包装所有函数?那你就做错了。您将该类错误地用作命名空间。

我刚刚发现我的主课经常被引用

嗯?

class Foo
{
  public function __construct() {
    // assuming your wp-content dir is writeable
    $filename = sprintf( WP_CONTENT_DIR . \'/dummyfile-%d.txt\', time() );
    $handle = fopen( $filename, \'w\' );
    if ( $handle ) {
      fputs( $handle, \'-\' );
      fclose( $handle );
    }
  }
}

add_action( \'plugins_loaded\', function() { new Foo(); } );
尝试一下,然后计算创建的文件数。如果我尝试一下one 为每个页面请求创建的文件。这意味着,只有一个instance 每个页面请求的Foo类的。

让我们试试行动电话

class Foo
{
    public function __construct() {

        $this->write_file( \'in_constructor\' );
        add_action( \'init\', array( $this, \'action_test\' ), 10, 0 );

    }

    public function action_test() {

        $this->write_file( \'in_method_with_action_call\' );

    }

    public function write_file( $filename ) {

      // assuming your wp-content dir is writeable
      $counter = 1;
      $fname = sprintf( WP_CONTENT_DIR . \'/%s-%d.txt\', $filename, $counter );

      if ( file_exists( $fname ) ) {
        preg_match( \'/(\\d)\\.txt/is\', $fname, $match );
          if ( isset( $match[1] ) ) {
              $counter = (int) $match[1] + 1;
              $fname = sprintf( WP_CONTENT_DIR . \'/%s-%d.txt\', $filename, $counter );
          }
      }

      $handle = fopen( $fname, \'a+\' );
      if ( $handle ) {
          fputs( $handle, \'-\' );
          fclose( $handle );
      } else {
          throw new Exception( "Cannot open file {$fname} for writing" );
      }

    }
}

add_action( \'plugins_loaded\', function() { new Foo(); } );
如果我查看我的wp-content-dir,我会发现两个文件。没有了。创建类实例时会创建一个文件。一个是在动作调用完成时创建的。

好吧,让我们用我们的实例做一些愚蠢的事情。删除add_action( \'plugins_loaded\', .. ) 并添加以下代码:

function bar( $foo ) {

    $baz = $foo;
    return $baz;
}

$f = new Foo();
$GLOBALS[\'foo\'] = $f;

$f2 = $f;
$f3 = &$f;

$f4 = bar( $f2 );
$f5 = bar( $f3 );
您希望有多少文件?我希望有两个。一个来自构造函数,一个来自方法。

仅当new 使用运算符。

add_action( \'plugins_loaded\', \'new_foo\', 10, 0 );

function new_foo() {
    // first instance
    new Foo();
}

function bar( $foo ) {
    $baz = $foo;
    return $baz;
}

// second instance here!!
$f = new Foo();
$GLOBALS[\'foo\'] = $f;

$f2 = $f;
$f3 = &$f;

$f4 = bar( $f2 );
$f5 = bar( $f3 );
现在我数了四个文件。两个来自构造函数,两个来自方法。这是因为WordPress首先包含插件,然后执行动作挂钩plugins_loaded.

最佳做法是使用动作钩plugins_loaded 而不是从函数中创建实例,因为如果插件文件包含在任何位置(例如插件的另一个文件中),则每次包含该文件时都会创建该类的新实例。行动挂钩plugins_loaded 对于每个页面请求仅执行一次。

SO网友:Arevico

可能发生的情况是将类的副本传递给过滤器或操作。例如,如果要直接修改钩子或过滤器内的类变量,还应通过引用传递钩子

add_action("some_action",array(&$this,"somefunction"))
而不是

add_action("some_action",array($this,"somefunction"))
正如bainternet所提到的,您还可以使用单例模式来确保特定对象只实例化一次(进一步调用将返回对该对象的引用)。

您还可以考虑将某些函数设置为静态(通过给它们指定static关键字。这通常是对与类的其余部分不交互的类似于“helper”的函数执行的。可以调用静态方法,而无需实例化类。

您还可以将静态函数传递给操作/筛选器:

add_action("some_action",array("ClassName","Method"))
我也检查过了http://codex.wordpress.org/Plugin_API/Action_Reference 并发现插件只能在请求的两个阶段加载(muplugins\\u-loaded和plugins\\u-loaded)。

结束

相关推荐

WordPress Codex的本地副本?

有时我想在没有网络连接的情况下开发WordPress主题。我需要Function Reference 和Template Tags 要有生产力。我搜索了一份可下载或SVN版本的Codex 但找不到。最后我试着用镜子把它照出来wget, 但结果参差不齐(太大了!)。有更好的办法吗?