我正在启动一个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
对于每个页面请求仅执行一次。