Visualizzazione risultati 1 fino 11 di 11

Discussione: [OOP] Gestire scrittura/apertura/chiusura file txt

  1. #1
    Guest

    Predefinito [OOP] Gestire scrittura/apertura/chiusura file txt

    Hey!
    Ho creato questo script semplicissimo quanto sbagliato per gestire un file di testo.
    Codice PHP:
    <?php
    class txtDB
    {
    // apro
    function open($file,$tipo)
    {
    $var=fopen($file,$tipo);
    }
    // scrivo
    function scrivi($nuovo)
    {
    fwrite($this->$var, $nuovo);
    }
    // chiudo
    function chiudi()
    {
    fclose($this->$var);
    }
    }
    ?>

    <?php
    $class
    = new txtDB();
    $class->open('nome.txt','a+');
    $class->scrivi('maca \n');
    $class->chiudi();
    ?>
    Come ho detto è talmente sbagliato che non capisco dove sta l'errore :(
    Mi sono avvicinato da poco alla programmazione orientata agli oggetti ma mi trovo già in difficoltà.

    Non capisco come mai mi da questo errore:
    Citazione Originalmente inviato da erroraccio mi sa :(
    Notice: Undefined variable: var in C:\Program Files\EasyPHP 2.0b1\www\classi\index.php on line 12

    Fatal error: Cannot access empty property in C:\Program Files\EasyPHP 2.0b1\www\classi\index.php on line 12
    Grazie =)

  2. #2
    Guest

    Predefinito

    non sono neanch' io molto bravo con gli oggetti...

    però, vedendo quello che dice il browser, defi devinire var...
    prima delle funzioni, prova a fare così:
    Codice PHP:
    var $var;

  3. #3
    Guest

    Predefinito

    Uguale a prima ^_^

  4. #4
    Guest

    Predefinito

    ho riprovato, così va:
    Codice PHP:
    <?php
    class txtDB
    {
    var
    $var='';
    // apro
    function open($file,$tipo)
    {
    $this->var=fopen($file,$tipo);
    }
    // scrivo
    function scrivi($nuovo)
    {
    fwrite($this->var, $nuovo);
    }
    // chiudo
    function chiudi()
    {
    fclose($this->var);
    }
    }

    $class = new txtDB();
    $class->open('nome.txt','a+');
    $class->scrivi('maca \n');
    $class->chiudi();
    ?>
    però, se a te interessavano su righe diverse le scritte, non lo fa.

  5. #5
    Guest

    Predefinito

    Uhm... questo bisognerebbe risolverlo... come posso fare?
    Ultima modifica di comunitavirtuali : 20-01-2008 alle ore 12.10.25

  6. #6
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    occhio però che a questa classe manca un "senso", per ora Al momento è solo un modo diverso (e più scomodo) per scrivere chiamate a funzione.

    Se crei un oggetto, lo fai per cercare di raggruppare più informazioni sullo stato di una risorsa in un'unica scatola nera. Nel particolar caso, potresti continuare eliminando la funzione open() e spostandola nel costruttore, in modo che ogni istanza (oggetto) di questa classe rappresenti un unico file, oppure l'intero database, e quindi rendere invisibile l'apertura a livello di file, ma spostare il tutto a livello di "tabelle" (che poi la classe mappa su file).

    Tutte speculazioni, giuste per scriverle eh

    edit:
    per la stringa mi sembra un problema di apici. Quando metti una stringa fra apici singoli ( ' ... ' ) gli \n e compagnia non vengono espansi. Se non vuoi sbatterti a metterlo ogni volta però, basta che aggiungi un fwrite($this->var, "\n"); nel metodo scrivi().
    Ultima modifica di dreadnaut : 20-01-2008 alle ore 12.44.29

  7. #7
    Guest

    Predefinito

    :D okok
    era solo di prova questa :P

    Come posso risolvere comunque??

    Ps.: cosa intendi per "spostandola nel costruttore" ? come potrei passare il nome del file senza una funzione così?
    Ultima modifica di comunitavirtuali : 20-01-2008 alle ore 12.18.10

  8. #8
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    dipende tutto da quello che vuoi fare con la classe: deve rappresentare un file singolo, oppure un database?

    (come è adesso non è molto bella, perché se chiamo due volte apri() mi perdo completamente un file aperto!)

    File singolo:
    Codice PHP:
    class TextFile {
    var
    $file = false;

    function
    TextFile($nome)
    {
    if (!
    is_readable($nome) || !fopen($this->file, 'a+'))
    return
    false;
    }

    function
    scrivi($riga = "")
    {
    if (
    $this->file)
    {
    fwrite($this->file, $riga);
    fwrite($this->file, "\n");
    }
    }

    function
    chiudi()
    {
    if (
    $this->file)
    {
    fclose($this->file);
    $this->file = false;
    }
    }
    }
    se invece vuoi usarla per accedere a più file nello stesso modo:
    Codice PHP:
    class TextDB {
    var
    $dir;

    function
    TextDB($directory = './')
    {
    if (
    isdir($directory))
    $this->dir = $directory;
    else
    return
    false;
    }

    function
    apri($nome)
    {
    $nomefile = $this->dir . $nome;
    if (
    is_readable($nomefile) && ($f = fopen($nomefile)))
    return
    $f;
    return
    false;
    }

    function
    scrivi($file, $riga = "")
    {
    if (
    $file)
    {
    fwrite($file, $riga);
    fwrite($file, "\n");
    return
    true;
    }
    return
    false;
    }

    function
    chiudi($file)
    {
    if (
    $file)
    {
    fclose($file);
    $file = false;
    return
    true;
    }
    return
    false;
    }
    }

  9. #9
    Guest

    Predefinito

    Uhm... resta comunque il fatto che non mi va a capo con \n :(

    Come posso fare?

  10. #10
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    Citazione Originalmente inviato da comunitavirtuali Visualizza messaggio
    Uhm... resta comunque il fatto che non mi va a capo con \n :(
    mi fa piacere il tuo puro interesse per la programmazione
    hai letto il mio edit sopra assai riguardo alle virgolette?

    apici singoli -> niente conversione \n
    apici doppi -> conversione \n
    Ultima modifica di dreadnaut : 20-01-2008 alle ore 13.53.47

  11. #11
    Guest

    Predefinito

    XD grazie!

    Non avevo letto
    Ora funziona ;)
    Rifletterò sulle tue parole

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •