플러그인의 수명주기를 설명하는 문서가 있습니까?
나는 OOP 스타일로 새로운 플러그인을 시작하고 있으며 방금 메인 클래스가 많은 것으로 밝혀졌습니다 (Xdebug와 Netbeans 덕분에).
Dropbox-API 객체를 설명하고 있기 때문에 왜 그런지 궁금합니다. WordPress가 내 주요 클래스를 그렇게 많이 생각하지는 않습니다.
Codex 또는 Google의 플러그인 수명주기와 관련된 것을 찾지 못했습니다.
플러그인의 수명주기를 설명하는 문서가 있습니까?
나는 OOP 스타일로 새로운 플러그인을 시작하고 있으며 방금 메인 클래스가 많은 것으로 밝혀졌습니다 (Xdebug와 Netbeans 덕분에).
Dropbox-API 객체를 설명하고 있기 때문에 왜 그런지 궁금합니다. WordPress가 내 주요 클래스를 그렇게 많이 생각하지는 않습니다.
Codex 또는 Google의 플러그인 수명주기와 관련된 것을 찾지 못했습니다.
답변:
OOP 스타일로 새 플러그인을 시작하고 있습니다
'OOP 스타일'은 무엇을 의미합니까? 모든 기능을 클래스 문으로 감쌀까요? 그렇다면 당신은 잘못하고 있습니다. 클래스를 네임 스페이스로 잘못 사용합니다.
저는 방금 저의 메인 클래스가 많이 참여하고 있음을 알게되었습니다
응?
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(); } );
사용 해보고 생성 된 파일 수를 계산하십시오. 시도해 보면 각 페이지 요청마다 하나의 파일이 생성됩니다. 즉, 각 페이지 요청에 대해 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 );
이제 네 개의 파일을 세었습니다. 생성자에서 2 개, 메소드에서 2 개 WordPress에 먼저 플러그인이 포함 된 후 작업 후크가 수행되기 때문 plugins_loaded
입니다.
plugins_loaded
플러그인 파일이 임의의 위치 (예 : 플러그인의 다른 파일)에 포함되면 파일이 포함될 때마다 클래스의 새 인스턴스가 작성되므로 함수에서 인스턴스를 작성하는 대신 조치 후크를 사용하는 것이 가장 좋습니다. 작업 후크 plugins_loaded
는 모든 페이지 요청에 대해 한 번만 수행됩니다.
일어날 수있는 일은 클래스의 사본을 필터 또는 조치에 전달하는 것입니다. 예를 들어 후크 또는 필터 내에서 클래스 변수를 직접 수정하려면 참조로 후크를 전달해야합니다.
add_action("some_action",array(&$this,"somefunction"))
대신에
add_action("some_action",array($this,"somefunction"))
bainternet에서 언급했듯이 단일 객체 패턴을 사용하여 특정 객체가 한 번만 표시되도록 할 수 있습니다 (추가 호출은 해당 객체에 대한 참조를 반환합니다).
정적 키워드를 지정하여 일부 함수를 정적으로 만드는 것도 고려할 수 있습니다. 이는 일반적으로 나머지 클래스와 상호 작용하지 않는 '도우미'와 같은 함수에 수행됩니다. 정적 메소드는 클래스를 지정하지 않고 호출 할 수 있습니다.
정적 함수를 액션 / 필터에 전달할 수도 있습니다.
add_action("some_action",array("ClassName","Method"))
또한 http://codex.wordpress.org/Plugin_API/Action_Reference 를 확인 하고 요청에서 플러그인을 두 단계 (muplugins_loaded 및 plugins_loaded)로만로드 할 수 있음을 발견했습니다.