Was ist eine alternative Methode zur privaten WordPress-Funktion _doing_it_wrong ()?

7

Ich habe Plugins bemerkt, die ein Singleton-Muster verwenden, das die WordPress- _doing_it_wrong()Funktion in ihren clone()Methoden verwendet, wie folgt :

<?php
public function __clone() {
    _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'divlibrary' ), $this->version );
}
?>

Aber ich habe diese Warnung / diesen Hinweis auch in der offiziellen Dokumentation von WordPress bemerkt: Geben Sie hier die Bildbeschreibung ein

Es ist wirklich egal, wann, wie ein Entwickler es verwendet, WordPress befürwortet, dass es nicht verwendet werden sollte, also frage ich mich, wie dies in benutzerdefinierten Plugins richtig gemacht werden kann. Die Methode wird zum Veralten von Code verwendet, aber in diesem Fall möchte der Entwickler nur eine Warnung / Warnung senden.

Referenz: https://developer.wordpress.org/reference/functions/_doing_it_wrong/

Xtremefaith
quelle
Das Beste wäre, keinen öffentlichen Code zu schreiben, der nur intern verwendet werden soll. Wenn Sie jedoch einen logischen Fehler in Ihrer öffentlichen API behandeln möchten, geben Sie a aus, LogicExceptionda dieser Fehler durch ein falsches Design des ausführenden Codes verursacht wird. Wenn Sie keine Ausnahmen verwenden möchten, können Sie immer noch trigger_error () verwenden . Außerdem: Verwenden Sie keine Singletons!
David
@ David Danke für den trigger_error()Tipp. Was die Direktive "Verwenden Sie keine Singletons" betrifft, gibt es eine Zeit und einen Ort, um sie zu verwenden. Daher ist es genauso naiv zu erklären, dass ein Gebot genauso naiv ist wie die Gründe, warum die meisten Menschen sie verwenden.
Xtremefaith
Singletons verletzen die SRP.
David

Antworten:

2

Was ist eine alternative Methode zur privaten WordPress-Funktion _doing_it_wrong ()?

Es gibt keine Möglichkeit, dass WordPress die _doing_it_wrong()Funktion jemals loswerden wird , daher ist es absolut sicher, sie zu verwenden. Wenn Sie es jedoch aus irgendeinem Grund nicht verwenden möchten, weil es als privat markiert ist, können Sie ein Plugin erstellen, dessen Funktion doing_it_wrong()kopiert und eingefügt wird _doing_it_wrong().

Eine andere Möglichkeit wäre, keinen Code zu kopieren und stattdessen eine Klasse zu verwenden, die veralteten Code verarbeitet. Hier ist ein Beispielcode, der im Grunde das Gleiche tut wie _doing_it_wrong().

class deprecated {
  protected $method;
  protected $message;
  protected $version;

  public function method( $method ) {
    $this->method = $method;
    return $this;
  }

  public function message( $message ) {
    $this->message = $message;
    return $this;
  }

  public function version( $version ) {
    $this->version = sprintf( 
      __( 'This message was added in version %1$s.' ), 
      $version
    );
    return $this;
  }

  public function trigger_error() {
    do_action( 'doing_it_wrong_run', $this->method, $this->message, $this->version );
    if ( WP_DEBUG && apply_filters( 'doing_it_wrong_trigger_error', true ) ) {
      trigger_error( sprintf( 
        __( '%1$s was called <strong>incorrectly</strong>. %2$s %3$s' ),
        isset( $this->method ) ? $this->method : '', 
        isset( $this->message ) ? $this->message : '', 
        isset( $this->version ) ? $this->version : ''
      ) );
    }
  }
}

Verwendungszweck

class wpse_238672 {
  public function some_deprecated_method() {
    ( new deprecated() )
      ->method( __METHOD__ )
      ->message( __( 
        'Deprecated Method: Use non_deprecated_method() instead.', 'wpse-238672'
       ) )
      ->version( '2.3.4' )
      ->trigger_error();

    $this->non_deprecated_method();
  }

  public function non_deprecated_method() {
  }
}
Nathan Johnson
quelle