Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
[PHP] Errore su classe.
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet
Precedente :: Successivo  
Autore Messaggio
mdweb
Dio maturo
Dio maturo


Registrato: 18/12/07 16:59
Messaggi: 4412

MessaggioInviato: 28 Gen 2009 17:21    Oggetto: Rispondi citando

Allora tempo fa altervista aveva nella root principale una cartella chiamata php5,esiste ancora?
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 28 Gen 2009 17:33    Oggetto: Rispondi citando

sevenjeak ha scritto:
Cmq, freemind, online ho detto di avere il supporto per la 4 e la 5, non solo per la quatro

intanto che rispondevo a
mdweb ha scritto:
che versione di php usi in locale e on-line?

sono arrivati gli altri messaggi quindi non sapevo ancora che avevi risposto.

Allora è semplice, configuri il webserver per usare php5 fine.
Come si fa non lo so, perchè iis non l'ho mai usato con php e non so come è messo il server di altervista.

In teoria nel supporto tecnico del fornitore ci dovrebbe essere spiegato come attivare uno o l'altro, oppure dovresti avere nel pannello di admin la possibilità di switch delle versioni, oppure dovrai caricare i files in una dir piuttosto che in un'altra.
Top
Profilo Invia messaggio privato
sevenjeak
Semidio
Semidio


Registrato: 04/02/08 22:05
Messaggi: 308
Residenza: Roma

MessaggioInviato: 28 Gen 2009 17:33    Oggetto: Rispondi citando

No, almeno che non sia nascosta, ma io creto di no.
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 28 Gen 2009 17:34    Oggetto: Rispondi citando

Note bene l'ora e minuti del mio ultimo post e del tuo...
Top
Profilo Invia messaggio privato
mdweb
Dio maturo
Dio maturo


Registrato: 18/12/07 16:59
Messaggi: 4412

MessaggioInviato: 28 Gen 2009 17:40    Oggetto: Rispondi citando

sevenjeak ha scritto:
No, almeno che non sia nascosta, ma io creto di no.

forse l'hanno tolta,secondo me era moltuo utile.
Praticamente quanto tu mettevi un file nella root principale vieniva interpretato come php4 mentre quando lo mettevi nella root php5 lo interpretava come php5.

Se adesso non c'è forse il supporto è solo per una delle due...

Non hai un altro web hosting per fare una prova al volo?
Top
Profilo Invia messaggio privato
sevenjeak
Semidio
Semidio


Registrato: 04/02/08 22:05
Messaggi: 308
Residenza: Roma

MessaggioInviato: 28 Gen 2009 17:59    Oggetto: Rispondi citando

Ho provato ha postare il codice su ilbello.com, li mi funziona.

Allorà è altervista che nn lo supporta +?
Top
Profilo Invia messaggio privato HomePage
mdweb
Dio maturo
Dio maturo


Registrato: 18/12/07 16:59
Messaggi: 4412

MessaggioInviato: 28 Gen 2009 18:01    Oggetto: Rispondi citando

allora a questo punto è come avevo detto.

Chiedi nel forum di altervista chiarimenti agli amministratori Wink
Top
Profilo Invia messaggio privato
sevenjeak
Semidio
Semidio


Registrato: 04/02/08 22:05
Messaggi: 308
Residenza: Roma

MessaggioInviato: 28 Gen 2009 18:26    Oggetto: Rispondi citando

mdweb ha scritto:

Chiedi nel forum di altervista chiarimenti agli amministratori Wink


Cosa?, se altervista supportato php5.

P.S.: ho risolto, da poco hanno fatto un tasto presente su altervista, che ti genera un file che ti permette la micrazione da PHP4 a PHP5, ho provato il mio codice è mi funziona.

Grazie a tutti per il vostro aiuto.
Top
Profilo Invia messaggio privato HomePage
mdweb
Dio maturo
Dio maturo


Registrato: 18/12/07 16:59
Messaggi: 4412

MessaggioInviato: 28 Gen 2009 19:30    Oggetto: Rispondi citando

Prego Ciao
Top
Profilo Invia messaggio privato
sevenjeak
Semidio
Semidio


Registrato: 04/02/08 22:05
Messaggi: 308
Residenza: Roma

MessaggioInviato: 28 Gen 2009 19:49    Oggetto: Rispondi citando

Ansi, senti questo:

Se io ad esempio ho la stessa classe, cosi modificata:
Codice:

