Schreiben Sie sicheres Arbeiten mit PHP-Arrays

Hallo allerseits, ich erzähle Ihnen von meinem eigenen Fahrrad für die bequeme Arbeit mit Arrays in PHP.

Tippe Andeutungen


In PHP7 tauchten Tippfehler auf, die es der IDE ermöglichten, eine bessere statische Analyse des Codes durchzuführen, und die Qualität unseres Codes verbesserte sich (oder es wurde richtig " besser "?).

Früher war es der IDE natürlich möglich, einen Hinweis in die Kommentare für den Code zu schreiben, aber jetzt sind die Typen Teil des Codes geworden und jetzt ist es möglich geworden, etwas umzugestalten, und Sie haben keine Angst mehr, etwas irgendwo zu vergessen (Umzugestalten natürlich im Sinne des Umbenennens von Klassen und Schnittstellen).

Neben der Möglichkeit, den Ausgabetyp anzugeben, konnte auch der Typ des Eingabearguments angegeben werden.

Neben den netten Funktionen sind mit dem Typhinweis auch Verantwortlichkeiten verbunden, dh die Variablentypen sollten wirklich den Angaben in der Methodensignatur entsprechen.

Wenn Sie keine Typen überprüfen, können Fehler in Methoden und Konstruktoren auftreten (Fehler in Designern sind besonders ermutigend).

Das manuelle Schreiben von Schecks ist mühsam. Ich habe mich entschlossen, dieses Geschäft zu automatisieren, aber nicht durch Überprüfung, sondern durch Casting auf den gewünschten Typ.

In meiner Arbeit muss ich oft von Grund auf neu schreiben, normalerweise sind es entweder Prototypen oder Parser oder ETLs für eine neue Datenquelle, tatsächlich auch ein Parser.

Natürlich arbeiten Sie mit Arrays (zum Beispiel, wenn Sie aus * .csv lesen), können Sie mit der Datenbank über ORM arbeiten, aber für meine Aufgaben ist es zu umständlich, mit der Datenbank über PDO zu arbeiten, wodurch Sie wieder Daten in Arrays erhalten. "Favorit" Bitrix kann nur Daten in einem Array zurückgeben.

Egal wie Sie Daten von Arrays abrufen müssen. Also habe ich einen Wrapper für die Arbeit mit Arrays geschrieben.

Um den Code nicht von Projekt zu Projekt zu kopieren, habe ich das Paket für Composer entworfen :

composer require sbwerewolf/language-specific 

Werthandler


Meine erste Anforderung war, immer zu wissen, welchen Typ ich erhalten würde. Zuvor mussten wir natürlich noch den Wert abrufen, wahrscheinlich über den Index, und kamen zu dem Schluss, dass wir die get () -Methode benötigen.

Und jetzt brauchen wir Methoden zum Casting, es gibt nicht viele Typen in PHP, wir haben die folgenden Methoden:

  1. int ()
  2. str ()
  3. bool ()
  4. double ()

Arrays stoßen manchmal auf etwas, also sei es für Arrays:

  • array ()

Manchmal muss man das Element einfach so bekommen, wie es ist:

  • asIs ()

Manchmal gibt es möglicherweise kein Element mit einem bestimmten Index, und dann müssen Sie den Standardwert verwenden:

  • default ()

Arrayhandler


Die nächste Anforderung bestand darin, das Array von einem Wert auf genau diesen Wert vereinfachen zu können.

Ich zeige Ihnen ein Beispiel aus der Dokumentation:

 $connection = new PDO ($dsn,$login,$password); $command = $connection->prepare('select name from employee where salary > 10000'); $command->execute(); $data = $command->fetchAll(PDO::FETCH_ASSOC); /* $data = array ( 0 => array ( 'name' => 'Mike', ), 1 => array ( 'name' => 'Tom', ), 2 => array ( 'name' => 'Jerry', ), 3 => array ( 'name' => 'Mary', ) ); */ $names = new ArrayHandler($data); $result = $names->simplify(); echo var_export($result,true); /* LanguageSpecific\ArrayHandler::__set_state(array( '_data' => array ( 0 => 'Mike', 1 => 'Tom', 2 => 'Jerry', 3 => 'Mary', ), )) */ 

