✅ WEB- und WordPress-Nachrichten, Themen, Plugins. Hier teilen wir Tipps und beste Website-Lösungen.

Eine Einführung in die Reflexion in PHP (und wie es in Unit-Tests einfließt)

32

In den letzten Wochen habe ich über Komponententests für die Mitglieder der Website geschrieben (und etwas, das ich im nächsten Beitrag fortsetzen möchte). Es ist etwas, was ich denke; Wenn Sie serverseitigen Code schreiben, sollten Sie dies tun.

Natürlich ist es einfacher für mich, es zu sagen, als es zu tun, und obwohl ich versuche sicherzustellen, dass ich es gut mache, gibt es immer Raum für mich, mich zu verbessern. Ich sage das eher als persönlichen Bauchcheck als alles andere, also schweife ich ab.

Eines der Konzepte, die beim Testen häufig auftauchen, ist die Idee, die Werte privater Attribute zu testen. Angenommen, Sie haben einen Setter, aber nicht unbedingt einen Getter für diesen bestimmten Wert.

Es ist leicht zu sagen „Nun, dann müssen Sie einen Getter schreiben“, aber das ist nicht immer der Fall. Ich meine, was ist, wenn Sie einige Informationen innerhalb der Klasse speichern, die nicht für Klassen von Drittanbietern verfügbar gemacht werden müssen?

Wie sollen wir dann Tests für diese Art von Daten schreiben, wenn wir darauf zugreifen möchten, aber nicht die Möglichkeit dazu haben und die Integrität unserer Arbeit nicht gefährden wollen?

Da kommt die Reflexion ins Spiel.

Reflexion in PHP

Um zu verstehen, wie man den Wert einer bestimmten Variablen von außen nach innen untersucht, müssen Sie wissen, wie man Reflektion verwendet.

Glücklicherweise stellt uns PHP dafür eine leistungsstarke API zur Verfügung, und es lohnt sich wahrscheinlich, in einem anderen Beitrag auf die tiefen Details einzugehen. Aber in diesem Fall bleiben wir bei den Grundlagen.

Eine Arbeitsdefinition

Zunächst ein Blick darauf, was Reflexion bedeutet. Das PHP-Handbuch definiert es als :

Die ReflectionClass -Klasse meldet Informationen zu einer Klasse.

Aber ich denke, es lohnt sich, etwas Solideres zu haben. Lassen Sie uns zumindest für diesen Beitrag so etwas tun:

Reflektion ist die Art und Weise, wie sich ein Programm während der Laufzeit selbst inspiziert und modifiziert.

Vielleicht ist es nicht großartig; vielleicht nicht.

Eine Einführung in die Reflexion in PHP (und wie es in Unit-Tests einfließt)

Aber es wird den Zweck dieses Beitrags erfüllen.

Lesen eines Werts über Reflektion

Nehmen wir an, dass Sie für diesen Beitrag eine Namespaces-Klasse bei AcmePluginAPIClient haben und diese eine Eigenschaft namens username hat. Wir werden uns später ansehen, wie eine sehr einfache Implementierung davon aussehen könnte.

Natürlich wäre es in einem tatsächlichen Plugin viel ausführlicher.

Angenommen, Sie möchten den Wert des Attributs festlegen und dann seinen Wert lesen. Die Einschränkung ist, dass die Eigenschaft als privat markiert ist und es keine Möglichkeit gibt, sie von außen zu lesen.

Hier hilft die Reflexion. Das heißt, wir können einen Teil des Programms verwenden, um sich selbst zu betrachten und zurückzugeben, was es sieht. (Reflektion, kapiert? Es ist, als wollten wir wissen, was mit uns los ist und niemand sonst da ist, also schauen wir in einen Spiegel und sehen, was da ist.)

Dazu müssen Sie fünf Dinge tun:

  1. Instanziieren Sie die Klasse, die Sie testen möchten,
  2. Legen Sie den Wert der Variablen fest,
  3. Holen Sie sich eine Instanz der ReflectionClass für die Klasse, die wir testen möchten,
  4. Setze seine Eigenschaft auf zugänglich,
  5. Lesen Sie den Wert ab.

Hier ist also eine Reihe von Grundzügen, die die notwendigen Schritte enthalten, um genau das zu tun.

1 Instanziieren Sie die Klasse

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

  // Other functions for class implementation...
}

2 Stellen Sie den Wert ein

<?php

namespace AcmePlugin;

class APIClient
{
  private $username;

  public function setUsername($username)
  {
    $this->username = $username;
  }

  // Other functions for class implementation...
}

3 Instanziieren Sie reflektierte Objekte

<?php

namespace AcmePluginTests;

use AcmePluginAPIAPIClient;

class APIClientTest
{
  public function setUsername()
  {

    // Instantiate the class.
    $client = new APIClient();
    $username = 'tommcfarlin';
    $client->setUsername($username);

    // Now get a reflected instance of the class.
    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');

    // More to come...
  }
}

4. Legen Sie die Eigenschaft fest, markieren Sie sie als zugänglich

<?php

namespace AcmePluginTests;

use AcmePluginAPIAPIClient;

class APIClientTest
{
  public function setUsername()
  {

    // Instantiate the class.
    $client = new APIClient();
    $username = 'tommcfarlin';
    $client->setUsername($username);

    // Now get a reflected instance of the class.
    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');
    $usernameProperty = new ReflectionObject($client);
    $usernameProperty->setAccessible(true);

    // More to come...
  }
}

5 Lesen Sie den Wert ab

<?php

namespace AcmePluginTests;

use AcmePluginAPIAPIClient;

class APIClientTest
{
  public function setUsername()
  {

    // Instantiate the class.
    $client = new APIClient();
    $username = 'tommcfarlin';
    $client->setUsername($username);

    // Now get a reflected instance of the class.
    $reflectedClient = new ReflectionClass('AcmePluginAPIAPIClient');

    // Grab a reference to the private property by making it accessible.
    $usernameProperty = new ReflectionObject($client);
    $usernameProperty->setAccessible(true);

    // And finally, read it's value.
    $usernameValue = $usernameProperty->getValue($client);
  }
}

Und das ist die grundlegende Einführung in die Reflexion

An dieser Stelle sollte Ihnen dies einige grundlegende Informationen darüber geben, was Reflection ist, wie es verwendet wird und warum es insbesondere im Fall von Komponententests nützlich ist .

Dies ist eines dieser Konzepte, die komplexer werden können, da die Reflection-API von PHP ziemlich leistungsfähig (aber relativ einfach zu verstehen) ist. Wenn Sie es jedoch mit Komponententests koppeln, gibt es eine Menge Dinge, die getan werden können.

Mein schamloser Stecker

Wenn Sie jedoch daran interessiert sind, die Einzelheiten dieser Art von Dingen zu erfahren, zögern Sie nicht, sich den Bereich nur für Mitglieder der Website anzusehen. Ich baue jede Woche einen Vorrat an Dingen auf, die uns dabei helfen, uns darauf zu konzentrieren, bessere Praktiken als WordPress-Entwickler anzunehmen.

Unit Testing, Reflection und mehr ist nur der neueste Teil davon.

Aufnahmequelle: tommcfarlin.com

Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern. Wir gehen davon aus, dass Sie damit einverstanden sind, Sie können sich jedoch abmelden, wenn Sie möchten. Annehmen Weiterlesen