<?
class todey
{
   private $mese_num;
   private $mese_lett;
   private $result_date;
   public function __construct()
   {
      $this->mese_num = date(m);
      $this->reflash_date();
   }
   public function reflash_date()
   {
      $mese = $this->mese_num;
      switch($mese) {
         case 01:
          $this->mese_lett = "Gennaio";
         break;
      }
      $this->result_date = date(d)."&nbsp;".$this->mese_lett."&nbsp;'".date(y);
   }
}
?>

Che naturarmente ho verificato se va on-line ed è tutto apposto.
Ma ora ho scritto sotto questo codice per prendere il valore di result_date sia cosi:
Codice:

<?
$ToDay = new todey();
$Todey->result_date;
print_r($ToDay);
?>

e sia cosi:
Codice:

<?
$ToDay = new todey();
$Todey->result_date();
print_r($ToDay);
?>

Ma entrambi, invece di stamparmi il valore di result_date mi stampa questo errore:
Codice:

Fatal error: Call to undefined method todey::result_date() in /membri/sevenjeak/Under_cost/inc/config.inc.php on line 28


Come mai?
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 29 Gen 2009 00:05    Oggetto: Rispondi citando

Ti riporto il tuo codice aggiungendo dei commenti per chiarire alcune cose:
Codice:

<?
class todey
{
/**
 * Queste sono 3 proprietà, ossia 3 variabili "interne" alla classe che ne descrivono appunto le proprietà.
 * Sono state dichiarate "private" quindi accessibili solo dall'interno della classe; in altre parole solo i medoti della classe
 * le possono usare
 */
   private $mese_num;
   private $mese_lett;
   private $result_date;
   
/**
 * Questo è il costruttore, un metodo "speciale" che serve ad inizializzare la classe ossia a settare i valori
 * iniziali delle proprietà e ad eseguire le operazioni "preliminari". Normalmente è public ossia accessibile dall'esterno
 * della classe
 */
   public function __construct()
   {
      $this->mese_num = date(m);
      $this->reflash_date();
   }
   
/**
 * Altro metodo pubblico, vale il discorso del costruttore tranne che la chiamata va esplicitata (il costruttore viene chiamato in automatico
 * quando istanzi la classe)
 */   
   public function reflash_date()
   {
      $mese = $this->mese_num;
      switch($mese)
      {
         case 01:
          $this->mese_lett = "Gennaio";
         break;
      }
      $this->result_date = date(d)."&nbsp;".$this->mese_lett."&nbsp;'".date(y);
   }
}
?>

Le proprietà sono variabili, i metodi sono funzioni.
I due segmenti qui sotto:
Codice:

<?
// (1)
   $ToDay = new todey();
   $Todey->result_date;
   print_r($ToDay);
?>

e
Codice:

<?
// (2)
   $ToDay = new todey();
   $Todey->result_date();
   print_r($ToDay);
?>

hanno entrambi la seconda riga senza senso.
Nel codice (1) tu vuoi fare riferimento alla proprietà private $result_date dall'esterno della classe e questo non è possibile, come commentato nella classe le proprietà (e i metodi) private possono essere usate solo all'interno della classe.
Anche se fosse public ("public $result_date;") il codice non avrebbe senso perchè è come se scrivessi:
Codice:

<?
   ...
   $i=0;
   ...
   ...
   $i   // <- che vuol dire?
?>


Nel codice (2) addirittura tenti di chiamare un metodo result_date() che non esiste. Infatti $result_date è una proprietà (ora non ci interessa se pubblica o no) e il metodo (public) "result_date()" non c'è (infatti l'errore del parser indica proprio il tentativo di accedere ad un metodo che non esiste)

Se vuoi poter utilizzare la proprietà "$result_date" fuori dalla classe, ossia, la vuoi rendere pubblica, devi definirla public.
Facendo così potrai settarle il valore con:
Codice:

<?
   $ToDay = new todey();
   $Todey->result_date=date('m');
?>

oppure richiamarla con:
Codice:

<?
   $ToDay = new todey();
   print $Todey->result_date;
?>

Adesso potremmo iniziare un lungo discorso sul fatto di rendere o no pubblica una proprietà e quindi di non usare o usare un accessor e un mutator method per tale proprietà ma per ora limitiamoci alle basi.
Se non vuoi renderla privata ma vuoi poterla raggiungere anche da fuori devi creare due metodi che di solito hanno la seguente forma:
Codice:

