PHPdoc – Definieren von Objekteigenschaften für ein Objekt der stdClass

Lesezeit: 7 Minuten

Benutzeravatar von someuser
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

Benutzeravatar von Jeremy Harris
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.

Sammlungen wurden in PSR-5 vorgeschlagen, aber das scheint abgeschossen worden zu sein: https://github.com/php-fig/fig-standards/blob/211063eed7f4d9b4514b728d7b1810d9b3379dd1/proposed/phpdoc.md#collections

Anscheinend gibt es nur zwei Möglichkeiten:

Option 1:

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.

    – Jeremy Harris

    1. Februar 2021 um 15:30 Uhr

  • Es könnte auch eine gute Idee sein, die zu implementieren Serialisierbar und JsonSerializable Schnittstelle

    – Tofandel

    18. August um 9:52 Uhr


Benutzeravatar von Maksym Fedorov
Maksym Fjodorow

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

Benutzeravatar von Yevgeniy Afanasyev
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)

Benutzeravatar von Krzysiek
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;
    }
}

Benutzeravatar von Alexey Yashin
Alexej Jaschin

Der Hack, den ich für die automatische Vervollständigung in PhpStorm verwende:

  1. 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 {}
  1. 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;
    }
}
  1. 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

1430580cookie-checkPHPdoc – Definieren von Objekteigenschaften für ein Objekt der stdClass

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy