PHPdoc – Definieren von Objekteigenschaften für ein Objekt der stdClass
Lesezeit: 7 Minuten
irgendein Benutzer
Ich versuche herauszufinden, ob es möglich ist, PHPdoc zu verwenden, um die Objekteigenschaften zu definieren, die von einer Funktion oder einer Objektmethode zurückgegeben werden.
Angenommen, ich habe die folgende Klasse:
class SomeClass {
public function staffDetails($id){
$object = new stdClass();
$object->type = "person";
$object->name = "dave";
$object->age = "46";
return $object;
}
}
Jetzt ist es einfach genug, Eingabeparameter zu definieren.
/**
* Get Staff Member Details
*
* @param string $id staff id number
*
* @return object
*/
class SomeClass {
public function staffDetails($id){
$object = new stdClass();
$object->type = "person";
$object->name = "dave";
$object->age = "46";
return $object;
}
}
Die Frage ist, ob es etwas Ähnliches gibt, um Eigenschaften des Ausgabeobjekts (einer stdClass) zu definieren, das von der fraglichen Methode zurückgegeben wird. Damit ein anderer Programmierer diese Klasse nicht öffnen und manuell in die Methode schauen muss, um zu sehen, was das Rückgabeobjekt zurückgibt?
Warum haben Sie nicht einfach eine StaffDetails-Klasse mit Typ-, Namens- und Alterseigenschaften? Dann können Sie @param StaffDetails verwenden
– Ken
15. September 2012 um 8:00 Uhr
Wenn Sie keinen konkreten Typ für die stdClass machen möchten, können Sie immer noch schreiben @return \stdClass holding type, name and age oder erläutern Sie dies in der ausführlichen Beschreibung des Doc-Blocks. Dann ist es zumindest dokumentiert. Das wird Ihre IDE jedoch nicht auf magische Weise dazu bringen, die Eigenschaften zu kennen.
– Gordon
15. September 2012 um 8:08 Uhr
nein – Ich möchte nicht, dass die IDE die Eigenschaften kennt. Ich möchte nur, dass sie schön dokumentiert sind. Das Objekt, das ich tatsächlich verwende, enthält ungefähr 40 Variablen, also wollte ich wirklich wissen, ob es eine Möglichkeit gibt, sie in einer Tabelle so anzuordnen, wie Eingabeparameter angezeigt werden. Andernfalls wird es unordentlich und schwer zu lesen, wenn Sie nur eine lange Beschreibung verwenden.
– irgendein Benutzer
15. September 2012 um 8:12 Uhr
@l_t Nun, Sie können sie immer in der Langbeschreibung des DocBlocks dokumentieren. Aber ein Objekt mit 40 Variablen ist ein guter Indikator dafür, dass ein Objekt sowieso zu viel weiß. Sie können dieses Objekt wahrscheinlich in 4 bis 10 einzelne Objekte aufteilen. Achten Sie auf Eigenschaften, die gruppiert werden können. Extrahieren Sie sie in ihre eigene Klasse. Ordnen Sie dann die Hauptklasse dieser Klasse zu, sodass Sie am Ende einen schönen dedizierten Objektgraphen erhalten.
– Gordon
15. September 2012 um 8:21 Uhr
@Gordon Thanks- Die fragliche Methode ist eine Gruppierung vieler verschiedener Klassen. Ich habe es so gemacht, damit der Frontend-Entwickler nur eine Klassenmethode aufrufen und ein Objekt mit allen bereinigten / vorverarbeiteten Daten zurückerhalten kann, die für diese Seite benötigt werden (in diesem Fall Produktdaten). Ist das generell keine gute Idee?
– irgendein Benutzer
15. September 2012 um 8:37 Uhr
Jeremy Harris
Hier ist es 4 Jahre später, und es scheint immer noch keine Möglichkeit zu geben, die Eigenschaften eines stdClass-Objekts wie ursprünglich in Ihrer Frage beschrieben zu kommentieren.
Erstellen Sie eine normale Klasse, die Ihr Datenobjekt darstellt, und kommentieren Sie die Eigenschaften.
class MyData
{
/**
* This is the name attribute.
* @var string
*/
public $name;
/**
* This is the age attribute.
* @var integer
*/
public $age;
}
Option 2:
Erstellen Sie ein Generikum Struct Geben Sie Klasse ein, wie von Gordon vorgeschlagen, und erweitern Sie sie als Ihr Datenobjekt, indem Sie die verwenden @Eigentum Anmerkung, um zu definieren, auf welche generischen Werte zugegriffen werden kann __get und __set.
class Struct
{
/**
* Private internal struct attributes
* @var array
*/
private $attributes = [];
/**
* Set a value
* @param string $key
* @param mixed $value
*/
public function __set($key, $value)
{
$this->attributes[$key] = $value;
}
/**
* Get a value
* @param string $key
* @return mixed
*/
public function __get($key)
{
return isset($this->attributes[$key]) ? $this->attributes[$key] : null;
}
/**
* Check if a key is set
* @param string $key
* @return boolean
*/
public function __isset($key)
{
return isset($this->attributes[$key]) ? true : false;
}
}
/**
* @property string $name
* @property integer $age
*/
class MyData extends Struct
{
// Can optionally add data mutators or utility methods here
}
Wenn Sie sich für Option 1 entscheiden, können Sie die Klasse in einer Datei deklarieren, die von Ihrer IDE gescannt, aber von Ihrem Projekt ignoriert wird. Geben Sie an, dass die Methode a zurückgibt StaffMemberaber weiter verwenden stdClass in der Umsetzung.
– David Harkness
6. April 2017 um 18:59 Uhr
Wie können Sie eine Datei von Ihrer IDE scannen, aber von Ihrem Projekt mit NetBeans ignorieren lassen?
– Jewgenij Afanasjew
28. Januar 2021 um 23:59 Uhr
Dies ist eine alte Frage – ich würde empfehlen, eine neue zu stellen.
Sie haben nur zwei Möglichkeiten, die Struktur der Ergebnisklasse zu dokumentieren.
1.Man kann die Struktur in einem Kommentartext beschreiben. Zum Beispiel:
class SomeClass
{
/**
* Getting staff detail.
* Result object has following structure:
* <code>
* $type - person type
* $name - person name
* $age - person age
* </code>
* @param string $id staff id number
*
* @return stdClass
*
*/
public function staffDetails($id){
$object = new stdClass();
$object->type = "person";
$object->name = "dave";
$object->age = "46";
return $object;
}
}
2. Man kann einen Datentyp erstellen, der stdClass erbt und eine Anmerkung eines Ergebnisobjekts hat. Zum Beispiel:
/**
* @property string $type Person type
* @property string $name Person name
* @property integer $age Person age
*/
class DTO extends stdClass
{}
Und verwenden Sie es in Ihren anderen Klassen
class SomeClass {
/**
* Getting staff detail.
*
* @param string $id staff id number
*
* @return DTO
*
*/
public function staffDetails($id){
$object = new DTO();
$object->type = "person";
$object->name = "dave";
$object->age = "46";
return $object;
}
}
Meiner Meinung nach ist dieser Weg besser als eine Beschreibung im Textkommentar, weil er den Code offensichtlicher macht
Option 1 – würde Ihrer IDE nicht helfen, damit zu arbeiten, Option 2 – würde gegen die PSR-Konvention verstoßen
– Jewgenij Afanasjew
28. Januar 2021 um 23:18 Uhr
@YevgeniyAfanasyev Ja, Option 1 konnte der IDE nicht helfen, sie kann nur einem Entwickler helfen, der mit Ihrem Code arbeitet – er / sie wird zumindest die Struktur sehen. Option 2 – welchen PSR meinst du?
– Maksym Fjodorow
29. Januar 2021 um 8:07 Uhr
Das PSR4-Spezifikation sagt: >Der abschließende Klassenname entspricht einem Dateinamen mit der Endung .php. Der Dateiname MUSS mit der Groß-/Kleinschreibung des abschließenden Klassennamens übereinstimmen.
– Jewgenij Afanasjew
2. Februar 2021 um 7:06 Uhr
@YevgeniyAfanasyev Es bezieht sich nicht auf PSR-4, da meine Antwort keine Dateien enthält. Es ist nur ein einfaches Codebeispiel.
– Maksym Fjodorow
2. Februar 2021 um 9:16 Uhr
@YevgeniyAfanasyev Ja, ich habe den Code im Beispiel getrennt, danke 🙂
– Maksym Fjodorow
3. Februar 2021 um 6:24 Uhr
Jewgenij Afanasjew
Wenn Sie PHP 7 verwenden, können Sie eine anonyme Klasse definieren.
class SomeClass {
public function staffDetails($id){
$object = (new class() extends stdClass {
public /** @var string */ $type;
public /** @var string */ $name;
public /** @var int */ $age;
});
$object->type = "person";
$object->name = "dave";
$object->age = 46;
return $object;
}
}
Es funktioniert für meine IDE (getestet in NetBeans)
Krzysiek
Mit zum Beispiel json_decode Es ist schwieriger, stattdessen eigene Klassen zu verwenden stdClassaber in meinem Fall habe ich nur eine Dummy-Datei mit Klassendefinitionen erstellt, die wirklich nicht geladen ist, und ich füge eigene Klassen als hinzu @return (funktioniert für Intelephense auf vscode).
PHPdocObjects.php
/**
* class only for PHPdoc (do not include)
*/
class Member {
/** @var string */
public $type;
/** @var string */
public $name;
/** @var string */
public $age;
}
/**
* Other format
*
* @property string $type;
* @property string $name;
* @property string $age;
*/
class MemberAlt {}
SomeClass.php
/**
* Get Staff Member Details
*
* @param string $id staff id number
*
* @return Member I'm in fact stdClass
*/
class SomeClass {
public function staffDetails($id){
$object = json_decode('{"type":"person","name":"dave","age":"46"}');
return $object;
}
}
Alexej Jaschin
Der Hack, den ich für die automatische Vervollständigung in PhpStorm verwende:
Erstellen Sie eine Metadatei, die einige Klassen enthält, um Ihre Strukturen zu beschreiben. Die Datei ist nie enthalten und Strukturen haben ihre eigenen Namensregeln, um sie nicht mit real existierenden Klassen zu verwechseln:
<?php
/*
meta.php
never included
*/
/**
* @property string $type
* @property string $name
* @property string $age
*/
class StaffDetails_meta {}
Verwenden Sie die Metaklasse als Rückgabewert in Ihrem echten Code PHPDoc:
<?php
/*
SomeClass.php
eventually included
*/
class SomeClass
{
/**
* Get Staff Member Details
*
* @param string $id staff id number
*
* @return StaffDetails_meta
*/
public function staffDetails($id)
{
$object = new stdClass();
$object->type = "person";
$object->name = "dave";
$object->age = "46";
return $object;
}
}
Herzlichen Glückwunsch, dadurch wird Ihre IDE Ihren Code automatisch vervollständigen, wenn Sie so etwas wie eingeben würden (new SomeClass)->staffDetails('staff_id')->
PS: Ich weiß, fast 10 Jahre sind vergangen, aber immer noch aktuell
14305800cookie-checkPHPdoc – Definieren von Objekteigenschaften für ein Objekt der stdClassyes
Warum haben Sie nicht einfach eine StaffDetails-Klasse mit Typ-, Namens- und Alterseigenschaften? Dann können Sie @param StaffDetails verwenden
– Ken
15. September 2012 um 8:00 Uhr
Wenn Sie keinen konkreten Typ für die stdClass machen möchten, können Sie immer noch schreiben
@return \stdClass holding type, name and age
oder erläutern Sie dies in der ausführlichen Beschreibung des Doc-Blocks. Dann ist es zumindest dokumentiert. Das wird Ihre IDE jedoch nicht auf magische Weise dazu bringen, die Eigenschaften zu kennen.– Gordon
15. September 2012 um 8:08 Uhr
nein – Ich möchte nicht, dass die IDE die Eigenschaften kennt. Ich möchte nur, dass sie schön dokumentiert sind. Das Objekt, das ich tatsächlich verwende, enthält ungefähr 40 Variablen, also wollte ich wirklich wissen, ob es eine Möglichkeit gibt, sie in einer Tabelle so anzuordnen, wie Eingabeparameter angezeigt werden. Andernfalls wird es unordentlich und schwer zu lesen, wenn Sie nur eine lange Beschreibung verwenden.
– irgendein Benutzer
15. September 2012 um 8:12 Uhr
@l_t Nun, Sie können sie immer in der Langbeschreibung des DocBlocks dokumentieren. Aber ein Objekt mit 40 Variablen ist ein guter Indikator dafür, dass ein Objekt sowieso zu viel weiß. Sie können dieses Objekt wahrscheinlich in 4 bis 10 einzelne Objekte aufteilen. Achten Sie auf Eigenschaften, die gruppiert werden können. Extrahieren Sie sie in ihre eigene Klasse. Ordnen Sie dann die Hauptklasse dieser Klasse zu, sodass Sie am Ende einen schönen dedizierten Objektgraphen erhalten.
– Gordon
15. September 2012 um 8:21 Uhr
@Gordon Thanks- Die fragliche Methode ist eine Gruppierung vieler verschiedener Klassen. Ich habe es so gemacht, damit der Frontend-Entwickler nur eine Klassenmethode aufrufen und ein Objekt mit allen bereinigten / vorverarbeiteten Daten zurückerhalten kann, die für diese Seite benötigt werden (in diesem Fall Produktdaten). Ist das generell keine gute Idee?
– irgendein Benutzer
15. September 2012 um 8:37 Uhr