<?
   class ...
   {
      ...
      private $prop;
      
   // accessor method, in generale il nome è 'get' + nome-proprietà, serve a leggere una proprietà
      public function getProp()
      {
         return $this->prop;   
      }
      
   // mutator method, in generale il nome è 'set' + nome-proprietà($v), serve a modificare una proprietà
      public function setProp($v)
      {
         $this->prop=$v;   
      }
      ...         
   }
?>

Nel tuo caso otterremmo:
Codice:

<?
class todey
{
   private $mese_num;
   private $mese_lett;
   private $result_date;
   public function __construct()
   {
      $this->mese_num = date(m);
      $this->reflash_date();
   }
   public function reflash_date()
   {
      $mese = $this->mese_num;
      switch($mese) {
         case 01:
          $this->mese_lett = "Gennaio";
         break;
      }
      $this->result_date = date(d)."&nbsp;".$this->mese_lett."&nbsp;'".date(y);
   }
   
   public function getResult_date()
   {
      return $this->result_date;   
   }
   
   public function setResult_date($v)
   {
      $this->result_date=$v;   
   }
}
?>

Pro e contro per entrambe le situazioni.

Divagazione 1:
Continui a lasciarti indietro gli apici nella funzione date(), attento, è un caso che funzioni, in quanto dipende da come è configurato php. La funzione ha il prototipo: "string date ( string $format [, int $timestamp ] )" quindi se la usi con un parametro deve essere una stringa!

Divagazione 2:
mdweb ha scritto:
davvero ottima domanda? Smile

Sì, purtroppo quando lavori con i tuoi strumenti e devi portare il lavoro in un ambiante che non è configurato da te rischi casini con le versioni.
Io ho lavorato un sacco con le versioni di sviluppo e produzioni fuori sincro (di molto) e succedeva di tutto: quello che andava già non andava su e viceversa. Ovviamente dovendo lavorare sia giù che su immagina i casini...
Top
Profilo Invia messaggio privato
sevenjeak
Semidio
Semidio


Registrato: 04/02/08 22:05
Messaggi: 308
Residenza: Roma

MessaggioInviato: 29 Gen 2009 09:05    Oggetto: Rispondi citando

Aspe Aspe.

Mi ero dimenticato di aggiornare il mio vecchio topic, avevo risolto in parte, ma dopo mi stampava questo risultato:
Codice:

01 Gennaio '091


Non so perche mi stampava l'uno dopo l'anno.

Cmq. ho capito quello che hai detto, ma alla fine, io cosa dovrei scrivire per farmi prendere il varore della proprieta result_date?

tu hai scritto che mi conviene utilizare un medoto get con un'altro medodo set, ma questo non serve solo per modificare il valore delle proprietà?

P.S. : Non la facevo cosi complicata, sarà che è la prima classe che scrivo Laughing
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 31 Gen 2009 16:16    Oggetto: Rispondi citando

Per quanto riguarda il tuo P.S.: non ti preoccupare, è così perchè sei all'inizio con la programmazione ad oggetti.

Per settare e prendere il valore di una proprietà
dipende da cosa vuoi fare.
Esempio cretino:
Codice:

<?php
   class Box
   {
      public width;
      public height;
      public depth;   
   }
?>

Box è una classe senza comportamento ossia senza metodi. Le 3 proprietà sono pubbliche per cui possono essere usate all'esterno della stessa.
Dopo che hai istanziato la classe dovrai settarle a manina perchè non c'è un costruttore che le inizializzi:
Codice:

<?php
   class Box
   {
      public width;
      public height;
      public depth;
   }
   
   $b1=new Box();
   $b2=new Box();
   
// Imposto le proprietà di $b1
   $b1->width=5;
   $b1->height=2;
   $b1->depth=3;
   
// Imposto le proprietà di $b2 come due volte quelle di $b1
   $b2->width=2*$b1->width;
   $b2->height=2*$b1->height;
   $b2->depth=2*$b1->depth;
?>

Nell'esempio io istanzio due scatole $b1 e $b2, setto le proprietà della prima come se fossero var normali per cui l'assegnazione è a sinistra dell'=.
Poi setto $b2 leggendo le proprietà omonime di $b1 e le moltiplico per due; come per $b1 le prop di $b2 sono a sinstra di = mentre le altre a destra. Quando ragioni con le proprietà devi ragionare come con le var normali.

Se hai la necessità di vincolare alcuni valori allora è meglio usare i metodi set, uno per ogni proprietà.
In quest'ottica potremmo riscrivere la precedente classe con:
Codice:

