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

    Far interagire i metodi di due classi senza extends

    Sto creando un sito utilizzando esclusivamente la programmazione a oggetti. E' la prima volta che ne faccio uso e non posso definirmi di certo "esperto", anche se ho fatto diverso studio teorico prima di buttarmi nell'impresa

    Il mio problema, a concetto, è semplice (la risoluzione per me un po' meno). Ho due classi:
    - function: contiene funzioni generali del sito come formattazione testo, escape, controlli vari, ecc.
    - db: dedita alla connessione al database, update, insert, ecc.

    Ho bisogno che le due classi interagiscano tra loro, cioè che function prenda metodi di db e anche viceversa.
    Vorrei evitare l'uso di extends: visto che una classe può ereditare una sola altra classe, poi mi negherei la possibilità di estendere altre classi (e inoltre function sarà richiamata praticamente da ogni classe: non ha senso fare l'estensione per tutte).

    L'unico metodo che mi viene in mente è di stanziare l'oggetto $function in ogni classe: però mi sembra un po' laborioso, non c'è un sistema più semplice per renderlo "globale"?
    In secondo luogo, per far interagire function e db devo inizializzare l'oggetto $function in db e l'oggetto $db in function, oppure c'è un altro sistema?

    Grazie

  2. #2
    Codice PHP:
    class function {

      private 
    $db;

      public function 
    __constructdb $db ) {
        
    $this->db $db;
      }


    non credo che tu possa creare una classe che si chiama "function" ma comunque puoi passare l'oggetto db nel costruttore della tua classe function.

    Quali sarebbero i metodi che servono a db presenti su function??
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Originariamente inviato da Al_katraz984
    Codice PHP:
    class function {

      private 
    $db;

      public function 
    __constructdb $db ) {
        
    $this->db $db;
      }


    non credo che tu possa creare una classe che si chiama "function" ma comunque puoi passare l'oggetto db nel costruttore della tua classe function.

    Quali sarebbero i metodi che servono a db presenti su function??

    Function è solo un nome d'esempio per abbreviare qui nel forum (la mia classe l'ho chiamata general_function).

    In function ho creato un metodo per stampare a video gli errori provenienti da db in formato "gradevole". Avrei potuto creare quel metodo direttamente all'interno della classe del db, ma il concetto mi servirà comunque per classi future.

    Ho provato a far passare il costruttore, ma credo di aver sbagliato il richiamo. L'errore ritornato è:
    "Catchable fatal error: Argument 1 passed to general_function::__construct() must be an instance of db, instance of database_conn given"

    Questo è come l'ho inizializzato:
    codice:
    $db=new database_conn(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
    $_function=new general_function($db);
    La classe della funzione invece l'ho creata esattamente come nel tuo esempio.

  4. #4
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    da
    Codice PHP:
    public function __constructdb $db ) { 
    a
    Codice PHP:
    public function __constructdatabase_conn $db ) { 
    vedere http://php.net/manual/en/language.oop5.typehinting.php

    L'unico metodo che mi viene in mente è di stanziare l'oggetto $function in ogni classe: però mi sembra un po' laborioso, non c'è un sistema più semplice per renderlo "globale"?
    se mi dici 'globale', la prima cosa che mi viene in mente è singleton

  5. #5
    Colpa mia, errore di distrazione da dilettante

    Funziona perfettamente.
    Grazie a entrambi per l'aiuto e per i link, davvero utili (di singleton non avevo mai sentito parlare prima d'ora)

  6. #6
    per quanto riguarda il typehinting vedi la risposta di .Kurt

    Originariamente inviato da Vincent_E
    In function ho creato un metodo per stampare a video gli errori provenienti da db in formato "gradevole". Avrei potuto creare quel metodo direttamente all'interno della classe del db, ma il concetto mi servirà comunque per classi future.
    se vuoi progettare tutto ad oggetti una classe chiamata "general_function" non la vedo molto bene.. è preferibile avere classi separate per gestire le relative funzioni.
    Ad esempio per l'errore del database:

    ho una classe generica che mi formata un messaggio in modo particolare
    Codice PHP:
    class cuteMsg {

      private 
    $msg;

      public function 
    __construct$msg ) {
        
    $this->msg $msg;
      }

      public function 
    cuteMessage() {
        return 
    '<p class="cute">' $this->msg '</p>';
      }

    ora sulla classe db puoi fare in due modi, o ritorni il messaggio di errore puro e semplice o ritorni il messaggio di errore "carino":
    Codice PHP:
    // tua classe db

      
    public function getRawMessage() {
        return 
    $this->errMessage;
      }

      public function 
    getCuteMessage() {
        
    $msg = new cuteMsg$this->errMessage );
        return 
    $msg->cuteMessage()
      } 
    in questo modo la classe db si serve/usa della classe cuteMsg per ritornare l'errore in maniera piu carina.
    Da notare il fatto che la classe db e la classe cuteMsg non hanno niente in comune e si occupano di cose totalmente diverse.
    db usa la classe cuteMsg solo in quel metodo per quella determinata funzione quindi possiamo dire che cuteMsg esiste solo se è necessario avere il messaggio di errore formattato in un certo modo.

    Diversamente dall'esempio precedente in cui db esiste all'interno dell'intera classe function e può essere disponibile in qualsiasi metodo della classe..
    Codice PHP:
    class function {

      private 
    $db;

      public function 
    __constructdb $db ) {
        
    $this->db $db;
      }

      public function 
    toArray() {
        
    // qui posso usare db
        
    return $this->db->fetchArray();
      }

      public function 
    toObject() {
        
    // anche qui posso usare db
        
    return $this->db->fetchObject();
      }

    si potrebbe parlare per ore di questo argomento, intanto ti puoi interessare di aggregation, composition e inheritance..
    Qui c'è qualcosa
    http://php.net/manual/en/language.oop5.inheritance.php
    http://www.devshed.com/c/a/PHP/Objec...o-Composition/
    http://en.wikipedia.org/wiki/Aggrega...29#Aggregation

    ecco
    Questa volta, più che un voto.. è favoreggiamento.

  7. #7
    Un sacco di materiale utile, ottimi link!

    In pratica mi stai consigliando di creare una classe per ogni "tipologia" di operazioni?
    La mia idea iniziale era di creare in "general_function" un metodo per ogni funzione, per esempio:
    - formattazione testo da stampare
    - controlli su permalink
    - formattazione di date
    ecc.

    Il tuo sistema è senz'altro più performante, però il mio dubbio è questo: le funzioni sopra (che in pratica saranno metodi di classe) sono piuttosto comuni e saranno usate spesso nel sito.
    Se utilizzo classi diverse per ognuna, dovrò inizializzare diversi oggetti di classe in ogni pagina e passarle ogni volta come parametri ai costruttori... non diventa troppo laborioso?

    Per quanto riguarda la funzione del db, invece, è fattibile così come hai mostrato nell'esempio, perché tanto il messaggio di errore è utilizzato esclusivamente nella classe del db e lo inizializzo solo per quello.

    PS: potrei fare tutto a funzioni vere e proprie, ma vorrei creare una struttura interamente a oggetti per poter in futuro "trasformare" il sito per altri linguaggi di programmazione (che in genere, per l'appunto, funzionano solo ed esclusivamente a oggetti). Il php resta il migliore, vista la libertà che dà: ma devo adattarlo di conseguenza per gli altri linguaggi

  8. #8
    Originariamente inviato da Vincent_E
    Il tuo sistema è senz'altro più performante, però il mio dubbio è questo: le funzioni sopra (che in pratica saranno metodi di classe) sono piuttosto comuni e saranno usate spesso nel sito.
    Se utilizzo classi diverse per ognuna, dovrò inizializzare diversi oggetti di classe in ogni pagina e passarle ogni volta come parametri ai costruttori... non diventa troppo laborioso?
    qui entra in campo il cervello.. se pianifichi prima le classi vedrai che le associazioni saranno molto limitate. Un buon esercizio è quello di ritagliare dei quadrati di carta e scriverci sopra il nome delle varie classi. Poi ti sistemi su un tavolo e

  9. #9
    Utente di HTML.it L'avatar di .Kurt
    Registrato dal
    Jul 2007
    Messaggi
    654
    In pratica mi stai consigliando di creare una classe per ogni "tipologia" di operazioni?
    solo se non vuoi violare il SRP

  10. #10
    Ok, grazie per i consigli, comincio a ragionarci sopra come si deve

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.