Sie können natürlich das Array durchlaufen, das von der Anforderung zurückgegeben wird, und diese Zuordnung vornehmen:

 $response[] = $element[0]; 

, aber ich mag es nicht so sehr, lass es automatisch geschehen, also erschien die simplify () -Methode.

Nun, da wir einen Wrapper über dem Array haben, werden wir eine Methode hinzufügen, um das Vorhandensein von index - has () zu überprüfen. Wenn Sie die Elemente des Arrays durchgehen möchten, hilft die next () -Methode.

Dies hätte gestoppt werden können, weil die Automatisierungsebene eine angenehme Ebene erreicht hat, aber manchmal muss ich mit einem verschachtelten Array eines verschachtelten Arrays arbeiten, und es ist für mich bequemer, sofort einen ArrayHandler für das Zielarray abzurufen. Deshalb habe ich die pull () -Methode hinzugefügt, die einen ArrayHandler für das verschachtelte Array zurückgibt .

Es sieht so aus:

 $address = new ArrayHandler($item)->pull('metaDataProperty')->pull('GeocoderMetaData')->pull('Address')->asIs(); 

Du kannst natürlich so schreiben:

 $address = $item['GeoObject']['metaDataProperty']['GeocoderMetaData']['Address']; 

, aber in meinen Augen kräuselt sich die Anzahl der eckigen Klammern, es ist bequemer für mich durch pull ().

Allgemeine Begründung


Wenn der Code über Composer verbunden ist, ist dies sehr praktisch, mit der Ausnahme, dass Sie das Kopieren und Einfügen überflüssig machen. Sie erhalten Ihre Bibliothek mit einem Befehl und sie ist immer zur Hand.

Bevor ich mein Paket zusammenstellte, habe ich mir Analoga angesehen und nichts Vergleichbares gefunden. Es gibt mehrere Projekte, die einfach in ein Array eingebunden werden. In diesen Projekten werden einfach viele Methoden für die Arbeit mit Arrays eingebunden, und es gibt nirgendwo eine Typensicherheit.

Anscheinend ist das Schreiben von (int) oder (bool) vor dem Variablennamen für alle einfach und bequem, und niemand sieht einen Grund, sich mit einem separaten Repository für diese Sache zu befassen.

Die Bibliotheksfunktionen sind geringfügig breiter als die im Artikel beschriebenen. Weitere Informationen finden Sie in der Dokumentation (README.md) .

PHP5 ist keine Seltenheit, daher hat die Bibliothek eine separate Version für PHP5, unterscheidet sich von der Version für PHP7 durch den Namen mehrerer Methoden und natürlich sind alle Typhinweise nur in Kommentaren enthalten.
Es gibt eine Version der Bibliothek für PHP7.2, die sich nur dadurch unterscheidet, dass der Typ des Rückgabewerts in der Signatur der Methode object () - object enthalten ist.

Der Code wird vollständig von Tests abgedeckt, aber im Prinzip gibt es nichts zu brechen :)

Gebrauch für Gesundheit!

Ein weiterer Anwendungsfall


 foreach ($featureMember as $item) { $pointInfo = extract($item); $info = new ArrayHandler($pointInfo); $address = $info->get('formatted')->default('')->str(); $longitude = $info->get('longitude')->default(61.402554)->double(); $latitude = $info->get('latitude')->default(55.159897)->double(); $undefined = !$info->get('formatted')->has(); $properties = ['longitude' => $longitude, 'latitude' => $latitude, 'address ' => $address ,'undefined'=>$undefined,]; $result = json_encode($properties); output($result); } 

Wenn ich beim Debuggen in JSON sehe, dass Zahlen Zahlen sind, logische Werte logisch sind, bin ich viel angenehmer als nur Zeichenfolgen.

Bild

Wie wäre es mit dir?

Source: https://habr.com/ru/post/de476102/


All Articles