Klassen bearbeiten mit Zend_Reflection und Zend_CodeGenerator

| 2 Kommentare

Es gibt Themen, die eigentlich immer für Diskussionen sorgen. Eines davon die Verwendung von Gettern und Settern.

Obwohl ich bekennender Befürworter bin, will ich auf die Vor- und Nachteile heute garnicht weiter eingehen. Vielmehr will ich das Argument, dass das Schreiben der vielen Methoden zu zeitintensiv sei, entkräften und ein wenig mit den Komponenten Zend_CodeGenerator und indirekt auch mit Zend_Reflection spielen. 

Dank der Komponente Zend_CodeGenerator lassen sich sämtliche Elemente der PHP-Welt einfach erzeugen oder verändern. Als Ausgangspunkt habe ich die Klasse Person angelegt die ich um einige Methoden erweitern will.

<?php
// file: person.php
class Person
{
  public function __construct()
  {
    // mach was oder auch nicht
  }
}

Als nächsten Schritt bereiten wir unser Testscript vor. In der Datei bootstrap.php wird lediglich der AutoLoader für das Zend Framwork initialisiert.

<?php
require '../bootstrap.php';

$fileIn = './person.php';
$fileOut = './person.gen.php';

Da die CodeGenerator-Klassen die jeweiligen Elemente direkt über Reflectios verarbeiten können, brauchen wir hier nur noch den Pfad zur Datei angeben. In $file haben wir nun die komplette PHP-Datei als Objekt zur Verfügung und holen uns die erste Klasse zu weiteren Bearbeitung.

$file = Zend_CodeGenerator_Php_File::fromReflectedFileName($fileIn);
$class = current($file->getClasses());

Damit es später auch etwas zu sehen gibt, will ich einige Properties samt Getter und Setter anlegen.

$fields = explode(',', 'id,name,age,email,phone');

foreach ($fields as $field) {
  // private property
  $class->setProperty(array(
    'name' => '_' . $field,
    'visibility' => 'privat'
  ));

  // method getX
  $getter = new Zend_CodeGenerator_Php_Method(array(
    'name' => 'get' . ucfirst($field),
    'body' => 'return $_' . $field . ';'
  ));
  $class->setMethod($getter);

  // method setX
  $setter = new Zend_CodeGenerator_Php_Method(array(
    'name' => 'set' . ucfirst($field),
    'parameters' => array(
      array('name' => $field),
    ),
    'body' => '$this->_' . $field . ' = $' . $field . ';' . PHP_EOL . 'return $this;'
  ));
  $class->setMethod($setter);
}

Zuletzt erzeugen wir den neuen Code der Klasse und schreiben in die Datei ($fileOut).

$code = $file->generate();
file_put_contents($fileOut, $code);

Jedes Element lässt sich bei Bedarf einzeln erzeugen und benutzen.

Ich habe hier einen kleinen Test online gestellt. Es funktioniert noch nicht alles, aber zum Spielen sollte es reichen. Es sind auch noch nicht alle Interfaces vorhanden. Nur das Iterator kann im Moment getestet werden.

Nun also viel Spaß beim Probieren und natürlich freue ich mich über Kommentare.

2 Kommentare

  1. Ich greife da lieber auf die Mittel der IDE zurück. NetBeans bietet z.B. das Erzeugen von Gettern und Settern für vorhandene Elemente an. Das gleiche gilt für die Implementierung von magischen Methoden.
    Wenn ich mich nicht ganz täusche, gibt’s sogar einen Klassengenerator, wie Dein ClassBuilder, aber eben direkt im Hauptwerkzeug… ist irgendwie bequemer ;o)

  2. Klar, wenn die IDE das kann, dann ist das immer bequemer. In dem Beispiel geht es auch eher darum, wie einfach neuer Code aus einem Programm heraus erzeugt werden kann.

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.


Schlagwörter: A/B-Test, AbstractType, Adapter, AddOn, Administration, Ajax, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, Auftrag, Ausbildung, Auswertung, Authentifizierung, AutoLoader, AWS, Bedienung, Bedingung, Benchmark, Berechtigung, Berlin, Bildbearbeitung, Bildschirmfoto, Blog, Blogroll, BOM, Bootstrap, Bot, Browser, Bugtracker, Byte Order Mark, Bücher, Cache, CakePHP, Call-Center, Callback, CamelCase, Canvas, Captcha, CDN, Cheatsheet, CLI, Clickout, Closure, Cloud, CodeSniffer, Collection, Community, Comparator, Config, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CRUD, CSS, CSV, CustomLibrary, Custom_Model, Daemon, Data Mapper, Datei, Datenbank, Datenstruktur, Datentypen, Dating, Datum, Debug, Decorator, Dekorierer, Design, Design Patterns, Doctrine, Dokumentation, Dump, Duplikat, each, EC2, Eclipse, Email, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Event, Eventhandling, Exception-Handling, Extension, Facebook, Factory, Fallback, Fehler, Fehlermeldung, Filter, Firefox, Flash, flexigrid, Foreach, Formatierung, Formular, Framework, FTP, Funktion, Futon, ga:pi(), Getter, Google Analytics, Hash, Hash-Bang, Header, htaccess, HTML5, htpasswd, HTTP, HTTPS, IDE, If, Implementierung, InnoDB, Interceptor, Interface, Internet Explorer, isset, Iterator, Java, JavaScript, Job, jQuery, Kommentar, Konfiguration, Konsole, Kontrollstruktur, kopieren, kostenlos, Kundenbetreuung, Late Static Binding, Layout, Links, Linux, Listeners, Lizenz, Logging, Löschen, Magento, Magic Methods, Manual, ManyToMany, Marketing, Methode, Model, Monolog, MVC, MySQL, NetBeans, Network, Nirvanix, Objekt, Observable, Observer, OneToMany, Online Tool, OOP, Open Source, Operator, OR-Mapper, Order, ORM, O’Reilly, Parameter, Partnersuche, Passwort, Performance, PHP, php.ini, PHP hates me, phpMyAdmin, PHPUnit, Plugin, Popup, Proxy, Prüfsumme, Prüfung, QR-Code, Qualitätssicherung, Query, Queue, Redesign, Refactoring, Reflection, Request, Response, Responsive Design, Rest-API, Rockstar, Rollback, Routing, S3, Samba, Scheifen, Schleife, Schutz, Screenshot, Secure Shell, Selbstreferenz, Server, Setter, setTimeout, Shop, Sicherheit, Sicherung, Sichtbarkeit, Singleton Pattern, Skin, SOAP, Social Network, Software, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, Splittest, SSH, SSL, Stammtisch, Statement, static, Statistik, Status, Stellvertreter, Strategy Pattern, Stream, String, Stuttgart, Stylesheet, Subversion, Sun VirtualBox, Support, SVN, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Theme, Thumbnail, Tool, Tour, Tracking, Twig, Twitter, Type-Cast, Ubuntu, Umwandlung, Underscore, unset, Update, Upload, Url, User Story, Validierung, Vererbung, Versionskontrolle, Versionsnummer, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Warteschlange, Webserver, Webservice, Weiterleitung, Werkzeug, Windows, WindowsAzure, WordPress, Wrapper, Writer, XML, Youtube, Zeitschleife, Zeitsteuerung, Zend Framework, Zend_Application, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Reflection, Zend_Service, ZPress, Zugangskontrolle, Zugriffsmethode