Eclipse / PDT & phpDoc

Ich habe heute wieder an meinem Code-Generator herumgefrickelt und bin dabei auf ein zwei Sachen gestoßen, die mich etwas stören.
Zum Einen unterstützt phpDoc nicht, dass eine Variable mehrere Typen besitzt. Ich habe z.B. eine Variable $_target, die sowohl das Interface Ckl_Codegen_Properties_Interface als auch das Ckl_Codegen_Target_Interface implementiert.
Logische Konsequenz wäre ja, dass man nun einen phpDoc-Kommentar der Form

/**
 * @var $_target Ckl_Codegen_Properties_Interface, Ckl_Codegen_Target_Interface
 */

erstellt. Funktioniert leider nicht.
Weiterhin unterstüzt auch das PDT eben diese Funktionalität nicht. Dafür kann man innerhalb des Quellcodes den Typen einer Variable definieren. Wusste ich vorher auch nicht:

    private function _createTarget()
    {
        for ($i = 0, $m = sizeof($this->_targets); $i < $m; $i++) {
            /* @var $target Ckl_Codegen_Target_Abstract */
            $target = $this->_targets[$i];
            $target->setModel($this->getModel());
            $target->setProperties($this->getProperties());
            $target->createTarget();
        }
    }

Damit funktioniert dann auch die Auto-Completition des PDTs.

Ich würde mir wünschen, dass ich -wie bei JavaDoc auch- einer Variable mehrere Interfaces im Comment zuweisen und dass ich eine Variable auch als Array von einem bestimmten Typ definieren kann:

/**
 * @var $_target Ckl_Codegen_Properties_Interface[]
 */
private $_target = array();

Comments ( 2 )

  1. / ReplyFrank Nägler
    Imho macht es gar keinen Sinn mehrer Interfaces anzugeben. Denn die Variable kann nicht vom Typ Interface sein. Sie kann nur eine Instanz einer konkreten Klasse sein, welche die Interfaces implentiert. Beispiel: class myClass implements InterfaceA, InterfacsB {} /** @var MyClass */ $myClass = new MyClass(); PDT sollte nun alle Eigenschaften und Methoden der Interfaces erkennen, da MyClass diese implementiert.
  2. / ReplyGast
    Natürlich kann eine Variable vom Typ Interface sein. Jeodoch nicht von mehreren Typen. Du könntest dies so realisieren: interface MyInterface extends MyInterface1, MyInterface2{} class MyClass implements MyInterface /** @var MyInterface */ $myClass = new MyClass(); Es ist Sinnvoll auf Schnittstellen zu programmieren, von daher würde ich deinen Ansatz weiterverfolgen

Leave a reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>