<?php
   <?php
   class Box
   {
      private width;
      private height;
      private depth;
      
      public function setWidth($v)
      {
         $this->width=$v;   
      }
      
      public function setHeight($v)
      {
         $this->height=$v;   
      }
      
      public function setDepth($v)
      {
         $this->depth=$v;   
      }
      
      public function getWidth()
      {
         return $this->width;   
      }
      
      public function getHeight()
      {
         return $this->height;   
      }
      
      public function getDepth()
      {
         return $this->depth;   
      }
   }
?>

Ora le proprietà sono private quindi dall'esterno non raggiungibli. Per settare i loro valori occorre l'uso dei metodi set, il loro utilizzo permettere di aggiungere eventuali controlli sull'impossibilità di impostare valori negativi, una scatola non può avere un'altezza minore di zero!
Idem per i metodi get che servono ad avere indietro i loro valori, se tu per qualche motivo devi memorizzare questi 3 dati in millimetri ma quando li visualizzi li devi stampare in metri allora occorrerà modificare i get in modo che ritornino il valore moltiplicato per 1000.
Si potrebbe discutere a lungo su come impostare la visibilità dei metodi, delle proprietà, se usare o no i set e get etc... ma diventerebbe un piccolo corso sull'oop che prima o poi comunque verrà fatto qui su questi teleschermi!
Top
Profilo Invia messaggio privato
sevenjeak
Semidio
Semidio


Registrato: 04/02/08 22:05
Messaggi: 308
Residenza: Roma

MessaggioInviato: 31 Gen 2009 20:02    Oggetto: Rispondi citando

Ok, questo lo capito, mi conviene impostare tutte le proprietà come pubblic?
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 01 Feb 2009 23:34    Oggetto: Rispondi citando

Vedi, dipende da cosa devi fare e da come lo vuoi fare.
Un concetto importante e fondamentale dell'oop è l'incapsulamento.
In pratica il nascondere al mondo esterno determinate cose della classe permette a questa di non farsi conoscere e di risultare come una black-box.
Tu dirai agli utilizzatori della classe: "usate questo metodo per fare..", "usate questa proprietà per vedere il tal valore..." ma non gli dirai mai come la classe funzione, perchè a loro non serve saperlo.
In pratica tutto quello che è ad uso interno deve restare privato mentre quello che va usato anche dall'esterno deve essere pubblico.
Se tu vuoi permettere di settare i valori di una proprietà ovunque allora mettila public, se non vuoi che sia raggiungibile dall'esterno devi settarla private senza usare poi i mutator e gli accessor, se vuoi invece renderla accessibile da fuori con dovuti controlli allora mettila private e usa i set e get.
Nel tuo caso potresti scegliere qualunque strada perchè potresti decide che le proprietà debbano essere settare anche da fuori la classe oppure decidere che sono ad uso interno quindi devi metterle private.
Forse darebbe più semplice se spiegassi che cosa vorresti che facesse la classe così magari partendo da un caso pratico riusciamo ad aiutarti meglio
Top
Profilo Invia messaggio privato
sevenjeak
Semidio
Semidio


Registrato: 04/02/08 22:05
Messaggi: 308
Residenza: Roma

MessaggioInviato: 02 Feb 2009 13:32    Oggetto: Rispondi citando

Ho provato ha mettere tutte le proprietà come public, ho risclitto il codice cosi:
Codice:

class toDey
{
   public $mese;
   public $mese_long;
   public $rs;
   class __construct()
   {
      $this->mese = date('m');
      $this->reflasch_dey();
   }
   class reflasch_dey()
   {
      $mese_num = $this->mese;
      switch ($mese_num) {
         case 01:
            $this->mese_long = "$nbsp;Gennaio";
         break;
      }
      $this->rs = date('d').$this->mese_long."&nbsp;'".data('y');
   }
}
$dey = new toDay();
print_r($day->rs_dey);

Ma quando vado ha eseguirlo su server mi visualizza questo errore:
Codice:

Parse error: syntax error, unexpected T_CLASS, expecting T_FUNCTION in /membri/sevenjeak/Under_cost/inc/config.inc.php on line 8


Ho rivisto il codice più di una volta ma non trovo nessun errore.
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 05 Feb 2009 23:45    Oggetto: Rispondi citando

Nel tuo codice ci sono un po' di errori.
A volte usi toDey altre volte toDay e lo stesso per altre var, ho reso coerenti alcuni nomi.
Inoltre non puoi con php definire classi innestate, ma credo che tu volessi definire dei metodi, posto le tue righe con sotto le mie
Codice:

