Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56

    Evitare cicli infiniti con l'incapsulamento

    Se ad esempio devo istanziare Titanic e Leonardo Di Caprio, e gli attributi $protagonist e $best_film, sono rispettivamente delle istanze di Actor e Film, in fase di creazione degli oggetti mi trovo in un loop infinito.

    C'è un pattern per evitare queste situazioni?

    Codice PHP:
    class Film
    {
      private 
    $title;
      private 
    $year;
      private 
    $protagonist;
    }

    class 
    Actor
    {
      private 
    $name;
      private 
    $surname;
      private 
    $best_film;

    Ultima modifica di iJoker; 27-01-2014 a 02:40

  2. #2
    Di cosa stiamo parlando? Quale loop
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    per motivi di sintesi avevo tralasciato le funzioni di creazione delle istanze, adesso le ho messe.

    Codice PHP:
    class Film
    {
      private 
    $title;
      private 
    $year;
      private 
    $protagonist// ISTANZA DELLA CLASSE ACTOR

      
    public static function createById($id)
      {
        
    $film = new Film();
        
    $result mysql_query("SELECT * FROM film WHERE id=".$id;);
        
    $row mysql_fetch_row($result)
        
    $film->title $row['title'];
        
    $film->year $row['year'];
        
    $this->protagonist Actor::createById($row['id_protagonist']);
        return 
    $film;
      }
    }

    class 
    Actor
    {
      private 
    $name;
      private 
    $surname;
      private 
    $best_film// ISTANZA DELLA CLASSE FILM

      
    public static function createById($id)
      {
        
    $actor = new Actor();
        
    $result mysql_query("SELECT * FROM actor WHERE id=".$id;);
        
    $row mysql_fetch_row($result)
        
    $actor->name $row['name'];
        
    $actor->surname $row['surname'];
        
    $actor->best_film Film::createById($row['id_best_film']);
        return 
    $actor;
      }

    Ultima modifica di iJoker; 27-01-2014 a 02:51

  4. #4
    Se fai in modo che Actor e Film si ricordino le istanze che creano, allora puoi interrompere la ricorsione, altrimenti non puoi o altrimenti togli il load dell'utente da Film
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    Se io invece nel film salvo solamente l'id dell'attore può essere una buona soluzione?
    In questo modo però non ci sarebbero oggetti incapsulati in altri oggetti.

  6. #6
    Quote Originariamente inviata da iJoker Visualizza il messaggio
    Se io invece nel film salvo solamente l'id dell'attore può essere una buona soluzione?
    In questo modo però non ci sarebbero oggetti incapsulati in altri oggetti.
    Potresti usare un Laxy Load, ovvero carichi l'utente in Film solo quando in film richiami il metodo getActor, viceversa in Actor. Cmq te lo dico pure a te: se stai facendo questa cosa per studio, va bene (anche se ad occhio dovresti studiare un bel pò di teoria), se stai facendo un qualcosa di lavoro evita e usa una framework già pronto per gestire la persistenza (Doctrine? chi ha detto Doctrine? io dico Doctrine ). Sopratutto quei metodi statici, per me, sono una pugnalata al cuore con tanto di ravanata di coltello, usa classi repository esterne per istanziare oggetti Film e Actor, che risulteranno semplici oggetti con solo getter e setter
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    ciao!
    mi intrometto un attimo perchè vedo che spesso citi Doctrine.
    nello specifico parli di Database Abstraction Layer o Object Relational Mapper?

  8. #8
    Moderatore di Javascript L'avatar di ciro78
    Registrato dal
    Sep 2000
    residenza
    Napoli
    Messaggi
    8,505
    la seconda. sia doctrine che propel sono orm
    Ciro Marotta - Programmatore JAVA - PHP
    Preferisco un fallimento alle mie condizioni che un successo alle condizioni altrui.


  9. #9
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ciao!
    mi intrometto un attimo perchè vedo che spesso citi Doctrine.
    nello specifico parli di Database Abstraction Layer o Object Relational Mapper?
    Doctrine (propel non lo conosco ma penso che sia lo stesso) fornisce api per entrambi i livelli, quindi dipende che ti serve. In alcuni progetti uso direttamente l'orm, in qualcosa di piu semplice mi è bastato solo il dbal. nel caso specifico jocker sta facendo un orm
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  10. #10
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    Doctrine (propel non lo conosco ma penso che sia lo stesso) fornisce api per entrambi i livelli, quindi dipende che ti serve. In alcuni progetti uso direttamente l'orm, in qualcosa di piu semplice mi è bastato solo il dbal. nel caso specifico jocker sta facendo un orm
    ok grazie per il chiarimento!

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.