Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56

    Sostituzione metodi magici __get e __set

    Volevo chiedervi qual'è il motivo percui si sostituiscono i metodi magici __get e __set invece di usare dei semplici get e set (senza il doppio underscore).

    Codice PHP:
    public function __get($k)
    {
      if(
    array_key_exists($k$this->data))
        return 
    $this->data[$k];
      return 
    NULL;
    }

    public function 
    __set($k$v)
    {
      if(
    array_key_exists($k, static::$types))
      {
        
    $this->data[$k] = $v;
        return 
    1;
      }
      return 
    NULL;

    Codice PHP:
    public function get($k)
    {
      if(
    array_key_exists($k$this->data))
        return 
    $this->data[$k];
      return 
    NULL;
    }

    public function 
    set($k$v)
    {
      if(
    array_key_exists($k, static::$types))
      {
        
    $this->data[$k] = $v;
        return 
    1;
      }
      return 
    NULL;


  2. #2
    Utente di HTML.it L'avatar di Webmaster76
    Registrato dal
    Mar 2001
    residenza
    Torino
    Messaggi
    298
    Semplice: __set() e __get() rendono accessibili proprietà che in altri modi non lo sono o non dovrebbero volutamente esserlo.

    Nel tuo esempio, se dichiarassi $data come "protected" il tuo array sarebbe accessibile proprio solo con quei metodi magici.

    Chiaro?

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    Mmm non mi è proprio chiaro perchè se io eseguo questo script mi stampa 'Titanic'.

    Codice PHP:
    class Film
    {
        protected 
    $data;

       public function 
    get($k)
        {
            return 
    $this->data[$k];
        }

       public function 
    set($k$v)
        {
            
    $this->data[$k] = $v;
        }
    }
    $film = new Film();
    $film->set('title''Titanic');
    echo 
    $film->get('title'); 

  4. #4
    bhe scusa ma get() è diverso da __get().
    i metodi magici hanno __ questo davanti al nome della funzione.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    eh si, ma non capisco perchè se usare i metodi magici se funziona anche con un metodo normale

  6. #6
    Utente di HTML.it L'avatar di Webmaster76
    Registrato dal
    Mar 2001
    residenza
    Torino
    Messaggi
    298
    Non in quel senso... cerco di spiegarmi meglio facendo un passo indietro:

    class MyClass {

    public function __get($name) {
    echo "Si è tentato di accedere alla proprietà " . $name . " ma non è disponibile";
    }

    public function __set($name, $value) {
    echo "Si è tentato di impostare la proprietà " . $name . " al valore " . $value;
    }

    }

    $obj1 = new MyClass();

    // stampa "Si è tentato di accedere alla proprietà "a" ma non è disponibile"
    echo $obj1->a;

    // stampa "Si è tentato di impostare la proprietà "a" al valore 10"
    $obj1->a = 10;

    Come vedi "a" non dovrebbe essere accessibile...
    Ultima modifica di Webmaster76; 04-03-2014 a 23:32

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    Ok grazie adesso mi è più chiaro il funzionamento. Mi resta solo da capire in quali situazioni pratiche convenga usarle.

  8. #8
    Utente di HTML.it L'avatar di Webmaster76
    Registrato dal
    Mar 2001
    residenza
    Torino
    Messaggi
    298
    Quote Originariamente inviata da iJoker Visualizza il messaggio
    Ok grazie adesso mi è più chiaro il funzionamento. Mi resta solo da capire in quali situazioni pratiche convenga usarle.
    E' molto comodo quando vuoi scrivere una cosa del tipo:

    $film->title = 'Titanic';

    e non vuoi o non puoi definire a priori le proprietà.

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    56
    Ok grazie! Adesso mi è tutto più chiaro!

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.