Autor wpisu: Zyx, dodany: 12.02.2008 09:43, tagi: php
Autor wpisu: Zyx, dodany: 05.02.2008 21:07, tagi: php
Autor wpisu: stormfly, dodany: 04.02.2008 10:49, tagi: php
Autor wpisu: Splatch, dodany: 20.01.2008 22:55, tagi: php
Parę dni wstecz trafiłem na ciekawe rozszerzenie Reflection API do PHP. Umożliwia ono używanie tagów phpdoc w charakterze adnotacji. Rozwiązanie te jest zbliżone do znanego mi z Javy xdocleta. Drobną, aczkolwiek zauważalną, różnicą jest fakt, że xdoclet był odpalany przed kompilacją kodu ponieważ bytecode nie zawierał adnotacji. Oczywiście po wejściu Javy 5 xdoclet podupadł, jako coś co wyparły właśnie adnotacje. Może dla tych, którzy nie mieli okazji spotkania sie z takim rozwiązaniem drobny przykład kodu w Javie:
PLAIN TEXT JAVA:- package pl.dywicki.swe.domain;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- import javax.persistence.Table;
- @ Entity(name = "user")
- @Table(name = "user", schema = "public")
- public class User {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- @Column(name = "user_id")
- private long id;
- @Column(name="user_login")
- private String login;
- @Column(name="user_password")
- private String password;
- public long getId() {
- return id;
- }
- public void setId(long id) {
- this.id = id;
- }
- public String getLogin() {
- return login;
- }
- public void setLogin( String login) {
- this.login = login;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword( String password) {
- this.password = password;
- }
- }
Co umożliwia takie rozwiązanie? Przede wszystkim dzięki zastosowaniu adnotacji spada ilość dodatkowych plików zawierających konfiguracje i mapowania. Oczywiście nie da się ich dzięki temu rozwiązaniu wykluczyć zupełnie, aczkolwiek da się znacznie ograniczyć ich użycie. Wielką zaletą, o której do tej pory nie wspomniałem, w przypadku Javy, jest to, że adnotacje możemy odczytywać w czasie uruchamiania programu a nie przed jego kompilacją.
Adnotacja od strony technicznej
Jak można zadeklarować własną adnotację? Służy do tego specjalna konstrukcja:
PLAIN TEXT JAVA:Użycie takiej adnotacji:
PLAIN TEXT JAVA:- @ Name // poprawnie
- public class Component {}
- @ Name("user.session") // również poprawnie
- public class User {}
Możemy również przekazać kilka wartości gdy zadeklarujemy w adnotacji odpowiednie pole:
PLAIN TEXT JAVA:Użycie takiej adnotacji:
PLAIN TEXT JAVA:- @Relation(belongTo = {"users", "groups"}, offer = "privileges")
- public class PrivilegesEntityMapping {}
Warto tutaj wspomnieć o dwóch magicznych umowach. Po pierwsze atrybut o nazwie value jest domyślnym przypisaniem wartości podanej w nawiasach. Tzn przy wywołaniu @Name("user.session") możemy pobrać atrybut poprzez [b]annotationInstance.value()[/b]. Po drugie dodanie po nazwie pola default "wartość" pozwala na pominięcie atrybutu przy definicji. Z ograniczeń, jakie mają adnotacje w Javie - wartościami atrybutów mogą być ciągi znaków, typy (klasy) oraz typy wyliczeniowe (enumy).