是否有一些文档可以解释插件的生命周期?
我正在启动一个OOP风格的新插件,我刚刚发现我的主类正在实例化a lot (感谢Xdebug和Netbeans)<我想知道为什么,这让我很恼火,因为我正在实例化Dropbox API对象,我真的没想到WordPress会这么多地实例化我的主类。
我在Codex和Google上都没有找到任何与插件生命周期相关的东西。
是否有一些文档可以解释插件的生命周期?
我正在启动一个OOP风格的新插件,我刚刚发现我的主类正在实例化a lot (感谢Xdebug和Netbeans)<我想知道为什么,这让我很恼火,因为我正在实例化Dropbox API对象,我真的没想到WordPress会这么多地实例化我的主类。
我在Codex和Google上都没有找到任何与插件生命周期相关的东西。
我正在启动一个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
对于每个页面请求仅执行一次。
可能发生的情况是将类的副本传递给过滤器或操作。例如,如果要直接修改钩子或过滤器内的类变量,还应通过引用传递钩子
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主题。我需要Function Reference 和Template Tags 要有生产力。我搜索了一份可下载或SVN版本的Codex 但找不到。最后我试着用镜子把它照出来wget, 但结果参差不齐(太大了!)。有更好的办法吗?