2015-11-16 7 views
5

Sto sviluppando uno strumento per un sito Web e ho trovato un problema strano, o meglio, una situazione strana.Variabili modificate dall'API TeamSpeak per PHP

Sto usando il codice qui sotto per recuperare i dati dal server TeamSpeak. Io uso queste informazioni per costruire un profilo su un utente.

$ts3 = TeamSpeak3::factory("serverquery://dadada:[email protected]:1234/"); 
// Get the clients list 
$a=$ts3->clientList(); 
// Get the groups list 
$b=$ts3->ServerGroupList(); 
// Get the channels list 
$c=$ts3->channelList(); 

Ora, la situazione strana è che l'uscita di questo blocco di codice:

// Get the clients list 
$a=$ts3->clientList(); 
// Get the groups list 
$b=$ts3->ServerGroupList(); 
// Get the channels list 
$c=$ts3->channelList(); 
echo "<pre>";print_r($a);die(); 

(Si noti la print_r)
è totalmente diverso da quello di uscita di questo blocco di codice:

// Get the clients list 
$a=$ts3->clientList(); 
// Get the groups list 
#$b=$ts3->ServerGroupList(); 
// Get the channels list 
#$c=$ts3->channelList(); 
echo "<pre>";print_r($a);die(); 

Ciò che intendo sono le funzioni che chiamo dopo clientList() (che fuori metto I in memoria nella variabile $a) stiamo cambiando i contenuti di quella variabile. Cioè, stanno accodando il loro output alla variabile.

Non ho mai imparato PHP in modo professionale, lo sto solo provando ... Mi manca qualcosa di questo linguaggio che giustifica questo comportamento? Se lo sono, cosa posso fare per fermarlo?

Grazie a tutti.

+0

Hai ancora problemi? – naurel

+0

Sì. Non è qualcosa di cui ho veramente bisogno, cioè posso pensare a qualcos'altro che risolverà il mio problema, ma mi piacerebbe davvero capire cosa sta succedendo qui. –

+0

Appena testato e scoperto che ho lo stesso problema. Ho usato questa API per un po 'ed è la prima volta che la vedo. Lo esaminerò. – naurel

risposta

1

Stai vedendo parti dell ' "oggetto" in Object Oriented Programming

$ts3 rappresenta un oggetto che contiene tutte le informazioni necessarie, insieme ad alcuni metodi (o funzioni) che consentono di ottenere i dati dall'oggetto. Alcuni di questi metodi faranno cose diverse all'oggetto stesso, al fine di recuperare i dati aggiuntivi necessari per una particolare chiamata di metodo.

Si consideri il seguente semplice oggetto:

  • Bike
    • colore
    • ingranaggi
    • funzione __construct ($ colore, $ ingranaggi)
    • this.color = $color; this.gears = $gears
    • aggiornamento function()
    • this.headlight = true; this.gears = 10;

Ora, quando si crea prima di esso, ha solo due proprietà:

$myBike = new Bike('red',5); 
// $myBike.color = 'red'; 
// $myBike.gears = 5; 

... ma una volta che si esegue l'aggiornamento, le proprietà sono cambiate, e sono aggiunti di nuovi.

$myBike->upgrade(); 
// $myBike.color = 'red'; 
// $myBike.gears = 10; 
// $myBike.headlight = true; 

Gli oggetti di solito passano dei riferimenti anziché copiare i dati, al fine di risparmiare memoria.

... ma se si desidera assicurarsi che si stia ottenendo una copia che non cambierà (ovvero non utilizza riferimenti di dati all'oggetto $ts3), clonare la variabile.

$a = clone($ts3->clientList()); 

Attenzione, questo raddoppierà efficacemente l'utilizzo di memoria e processore per quella variabile.

+0

Credo che tu abbia ragione, e questo è davvero il caso. Lo metterò alla prova quando avrò il tempo, per essere sicuro. Grazie :) –