<?php
   class toDey       // tua
   class toDay   // mia
   ...
   class __construct() // tua
   public function __construct()   // mia
   ...
   class reflasch_dey()   // tua
   public function reflasch_dey()   // mia
   ...
   case 01:   // tua
       $this->mese_long = "$nbsp;Gennaio"; // tua
      
         case 02:      // mia, ho messo il due perchè oggi siamo in febbraio
            $this->mese_long = "&nbsp;Febbraio";   // mia, le html entities si scrivono con la & e non con il $
      
      ...
      $this->rs = date('d').$this->mese_long."&nbsp;'".data('y'); // tua
      $this->rs = date('d').$this->mese_long."&nbsp;'".date('y'); // mia
      ...
      $dey = new toDay();   // tua
   print_r($day->rs_dey);    // tua
   
   $day = new toDay();   // mia
   print_r($day->rs); // mia
   
?>

e in definitiva:
Codice:

<?php
   class toDay
{
   public $mese;
   public $mese_long;
   public $rs;
   public function __construct()
   {
      $this->mese = date('m');
      $this->reflasch_dey();
   }
   public function reflasch_dey()
   {
      $mese_num = $this->mese;
      switch ($mese_num) {
         case 02:
            $this->mese_long = "&nbsp;Febbraio";
         break;
      }
      $this->rs = date('d').$this->mese_long."&nbsp;'".date('y');
   }
}
$day = new toDay();
print_r($day->rs);
?>
Top
Profilo Invia messaggio privato
sevenjeak
Semidio
Semidio


Registrato: 04/02/08 22:05
Messaggi: 308
Residenza: Roma

MessaggioInviato: 06 Feb 2009 15:54    Oggetto: Rispondi citando

Non avevo proprio notato questi errori, cmq ora correggo e ti faccio sapere

P.S. : Il codice mi va, ora lo dovrei stampare in una pagina in qui ed inclusa la classe, ma il problema e che mi stampa un 1 dopo l'anno, come mai?
Top
Profilo Invia messaggio privato HomePage
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 07 Feb 2009 19:37    Oggetto: Rispondi citando

Puoi postare il codice che ti rogna?
Top
Profilo Invia messaggio privato
sevenjeak
Semidio
Semidio


Registrato: 04/02/08 22:05
Messaggi: 308
Residenza: Roma

MessaggioInviato: 07 Feb 2009 23:03    Oggetto: Rispondi

Il codice è quello che mi hai scritto nel post precedente, ho sono modificato lo switch, cmq è questo:
Codice:

<?php
 class toDay
{
   public $mese;
   public $mese_long;
   public $rs;
   public function __construct()
   {
      $this->mese = date('m');
      $this->reflasch_dey();
   }
   public function reflasch_dey()
   {
      $mese_num = $this->mese;
      switch ($mese_num) {
         case 01:
            $this->mese_long = "&nbsp;Gennaio";
         break;
         case 02:
            $this->mese_long = "$nbsp;Febbraio";
         break;
         case 03:
            $this->mese_long = "$nbsp;Marzo";
         break;
         case 04:
            $this->mese_long = "$nbsp;Aprile";
         break;
         case 05:
            $this->mese_long = "$nbsp;Maggio";
         break;
         case 06:
            $this->mese_long = "$nbsp;Giugno";
         break;
         case 07:
            $this->mese_long = "$nbsp;Luglio";
         break;
         case 08:
            $this->mese_long = "$nbsp;Agosto";
         break;
         case 09:
            $this->mese_long = "$nbsp;Settembre";
         break;
         case 10:
            $this->mese_long = "$nbsp;Ottobre";
         break;
         case 11:
            $this->mese_long = "$nbsp;Novembre";
         break;
         case 12:
            $this->mese_long = "$nbsp;Dicembre";
         break;
      }
      $this->rs = date('d').$this->mese_long."&nbsp;'".date('y');
   }
}
$day = new toDay();
?>

Solamente che l'ultima riga inserita da te: print_r($day->rs); si trova in una pagina in qui è inclusa al suo interno la classe qui sopra e postata anche da te.
Top
Profilo Invia messaggio privato HomePage
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Linguaggi per Internet Tutti i fusi orari sono GMT + 2 ore
Vai a Precedente  1, 2, 3  Successivo
Pagina 2 di 3

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi