programing

Wordpress 플러그인의 클래스 내에서 $this를 사용하면 치명적인 오류가 발생하는 이유는 무엇입니까?

megabox 2023. 2. 7. 19:41
반응형

Wordpress 플러그인의 클래스 내에서 $this를 사용하면 치명적인 오류가 발생하는 이유는 무엇입니까?

관리 영역에 페이지를 만드는 Wordpress 플러그인을 작성하고 프런트 엔드 코드를 실행하는 중입니다.

아래 코드는 멋집니다.Fatal error: Using $this when not in object contexterror. 변수가 클래스 내에서 호출되기 때문에 다소 혼란스러운 부분입니다.

함수 및 클래스에 대해 의도된 Wordpress 플러그인 구조를 따르지 않는 것 같습니다만, 아래의 개념 코드는 Wordpress Codex의 플러그인 개발에 관련된 항목을 사용하여 작성되었습니다.

Wordpress 코드베이스 외부에서 클래스의 인스턴스를 만들면 모든 것이 정상이기 때문에 오류가 발생하는 이유를 설명해 주실 수 있습니까?

if (!class_exists("MyClass")) {
  class MyClass {
    var $test = 'Test variable';

    public function index() {
      //Index code
    }

    public function add() {
      echo $this->test;
    }
  }
}

add_action('admin_menu', 'my_plugin_menu');

function my_plugin_menu() {
  add_menu_page('My Plugin', 'My Plugin', 'manage_options', 'my-plugin', array('MyClass', 'index'));
  add_submenu_page('my-plugin', 'Add New Thing', 'Add New', 'manage_options', 'my-plugin-add', array('MyClass', 'add'));
}

그래서 저는 그것을 고친 것 같습니다.기본사항으로 돌아가서 구글에게 "Wordpress 플러그인으로 수업 사용"이라는 겸손한 질문을 던짐으로써요.

Jay Fortner의 기사 dConstructing.com의 기사 모두 도움이 되었습니다.

기본적으로 클래스 내에서 add_menu_page와 add_submenu_page를 호출합니다.나는 그 기능들이 어떻게든 물체를 만들어냈다고 생각했지만, 확실히 그렇지 않다.

내 코드는 다음과 같이 표시되며 선언된 클래스 변수를 오류 없이 호출할 수 있습니다.

if (!class_exists("MyClass")) {
  class MyClass {
    var $test = 'Test variable';

    function __construct() {
      add_action('admin_menu', 'my_plugin_menu');
    }

    function my_plugin_menu() {
      add_menu_page('My Plugin', 'My Plugin', 'manage_options', 'my-plugin', array(&$this, 'index'));
      add_submenu_page('my-plugin', 'Add New Thing', 'Add New', 'manage_options', 'my-plugin-add', array(&$this, 'add'));
    }

    public function index() {
      //Index code
    }

    public function add() {
      echo $this->test;
    }
  }
  new MyClass;
}

이것은 더 이상 사실이 아니다.

클래스에서 통과하면 참조로 통과하고 싶을 수도 있습니다.클래스 내에서 &$ this를 사용하여 클래스 자체 함수를 전달하고 동일한 인스턴스를 계속 수정할 수도 있습니다.이것에 의해 플러그인의 다른 부분이지만 같은 클래스를 호출할 때마다 클래스를 다시 만들지 않아도 됩니다.

송신원: https://codex.wordpress.org/Function_Reference/do_action_ref_array

PHP 5.4부터는 함수 이름에도 불구하고 어레이는 더 이상 참조에 의해 전달되지 않습니다.참조에 의한 콜 시간이 에러를 발생시키기 때문에 참조 기호 「&」도 사용할 수 없습니다.참조 포인터를 배열 요소로 전달할 수 있습니다.이렇게 하려면 액션에 추가된 모든 콜백이 참조 포인터를 예상해야 합니다.이것은 WordPress 액션에서 볼 수 있는 것이 아닙니다.이 기술은 정보 제공 목적으로만 제공됩니다.

$Class = new MyClass();
 add_menu_page(
       'My Plugin',
        'My Plugin',
        'manage_options',
        'my-plugin',
        array(&$Class, 'index')

또는

$myClass= new MyClass ;

add_action('admin_menu', array( $myClass, 'admin_menu' ) );

class MyClass 
{
    public function admin_menu()
    {   
        add_menu_page('MyMenu', 'MyMenu', 'read', 'mymenu', array( $this, 'action' ));  
    }
    public function action()
    {   
        //Do something here
    }
}

다음 작업을 수행해야 합니다.

function my_plugin_menu()
{
add_menu_page('My Plugin', 'My Plugin', 'manage_options', 'my-plugin', array(new MyClass, 'index'));
add_submenu_page('my-plugin', 'Add New Thing', 'Add New', 'manage_options', 'my-plugin-add', array('MyClass', 'add'));
}

「」를 사용합니다.array('MyClass', 'index')php는 메서드를 스태틱메트로 실행하지만 실제 개체를 첫 번째 인수로 전달하면 개체를 통해 메서드가 호출됩니다.

function my_plugin_menu()
{
    $Class = new MyClass();
    add_menu_page(
        'My Plugin',
        'My Plugin',
        'manage_options',
        'my-plugin',
        array($Class, 'index')
    );
}

오브젝트를 재사용하고 싶은 경우에도 사용할 수 있습니다.

클래스가 호출되는 방법에 따라 정적으로 Class::method()가 오류를 발생시킵니다.만약 그렇다면, 당신은 자신을 사용할 필요가 있다고 생각합니다.:$test. 단, 틀릴 수 있습니다.

언급URL : https://stackoverflow.com/questions/5040737/why-does-using-this-inside-a-class-in-a-wordpress-plugin-throw-a-fatal-error

반응형