Visualizzazione dei risultati da 1 a 4 su 4

Discussione: PHP e OOP

  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606

    PHP e OOP

    Ciao.
    Allora: dopo la "disavventura" con le classi dell'altro giorno mi sono messo ad approfondire la mia conoscienza delle stesse nella loro implementazione all'interno del PHP. Versione 7.4
    Mi sono creato una semplicissima funzione di autoloading ed ho iniziato a creare alcuni file contenenti delle classi di esempio...
    Codice PHP:
    spl_autoload_register( function( $className )
    {
           include ( 
    REAL_PATH '/bin/class/' $className '.class.php' );
    }); 
    dove il filesystem del "sito" è composto in questo modo:
    • ROOT del sito
    • ROOT/bin per file generici ( qui ci sta il file chiamato autoload.inc.php )
    • ROOT/bin/class qui ci stanno i file con le classi

    In ROOT c'è il classico index.php che richiama per prima cosa il file autoload.inc.php che all'interno ha solo quella funzione di cui ho inserito il codice qui sopra.
    Bene creando dei file di prova: a.class.php, b.class.php, c.class.php tutto funziona.
    Posso richiamare tranquillamente da index.php le classi a(), b() e c(), bene, ora però mi sorge un dubbio, se volessi espandere c(), ad esempio:
    c.class.php
    Codice PHP:
    class c
    {}
    class 
    cc explands c
    {} 
    Dove inserisco cc(); in un file separato no perché non mi trova la classe da espandere ( ci ho già provato ) ne dentro c.class.php come nell'esempio sopra, perché mi dice che non trova il file cc.class.php
    Insomma una cane che si morde la coda e non so come procedere.

  2. #2
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    EDIT: tutti gli esempi di codice, con spiegazione, che ho trovato, riportano di implementare una classe in un altra, solo dopo l'autoload, e nello stesso file che lo richiama.
    In pratica:
    Codice PHP:
    require( 'autoload.php' );

    class 
    cc extends c
    {
    ...

    Se faccio così funziona, perché autoload va a cercare le semplici classi come sono state definite prima. Ma lo trovo poco pratico, soprattutto se si devono implementare più classi, come nel caso usassi un pattern di tipo Factory ad esempio. ( Che poi era l'idea iniziale che mi ha portato a questo casino ).

  3. #3
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Edito ancora:
    c'è una nota in php.net relativa a spl_autload_call() che seppur non è specifica per il mio problema, mi da qualche idea su come risolvere.
    https://www.php.net/manual/en/functi...all.php#102202
    In pratica, al di là dell'esempio specifico, si nota come l'autore crea tre file, uno con la classe figlio che estende la classe padre.
    Uno con la sola classe padre e infine uno di autload, da questo richiama tramite la spl_autoload_call() la sola classe figlio, e funziona.
    Funziona perché dice nelle note, che la *_call() si va a cercare anche la classe padre.
    Poi si genera un errore perché nell'esempio, viene chiamata due volte la classe padre, ma questo è l'esempio, a me interessa la prima parte.
    Ora mi chiedo, e se invece di usare la spl_autoload_register(), uso la spl_autoload_call() che succederebbe? Funziona?
    Non credo però, perché non tutte le classi che ho creato vengono estese, e quella padre estesa dalla figlia non va chiamata direttamente.
    Insomma, ancora un casino.

  4. #4
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    Posso dire parolacce? No? Ok la penso
    Scoperto l'arcano.
    In pratica cancellate tutto quello che ho scritto fino a qui; o quasi.
    Prendete il primo post, ricreate la struttura, compreso il file cc che estende c, passatelo all'autoloading e funziona benissimo!
    L'errore che mi ha fatto perdere la giornata? Semplice, nella realtà avevo chiamato un file search.class.php e al suo interno la classe searching{} ma nessun problema, tutto funzionava a dovere.
    Poi, questa mattina volevo estendere la classe, nel senso che volevo far emettere il risultato della ricerca da una classe ad essa collegata ( estesa ) ed ho creato il file searchresult.class.php che esporta la classe omonima, la quale a sua volta estende la searching!
    Bel casino!
    In pratica avendo scritto in modo diverso il nome del primo file rispetto al nome della classe, non riusciva ad associare la classe da estendere nel secondo file, e mi ha mandato letteralmente ai pazzi fino a quando mi sono accorto del nome del file errato.
    Ho chiamato il file come la classe, e tutto è andato a posto.
    Deduzione:
    prima di tutto mettere gli occhiali poi rileggersi i nomi dei file associati alle classi, non è detto che se una cosa funziona è giusta.
    E' bastato un nome di file diverso dal nome della classe per mandare tutto a remengo, con report di errori fuorvianti ( peggio del System Error nr. 5 del commodore 64 ).
    Ho anche notato un altro problema sottile, che però sulle macchine che devo usare non si verificherà mai, almeno per ora cioè i nomi dei file io li scrivo in minuscolo, mentre per i nomi delle classi uso il CamelCase... in windows non succede nulla, ma provate a usare Linux...
    Va bene alla fine, spero che tutto questo casino che ho fatto qui, serva a qualcun 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 © 2025 vBulletin Solutions, Inc. All rights reserved.