Mi piacerebbe riutilizzare più volte una funzionalità in una singola classe. Questa funzionalità si basa su una variabile privata:Come rendere privata una variabile in un tratto?
trait Address {
private $address;
public function getAddress() {
return $this->address;
}
public function setAddress($address) {
$this->address = $address;
}
}
L'unico modo che ho trovato per use the trait twice, è la seguente:
class User {
use Address {
getAddress as getHomeAddress;
setAddress as setHomeAddress;
getAddress as getWorkAddress;
setAddress as setWorkAddress;
}
}
Il problema è, in questo modo, la variabile privata $address
è condiviso attraverso i diversi metodi, e il codice non funzionerà come previsto:
$user = new User();
$user->setHomeAddress('21 Jump Street');
echo $user->getWorkAddress(); // 21 Jump Street
c'è una soluzione per utilizzare veramente il tratto due volte, pur non condividendo la sua pr ivate variables?
Anche se capisco che i tratti non sono * istanziati *, ero ancora in attesa del loro variabili private non essere visibile alla classe che li utilizzano, quindi, potenzialmente, consentendo di utilizzare più volte in una singola classe, con il metodo aliasing nomi. Sembra che mi sia sbagliato, quindi grazie per la tua risposta! – Benjamin
@Benjamin ogni classe che usa quel tratto avrà la sua istanza della variabile '$ address', ma sarà ovviamente visibile alla classe che lo usa, perché i tratti semplicemente aggiungono un certo comportamento alle classi. –
@Matteo Sì, mi sta diventando un po 'più chiaro nella mia testa ... Questo è diverso dall'eredità multipla, perché con l'ereditarietà la variabile sarebbe visibile solo nella superclasse, dove qui la variabile privata dal carattere è semplicemente "copiata" in la classe attuale. – Benjamin