Newsgroup: it.comp.www.php
Titolo: Sugli oggetti: is an attribute?

Salve a tutti.
Ho creato un metodo, del quale riporto il codice, che mi restituisce il 
valore di un attributo di un oggetto dato il nome dell'attributo.
public function getAttributeValue($attributeName = null)
{
  if(isset($this->{$attributeName}))
  {
   return $this->{$attributeName};
  }
  else
  {
   return false;
  }
}
Ora vorrei raffinare il metodo lanciando un'eccezione nel caso non 
esista l'attributo, ovvero non sia stato dichiarato all'inizio della 
classe e non semplicemente sia stato dichiarato ma non assuma valore.
E' possibile?
Grazie.
-- 
Αγαμεμνων



Nell'else metti
throw new Exception("testo dell'eccezione");
al posto del return false;
Ma mi sa che tu vuoi qualcosa per cui devi usare la classe 
ReflectionProperty:
http://it2.php.net/manual/en/
language.oop5.reflection.php#language.oop5.reflection.reflectionproperty
Nel qual caso ti consiglierei piuttosto di astrarre gli attributi con i 
magic method __get() e __set(), se possibile.
Bye.

 al posto del return false;
La mia intenzione era quella di differenziare l'attributo inesistente 
nella classe dall'attributo dichiarato ma nullo.
Se l'attributo esiste, cioè è stato dichiarato ma non assume valore, va 
bene il return fase; se l'attributo non esiste deve partire l'eccezione.
class Pippo
{
  private $par=null;
  public function getAttributeValue($attributeName = null)
  {
   if(isset($this->{$attributeName}))
   {
    return $this->{$attributeName};
   }
   else
   {
    return false;
   }
  }
}
$pippo = new Pippo();
$baudo = $pippo->getAttributeValue('par');
//$baudo è false
$pluto = $pippo->getAttributeValue('par2');
//qui eccezione! var2 non è dichiarato nella classe Pippo
Thanks!
-- 
Αγαμεμνων


<snip>
<OT>
Non posso non farmi delle domande. Ma se hai il nome di un attributo
per quale motivo al mondo dovresti passarlo ad una funzione per avere
il suo valore? Per quale motivo al mondo esiste il reflection? Per
quale motivo si insiste ad "attaccare" metodi ed attributi alle classi
a runtime? Puro masochismo?
</OT>

 il suo valore? 
Se l'attributo è private devi usare una metodo per ricavarne il valore.
-- 
Αγαμεμνων

 Puro masochismo?
Per esempio, metti caso che stai scrivendo una serie di "plugin" per... 
qualsiasi cosa. Metti che siano degli script che generano dei blocchi in 
un CMS. Alcuni potrebbero definire gli attributi "title" e "content", 
altri solo "title", altri solo "content", altri nessuno dei due.
In PHP puoi fare una cosa del genere:
$blocchi = array("News", "LastComments", "TagCloud");
foreach ($blocchi as $blocco) {
 $blk = new $blocco;
 print $blk->title;
 print $blk->content;
}
Questo e` un esempio banale, ma metti che quei blocchi ereditino da una 
classe base (o abstract) "Block", che ha un metodo getContent() e uno 
getTitle() (usiamo i getter per chiarezza di spiegazione, ma puoi anche 
farne a meno, in PHP, tramite __get() )
La classe base non ha idea di come definirai le sue classi figlie, e se tu 
metterai un title e un content in esse.
Con la reflection la classe base puo` analizzare se` stessa per come viene 
istanziata (quindi come classe News che estende Block) e vedere se quegli 
attributi sono stati definiti o meno, e in caso se mettere un valore di 
default o sollevare un eccezione.
E` un po' arzigogolato come esempio, ma non mi viene niente di piu` 
semplice. :)
Bye.


Non mi sono spiegato. Se chiedi un attributo significa che sai che
esiste. Non ha senso che il "get" relativo a quell'attributo controlli
che esista o meno. Almeno che tu non lo dichiari runtime, il che è,
IMO da un punto di vista di design del software, orribile.
Sempre a meno che tu non usi "isset" per controllare se un attributo è
NULL, il che è fuorviante (anche se funziona) visto che esiste la
funzione is_null(). E anche in questo caso un semplice === è più
chiaro (e più veloce di qualche nanosecondo).


Infatti è arzigogolato perchè è sbagliato a livello di design. Per
queste cose esistono le interfacce. Cercando di generalizzare, nella
programmazione ad oggetti nessuna interfaccia implementata == nessuna
garanzia su metodi/attributi di una classe.

 chiaro (e più veloce di qualche nanosecondo).
Be, si, hai ragione... vado a cambiare gli isset.
Ciao.
-- 
Αγαμεμνων

 garanzia su metodi/attributi di una classe.
In PHP (e credo anche in altri linguaggi) le interfacce NON permettono di 
definire gli attributi di una classe che le implementa, ma solo i metodi.
Per andare un po' oltre, la Reflection serve anche e soprattutto in fase 
di debug e testing, per analizzare il contenuto degli oggetti a runtime.
In PHP, inoltre, viene implementata con classi esterne, non e` inclusa 
nelle classi base, quindi non hai nemmeno l'overhead se non la usi.
Bye.

 Bye.
Ciao!

 oggetti a runtime, pratica che secondo me è da non utilizzare mai.
In certi casi potrebbe risultare utile o semplificare molto il codice.
Anche altri linguaggi lo permettono, vedi python (e forse ruby), e anche 
alcuni approcci alla programmazione, vedi gobject di Gtk+
Rende piu` flessibile il software.
Pensa, se ti e` mai capitato, di avere un oggetto in cui hai alcuni 
parametri salvati in una hash table. Banalmente: leggi un file di 
configurazione e salvi le coppie variabile-valore in un hash.
Se non avessi a disposizione attributi dinamici o una hash table, 
dovresti modificare l'oggetto Config ogni volta che aggiungi una voce di 
configurazione.
Cosi` invece modifichi solo il codice degli oggetti che usano quel 
parametro di configurazione.
In questo caso non serve la reflection perche` puoi restituire un valore 
di default (null o stringa vuota o 0, per PHP sono quasi equivalenti) ma 
volendo la potresti usare per fare quello che stava facendo 
Agamenone_Atride: sollevare un eccezione per informare l'utente che non 
ha definito quel parametro nel file di condifgurazione (e restituire 
stringa vuota quando il parametro e` presente ma valorizzato a stringa 
vuota.
Bye.

 Bye.
Ciao!

 molto rigidi, nonchè fortemente tipizzati.
Si`, l'avevo intuito. ;)
Io sono tendente all'opposto, invece. :)
Bye.