2015-11-16 4 views
5

Я разрабатываю инструмент для веб-сайта, и у меня возникла странная проблема или, что еще лучше, странная ситуация.Переменные изменяются с помощью TeamSpeak API для PHP

Я использую следующий код для извлечения данных с сервера TeamSpeak. Я использую эту информацию для создания профиля для пользователя.

$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(); 

Теперь нечетная ситуация такова, что выход этого блока кода:

// 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(); 

(Обратите внимание на print_r)
полностью отличаются от выхода этого блока кода:

// 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(); 

Что я имею в виду, функции, которые я вызываю после clientList() (что поместить я в переменную $a) меняют содержимое этой переменной. Это то, что они вроде добавляют свой вывод к переменной.

Я никогда не изучал PHP профессионально, я просто пытаюсь это сделать ... Я что-то пропустил об этом языке, который оправдывает это поведение? Если да, то что я могу сделать, чтобы остановить это?

Спасибо всем.

+0

У вас остались проблемы? – naurel

+0

Да. Это не то, что мне действительно нужно, т. Е. Я могу думать о чем-то еще, что решит мою проблему, но я бы очень хотел понять, что здесь происходит. –

+0

Просто протестирован и выяснил, что у меня такая же проблема. Я использовал этот API некоторое время, и это первый раз, когда я его использую. Я посмотрю. – naurel

ответ

1

Вы видите части «Объект» в объектно-ориентированном программировании

$ts3 представляет собой объект, содержащий всю необходимую информацию, а также некоторые методы (или функцию), которые позволяют получить данные из объекта. Некоторые из этих методов будут делать разные вещи самому объекту, чтобы получить дополнительные данные, необходимые для конкретного вызова метода.

Рассмотрим следующий простой объект:

  • велосипед
    • цвет
    • шестерни
    • функция __construct ($ цвета, шестерни $)
    • this.color = $color; this.gears = $gears
    • обновления функции()
    • this.headlight = true; this.gears = 10;

Теперь, когда вы сначала создать его, он имеет только два свойства:

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

... но после обновления, свойства изменились, а новые добавляются.

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

Объекты обычно передают ссылки, а не копируют данные, чтобы сохранить память.

... но если вы хотите убедиться, что получаете копию, которая не изменится (т. Е. Не использует ссылки на данные объекта $ts3), клонируйте переменную.

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

Будьте осторожны, это позволит эффективно удвоить использование памяти и процессора для этой переменной.

+0

Я считаю, что вы правы, и это действительно так. Я проверю это, когда найду время, чтобы убедиться. Благодаря :) –