Newsgroup: it.comp.www.php
Titolo: Aiuto Classe di prova

Ciao a tutti sto leggendo un libro sul PHP e per spiegare le classi dice di 
provare quella seguente, ma non funziona, non capisco dove, se inserisco una 
data di nascita non valida non la riconosce.
Sfrutta  l'interprete PHP per passare alla funzione _get una variabile 
pubblica non esistente. (Cosě c'č scritto sul libro).
Io gli passo una data fasulla 'blue' ma lui non si accorge.
Vi ringrazio David
<?php
class PropertyObject {
private $_properties = array(
'name' => null,
'dateofbirth' => null
);
function _get($propertyName) {
if (!array_key_exists($propertyName, $this->_properties))
throw new Exception('Valore della propriet? non valido!');
if (method_exists($this, 'get'.$propertyName)) {
return call_user_func(array($this, 'get'.$propertyName));
}
else {
return $this->_properties[$propertyName];
}
}
function _set($propertyName,$value) {
if (!array_key_exists($propertyName, $this->_properties)) throw new 
Exception('Valore della propriet? non valido!');
if (method_exists($this, 'set'.$propertyName)) {
return call_user_func(array($this, 'set'.$propertyName),$value);
}
else {
$this->_properties[$propertyName]=$value;
}
}
function setdateofbirth($dob) {
if(strtotime($dob) == -1) {
throw new Exception('La data di nascita non valida!');
}
$this->_properties['dateofbirth']=$dob;
}
function sayHello() {
print "Il mio nome ? $this->name. Sono nato il $this->dateofbirth";
}
}
?>
<?php
require_once('class.PropertyObject.php');
$obj = new PropertyObject();
$obj->name = 'David';
$obj->dateofbirth ='blue';
$obj->sayHello();
?>

 Io gli passo una data fasulla 'blue' ma lui non si accorge.
Le funzioni __get e __set vanno con due underscore, non con uno come hai
fatto tu.
Per come le chiami tu sono normali funzioni di libreria, non operatori
sovraccaricati.
Bye.

> pubblica non esistente. (Cosě c'č scritto sul libro).


 throw new Exception('Valore della propriet? non valido!');
"da` un errore su" non vuol dire niente.
Posta l'errore completo che da` e la riga, visto che ne hai due identiche.
Bye.

Scusa mi, mi da questo errore:
Fatal error: Uncaught exception 'Exception' with message 'La data di nascita 
non valida!' in W:\www\Class\class.PropertyObject.php:39 Stack trace: #0 
[internal function]: PropertyObject->setdateofbirth('blue') #1 
W:\www\Class\class.PropertyObject.php(31): call_user_func(Array, 'blue') #2 
W:\www\Class\TestPropertyObject.php(11): 
PropertyObject::__set('dateofbirth', 'blue') #3 {main} thrown in 
W:\www\Class\class.PropertyObject.php on line 39
La linea 39 è questa:
if(strtotime($dob)==null) {throw new Exception('La data di nascita non 
valida!');}
Il sencondo problema l'ho risolto ho dovuto mettere null al posto di -1 
sempre nella riga riportata sopra, ma non so perchè visto che su internet ho 
trovato che dovrebbe restituire -1 in caso di errore.
Grazie molte
David

 valida!');}
Sta facendo esattamente quello che gli hai chiesto: sollevare un eccezione
se l'if e` vero.
Siccome gli stai chiedendo di convertire un valore non valido in stringa,
lui torna null, quindi lancia l'eccezione.
Ti conviene leggere meglio quel libro (o cambiarlo, se nonti spiega queste
cose ;)
Bye.

Grazie, effetivamente ci sono degli errori anche in altre pagine.
Ciao David


David ha scritto:

Il codice del "main" dovrebbe contenere un blocco
try { /* qualcosa*/} catch {/* codice di gestione eccezione */} 
altrimenti lui solleva un'eccezione che nessuno gestisce e ti 
restituisce "Fatal error: Uncaught exception ". Nel tuo caso dovrebbe 
essere più o meno così (non l'ho testato):
<?php
require_once('class.PropertyObject.php');
try {
   $obj = new PropertyObject();
   $obj->name = 'David';
   $obj->dateofbirth ='blue';
   $obj->sayHello();
}
catch (Exception $my_exception) {
   /* codice eseguito se è stata sollevata un'eccezione*/
   die ('Errore: '.$my_exception->getMessage());
}
?>