Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    variabile static di classe viene azzerata ogni volta che includo la classe

    Salve a tutti,

    vorrei fare in modo che includendo una classe con una require, si avvii del codice in automatico (nello spazio globale) che instanzi un oggetto, ma solo la prima volta che la si include.

    Ho pensato allora di creare una variabile public static counter impostata a 0 e fare un controllo del genere:


    codice:
    //file: Controller.php
    
    class Controller(){
    
    ...
    }
    
    //SPAZIO GLOBALE
     if (Controller::$counter == 0){
            echo (Controller::$counter);
            $controller = new Controller();
        }
            
            Controller::$counter++;
            echo (Controller::$counter);
            $controller->start();
            $controller->parseURL();

    Tuttavia, ogni volta che richiamo una pagina mi stampa sempre 0 e poi 1. Devo dedurre che la variabile static venga azzerata ogni volta? Se il codice fosse corretto, vorrebbe dire che ogni volta, tra una require e l'altra si perdono i dati della classe...

    Come posso risolvere?
    Ultima modifica di the_indios; 29-01-2020 a 10:24

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Guardati il sesign pattern Singleton, è quello che fa al caso tuo.

    Qui una guida: https://it.phptherightway.com/pages/...-Patterns.html

  3. #3
    Sì, lo conosco, tuttavia mi hanno sconsigliato di usarlo per un controller che funge anche da router (non ho capito bene il perché)

    Ancora una domanda:

    dopo una redirect, le informazioni sulle variabili SUPERGLOBALI vengono perse?

    E se sì, come si può ovviare a questo? devo usare variabili di sessione o esistono altri modi?

  4. #4
    A quanto pare, anche se usassi la singleton non mi funzionerebbe, credo.

    Normalmente con un campo static di classe dovrei poter salvare i dati tra le varie chiamate del controller, perché se resto nello stesso scope della classe Controller, indipendentemente dai nuovi oggetti che instanzio, questi avranno tutti il campo static in comune, invece a me si perde.

    Il perché dovrebbe dipendere dal fatto che il controller richiama delle viste (che includono nuovamente il controller con una require_once) e quindi credo che a quel punto non siamo più nello stesso ambito definito in precedenza, quindi quando si crea un nuovo oggetto lo si crea all'interno di quello script php della view.

    Sempre se non vado errato, potete confermare?

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    dopo una redirect, le informazioni sulle variabili SUPERGLOBALI vengono perse?

    E se sì, come si può ovviare a questo? devo usare variabili di sessione o esistono altri modi?
    Intanto ti rispondo alla prima parte.

    Le superglobal le puoi usare ma hanno una loro funzione specifica, e sono disponibili solo in alcuni momenti (Se per esempio passi dei dati tramite una chiamata post, li ritroverai nella superglobal $_POST).

    In generale per passare delle variabili ad altri script puoi usare:

    - i metodi get e post
    - le sessioni e quindi le variabili di sessione
    - una persistenza come ad esempio il database o un cookie

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Vado un po' ad intuito perché non vedendo il codice non ho capito come è organizzato, ma da quello che dici sembra che:

    - il tuo controller viene istanziato e all'interno ha delle variabili con dei dati
    - il tuo controller richiama delle viste e queste viste richiamano a loro volta il controller
    - a questo punto ti ritrovi varie istanze del tuo controller, in cui le variabili non hanno più lo stesso contenuto

    Ci sono arrivato vicino?

  7. #7
    Scusami intendevo le $GLOBALS['nomevar']... usavo queste, ma ad ogni redirect si azzeravano.


    Quanto al resto, sì ci sei andato vicino. Praticamente:

    tutto parte dalle viste... le viste per essere popolate con i dati includono (require_once) il Controller come prima cosa. Il controller è autoavviante, ovvero una volta incluso, istanzia un suo esemplare, parsifica l'url e fa tutte le varie operazioni.

    Praticamente, io non uso l'index.php, (ovvero l'unico punto d'accesso a cui rimanda OGNI vista) che instanzia gli oggetti del controller, e questo, se ho ben capito, mi impedisce di avere delle variabili statiche condivise tra gli oggetti, perché nel mio caso l'instanziazione degli oggetti dei controllers è come se avvenisse in script separati (quelli delle viste), quindi scope diversi.

    Diciamo che il mio è solo un formalismo per rispettare l'MVC, anche se di fatto, non lo è propriamente (le viste non dovrebbero avere chiamate ai controllers). Diciamo che l'intento iniziale era quello di non instanziare neppure nella classe Controller un oggetto controller, ma far partire un metodo che istanziasse gli altri controllers specifici e avviasse il parsing dell'url.

    Non sapevo come fare un routing basato sull'url (url rewriting) e allora ho fatto in questo modo.
    Ultima modifica di the_indios; 29-01-2020 a 16:06

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2016
    Messaggi
    783
    Per quanto riguarda $GLOBALS dimenticati che esista, usare variabili globali nel 99% dei casi ti porta ad avere codice incasinato, imprevedibile e difficilmente debuggabile. Usare variabili globali è considerata una bad practice da evitare sempre.

    Probabilmente il tuo codice è un po' strutturato male, solitamente dovresti avere:

    Un router che in base all'url che richiedi ti richiama un controller e tale controller richiama la vista passandole dei dati.

    Nel tuo caso invece sembri partire dalle vista, e quindi dalla fine della catena, inoltre hai dei problemi a passarti i dati tra i vari oggetti e vorresti usare delle variabili globali, ma come ho già detto non devi. Per risolvere questi due problemi dovresti:

    - Leggerti bene come funziona il paradigma mvc e magari dare un'occhiata a come sono strutturati framework tipo Symfony e Laravel, all'inizio ti sembrerà un gran casino ma secondo me è un ottimo modo per capire i flussi di mvc e come model view e controller devono rimanere separati tra loro.

    - Per passare i dati tra i vari oggetti che compongono la tua app usa la dependency injection, in rete trovi tutto quello che ti serve per capire cosa è e come implementarla.

    Scusa se ti do dei consigli molto generici, ma per fare diversamente dovrei poter vedere il codice, se riesci a metterlo su github vedo di essere più specifico.
    In ogni caso spero di esserti stato utile, e ovviamente se hai bisogno di una mano chiedi pure.

  9. #9
    Per dependency injection intendi il passaggio di un oggetto nel costruttore/funzione di un altro?

    Per quanto riguarda il routing vorrei evitare l'url rewriting... come faccio ad analizzare l'url? dovrei sempre partire da una index.php che instanzia il controller generico, giusto?

    Sì, appena posso ti invio il codice, grazie. Diciamo che non ho molto tempo per sistemare il codice, quindi vorrei evitare delle modifiche molto invasive...

  10. #10
    Ok, non bisogna partire dalle viste, ma a quel punto ci vorrebbe qualcosa che stia sempre in ascolto degli URL che digita l'utente.

    Al momento l'unica soluzione che conosco è quella di reindirizzare ogni richiesta alla index trasformando i link con l'url rewriting, ad esempio se l'url è

    root/post/viewname.php/?actionname&id=...
    apache dovrebbe tradurmelo in
    index.php?route=post/actionname&id=

    Ci sono altre possibili soluzioni? Sono sempre basate su una classe che fa la traduzione che fa apache oppure esiste anche altro?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.