OOP: syntax error

Salve a tutti!

Da poco ho iniziato a studiare la programmazione orientata agli oggetti in php ovviamente.

Quindi giusto per iniziare ad avventurarmi ho deciso di creare un piccolo script che mi legga

tutti i file presenti in una directory e me li stampi a video(per il momento l'ordine non mi interessa, mi serve capire il meccanismo).

Di seguito posto il codice:

class MyFiles {
   
   // membri   
   public $stream = "folder/";
   
   //costruttore 
   public function __construct($stream) {
      if(isset($stream) && is_string($stream) && is_dir($stream) {
            if($handle = opendir($stream)) {
               while($file = readdir($stream)) {
                  echo $file;
               }
            }
      }   
   }
         
   //distruttore
   public function __destruct() {
      closedir($this->stream);
   }

}

ed ecco l'errore che ricevo:

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in "file della classe, quello appena postato, alla linea 8

Ora, quello che io mi chiedo, ho dichiarato semplicemente una variabile pubblica alla linea otto, variabile che poi il costruttore si occupa di verificare di tipo stringa, che non sia NULL e che sia una directory, e poi mi stampa i files...

Perchè questo errore?..  :(

inviato 7 anni fa
Newbie
X 0 X

Non hai chiuso una parentesi qui:

if(isset($stream) && is_string($stream) && is_dir($stream) {

Devi fare così:

if(isset($stream) && is_string($stream) && is_dir($stream)) {
risposto 7 anni fa
Mario Santagiuliana
X 0 X

Non hai chiuso una parentesi qui:

if(isset($stream) && is_string($stream) && is_dir($stream) {

Devi fare così:

if(isset($stream) && is_string($stream) && is_dir($stream)) {

Ok, ma il problema risulta ancora... :-\

difatti il parser non arriva neanche alla linea che abbiamo appena corretto, si blocca(a causa dell'errore) a questa linea:   public $stream = "folder/";

risposto 7 anni fa
Newbie
modificato 7 anni fa
X 0 X

Se non erro prima devi definire gli attributi e poi dargli un valore tramite un costruttore.

Puoi riportare l'errore che ti segnala il php così capiamo meglio?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Se non erro prima devi definire gli attributi e poi dargli un valore tramite un costruttore.

Puoi riportare l'errore che ti segnala il php così capiamo meglio?

Questa è la stringa d'errore:

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /membri/site/filez.php on line 8

comunque non ho capito cos'hai detto riguardo gli attributi..potresti farmi un esempio?..

risposto 7 anni fa
Newbie
X 0 X

Scusa, quando crei il tuo oggetto fai così:

$oggetto = new MyFiles();

o così:

$oggetto = new MyFiles("directory");
comunque non ho capito cos'hai detto riguardo gli attributi..potresti farmi un esempio?..

Lascia perdere ho detto una cavolata...scusami...

Se hai apportato la modifica che ti ho detto non puoi ottenere quell'errore...

Facci vedere il contenuto di filex.php

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Scusa, quando crei il tuo oggetto fai così:

$oggetto = new MyFiles();

o così:

$oggetto = new MyFiles("directory");
comunque non ho capito cos'hai detto riguardo gli attributi..potresti farmi un esempio?..

Lascia perdere ho detto una cavolata...scusami...

Se hai apportato la modifica che ti ho detto non puoi ottenere quell'errore...

Facci vedere il contenuto di filex.php

filez.php

<?php

/* classe gestione files */

class MyFiles {
   
   // membri   
   public $stream = "folder/";
   
   //costruttore 
   public function __construct($stream) {
      if(isset($stream) && is_string($stream) && is_dir($stream)) {
            if($handle = opendir($stream)) {
               while($file = readdir($stream)) {
                  echo $file;
               }
            }
      }   
   }
         
   //distruttore
   public function __destruct() {
      closedir($this->stream);
   }

}
$gg = new MyFiles("cover/");

?>
risposto 7 anni fa
Newbie
X 0 X

Non dovresti ottenere errore...a me non viene fuori nessun errore...

risposto 7 anni fa
Mario Santagiuliana
X 0 X
Non dovresti ottenere errore...a me non viene fuori nessun errore...

io lo testo su altervista lo script, e vedendo questa tua affermazione l'ho testato in locale ed ecco che errori mi dà:

Warning: readdir() expects parameter 1 to be resource, string given in C:\EasyPHP3.1\www\classi\filez.php on line 14

Warning: closedir() expects parameter 1 to be resource, string given in C:\EasyPHP3.1\www\classi\filez.php on line 23

inizio a non capirci piu' niente sinceramente...  :-X :-\

risposto 7 anni fa
Newbie
X 0 X

Allora forse è il caso di creare la classe in un modo più logico:

<?php

/* classe gestione files */

class MyFiles {
   
   // membri   
   public $directory = "folder/";
   
   //costruttore 
       //in questo modo se un utente vuole iniziare l'oggetto con un altra directory lo può fare
        public function __contruct($folder = FALSE) {
                  if($folder)
                      $this->directory = $folder;
        }

        //creo un metodo per avere l'elenco dei file della directory specificata
   public getdirList($stream = FALSE) {
               if($stream)
                   $cartella = $stream;
               else
                    $cartella = $this->directory;

      if(is_dir($cartella)) {
            if($handle = opendir($cartella)) {
               while($file = readdir($handle)) { //<----attenzione qui che devi indicare la cartella aperta!!!
                  echo $file;
               }
      } else {
                       echo $cartella." non è una cartella";
                }
             closedir($handle); //<----devi sempre indicare l'handle per chiudere la cartella aperta
   }
         
   //distruttore
   public function __destruct() {
   }

}
$gg = new MyFiles("cover/");

?>

Ok?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

ciao mario!

Anzitutto ti ringrazio per la tua disponibilità, ma anche con quest'ultima prova ho riscontrato errori sia in locale che sul web..

Ho provato a rimediare agli errori che mi dava ma proprio non ne vuol sapere, soprattutto online, dove continua a darmi quell'errore relativo alla variabile dichiarata:

   public $directory = "folder/";

In locale invece persiste quest'errore: Parse error: parse error, expecting `T_FUNCTION'

relativo alla riga:

$gg = new MyFiles("cover/");

Da mettere in conto che mi trovo(in locale) con: PHP Version 5.3.0.

risposto 7 anni fa
Newbie
X 0 X

Non mi sono neppure accorto di aver sbagliato qui:

public getdirList($stream = FALSE) {

metti così:

public function getdirList($stream = FALSE) {
risposto 7 anni fa
Mario Santagiuliana
X 0 X

Non mi sono neppure accorto di aver sbagliato qui:

public getdirList($stream = FALSE) {

metti così:

public function getdirList($stream = FALSE) {

si l'avevo già corretto perchè mi dava errore ;)

anche con questa correzione comunque ricevo errore  :(

risposto 7 anni fa
Newbie
X 0 X

Ho provato a rimediare agli errori che mi dava ma proprio non ne vuol sapere, soprattutto online, dove continua a darmi quell'errore relativo alla variabile dichiarata:

public $directory = "folder/";

Sul server web non locale che versione di php hanno? E che errore esattamente ti riportano...

P.S. riporta gli errori esatti e magari anche il codice del file...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ho provato a rimediare agli errori che mi dava ma proprio non ne vuol sapere, soprattutto online, dove continua a darmi quell'errore relativo alla variabile dichiarata:

public $directory = "folder/";

Sul server web non locale che versione di php hanno? E che errore esattamente ti riportano...

P.S. riporta gli errori esatti e magari anche il codice del file...

Dunque, sul web host la versione installata di php risulta essere la 4.4.9

Ecco l'errore che mi dà:

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'

a questa linea: public $directory = "folder/";

del file complessivo:

/* classe gestione files */

class MyFiles {

   // membri
   public $directory = "folder/";

   //costruttore 
    //in questo modo se un utente vuole iniziare l'oggetto con un altra directory lo può fare
   public function __contruct($folder = FALSE) {
      if($folder)
         $this->directory = $folder;
   }

    //creo un metodo per avere l'elenco dei file della directory specificata
   public function getdirList($stream = FALSE) {
      if($stream) {
         $cartella = $stream;
      }else{
         $cartella = $this->directory;
      }
      if(is_dir($cartella)) {
         if($handle = opendir($cartella)) {
            while($file = readdir($handle)) { //<----attenzione qui che devi indicare la cartella aperta!!!
               echo $file;
            }
         } else {
                       echo $cartella." non è una cartella";
         }
        closedir($handle); //<----devi sempre indicare l'handle per chiudere la cartella aperta
      }

   //distruttore


}


$list = new MyFiles("cover/");
risposto 7 anni fa
Newbie
X 0 X

Prova a scriverla così:

var $directory = "folder/";

e poi anche così:

public var $directory = "folder/";
risposto 7 anni fa
Mario Santagiuliana
X 0 X

ok, ho provato con

var $directory = "folder/";

e mi ha dato errore alla funzione getdirList();

ho quindi eliminato public e mi ha dato errore all'altro public eliminando anche questo ho creato l'istanza dell'oggetto e richiamato la funzione che esegue il suo compito correttamente.

Tuttavia avrei ora un pò di domande da porti, ringraziandoti anticipatamente per il tempo che mi hai dedicato:

  • come mai ho dovuto utilizzare var invece del semplice nome del membro?
  • Perchè impostando l'attributo public ai metodi e ai membri mi restituisce un errore?

e infine una domanda al codice che hai strutturato tu stesso:

attraverso il metodo magico __construct, $this->directory, assume il valore attribuitogli alla creazione dell'istanza, e fin qui ci sono.Tuttavia ciò che non capisco è il senso di cio'..

Mi spiego meglio: io potrei passare (come faccio) il valore stringa che voglio alla funzione getdirList in questo modo:

echo $list->getdirList("cover1/");

in un certo senso la variabile $directory è quindi inutile?... :(

risposto 7 anni fa
Newbie
X 0 X

Php 4 e php 5 hanno due sintassi differenti per quanto concerne la scrittura delle classi.

Il php 5 introduce realmente la programmazione ad oggetti.

(finchè hai scritto te stavo giusto rispondendoti per dirti di eliminare gli altri public)

Per la seconda domanda, in un certo senso hai anche ragione, ho messo così in modo tale da farti vedere un po' come possono funzionare le cose.

Come ho creato la funzione però ti da il vantaggio di istanziare un oggetto e di utilizzare la sua funzione interna(getdirList) per vedere il contenuto di una directory senza che questa venga specificata nel costruttore o impostata...cioè usare semplicemente la funzione come una normale funzione in php...non so se mi sono spiegato...

Poi puoi cambiare le cose come preferisci  ;)

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Ok, capito tutto perfettamente. Ti ringrazio, come già detto, per il tempo dedicatomi, e per le delucidazioni che mi ha dato ;)

 :bye: :bye:

risposto 7 anni fa
Newbie
X 0 X

ciao, altervista ha php4 di default, dovresti andare sul file manager del tuo panello di controllo e cliccare su quel ingranaggio e dopo impostare php5 di default e vedi se ti funziona,

anche io avevo quel problema e poi lo risolto mettendo php5.

risposto 7 anni fa
luigi
X 0 X

ciao, altervista ha php4 di default, dovresti andare sul file manager del tuo panello di controllo e cliccare su quel ingranaggio e dopo impostare php5 di default e vedi se ti funziona,

anche io avevo quel problema e poi lo risolto mettendo php5.

Ti ringrazio per avermi fatto notare questa possibilità, non ci avevo mai fatto caso  :P  :-[

Con gli attributi public funziona perfettamente ora, anche definendo il membro come nella programmazione procedurale funziona correttamente  ;)

Grazie per il consiglio!!

 :bye:

risposto 7 anni fa
Newbie
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda