플러그인 수명주기 설명서가 있습니까?


11

플러그인의 수명주기를 설명하는 문서가 있습니까?

나는 OOP 스타일로 새로운 플러그인을 시작하고 있으며 방금 메인 클래스가 많은 것으로 밝혀졌습니다 (Xdebug와 Netbeans 덕분에).
Dropbox-API 객체를 설명하고 있기 때문에 왜 그런지 궁금합니다. WordPress가 내 주요 클래스를 그렇게 많이 생각하지는 않습니다.

Codex 또는 Google의 플러그인 수명주기와 관련된 것을 찾지 못했습니다.


그리고 여기에서 검색 했습니까? :)
brasofilo

20
YouPorn는 항상 클래스를 싱글 톤으로 정의 할 수 있습니다. stackoverflow.com/questions/203336/…
Bainternet

1
감사. '모범 사례'에 대해서는 생각하지 않았습니다. 코딩 지침을 포함하여 Codex에서 많은 것을 읽었지만 여기에 없습니다 .. 싱글 톤을 시도해 보지만 여전히 플러그인 PHP가 여러 번 호출되는 것은 이상합니다. Bainternet은 자동 완성에주의 :)
RitonLaJoie

brasofilo, 싱글 톤을 만드는 것은 도움이되지만 질문에 대답하지는 않습니다. 왜 플러그인 내에서 코드가 여러 번 실행됩니까? 링크 한 URL의 OO 클래스는 내가하는 일을 정확히 수행합니다
RitonLaJoie

2
질문을 +1해야했습니다. 코멘트와 공감에 대 한 : D
kaiser

답변:


3

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는 모든 페이지 요청에 대해 한 번만 수행됩니다.


0

일어날 수있는 일은 클래스의 사본을 필터 또는 조치에 전달하는 것입니다. 예를 들어 후크 또는 필터 내에서 클래스 변수를 직접 수정하려면 참조로 후크를 전달해야합니다.

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)로만로드 할 수 있음을 발견했습니다.


3
객체를 인수로 보내거나 다른 변수에 반환하거나 할당하면 다른 변수는 별칭이 아닙니다. 동일한 객체를 가리키는 식별자의 사본을 보유합니다. PHP 매뉴얼에서 . 액션 호출 또는 필터에서 클래스는 인수로 전송됩니다. PHP5부터는 참조로 전달할 필요가 없습니다.
Ralf912

나는 수정되었다
Arevico
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.