2012-04-24 2 views
1

Я preocedural программист и не знаю много об объектах.Как только вернуть массив из этого класса?

У меня есть следующий класс (нашел его на SO)

class MultiCurl 
{ 
    private $allToDo; 
    private $multiHandle; 
    private $maxConcurrent = 20; 
    private $currentIndex = 0; 
    private $info   = array(); 
    private $options  = array(CURLOPT_RETURNTRANSFER => true, 
            CURLOPT_FOLLOWLOCATION => true, 
            CURLOPT_MAXREDIRS  => 1, 
            CURLOPT_TIMEOUT  => 3); 

    public function __construct($todo, $concurrent) 
    { 
     $this->allToDo = $todo; 
     $this->maxConcurrent = $concurrent; 
     $this->multiHandle = curl_multi_init(); 
    } 

    public function process() 
    { 
     $running = 0; 
     do { 
      $this->_addHandles(min(array($this->maxConcurrent - $running, $this->_moreToDo()))); 
      while ($exec = curl_multi_exec($this->multiHandle, $running) === -1) { 
      } 
      curl_multi_select($this->multiHandle); 
      while ($multiInfo = curl_multi_info_read($this->multiHandle, $msgs)) { 
       $this->_showData($multiInfo); 
       curl_multi_remove_handle($this->multiHandle, $multiInfo['handle']); 
       curl_close($multiInfo['handle']); 
      } 
     } while ($running || $this->_moreTodo()); 
     return $this; 
    }  

    private function _addHandles($num) 
    { 
     while ($num-- > 0) { 
      $handle = curl_init($this->allToDo[$this->currentIndex]); 
      curl_setopt_array($handle, $this->options); 
      curl_multi_add_handle($this->multiHandle, $handle); 
      $this->info[$handle]['url'] = $this->allToDo[$this->currentIndex]; 
      $this->currentIndex++; 
     } 
    }   

    private function _moreToDo() 
    { 
     return count($this->allToDo) - $this->currentIndex; 
    } 

    private function _showData($multiInfo) 
    { 
     // $this->info[$multiInfo['handle']]['multi'] = $multiInfo; 
     $this->info[$multiInfo['handle']]['curl'] = curl_getinfo($multiInfo['handle']); 
     $this->info[$multiInfo['handle']]['content'] = curl_multi_getcontent($multiInfo['handle']); 
     return $this->info[$multiInfo['handle']]; 
    } 
} 

Когда я использую его:

$concurrent = 20; 
$mc = new MultiCurl($nodes, $concurrent); 
$output = $mc->process(); 
print_r($output); 

Я просто хочу его для вывода мульти-мерного массива всех ответов , и только то, что возвращает функция «_showData».

В настоящее время он возвращает кучу других вещей, как:

[allToDo:MultiCurl:private] => Array 
[multiHandle:MultiCurl:private] => Resource id #11 
[maxConcurrent:MultiCurl:private] => 20 
[currentIndex:MultiCurl:private] => 100 
[info:MultiCurl:private] => Array 

мне нужно только содержание "[информация: MultiCurl: частный]" массив

ответ

0

В методе процесса, вместо

return $this; 

использование

return $this->info; 
+0

Кажется, что это работает, однако массив начинается с 12. Его не очень большое дело. Просто интересно почему. –

0

Would print_r($output[info:MultiCurl:private]); работы?

И если ключи от $output массива всегда одинаковы, вы могли бы получить доступ к нему с

print_r($output[4]); 
2

добавить публичный метод класса «MultiCurl». например:

public function getInfo() { 
    return $this->info; 
} 

, если вы не хотите редактировать файл класса, расширять его и использовать.

Class MultiCurlWrapper extends MultiCurl { 
    public function getInfo() { 
     return $this->info; 
    } 
} 
+0

И после, я просто использую $ output = $ mc-> getInfo(); ? –

+0

Да, вот и все :) попробуйте – tosin

0

Я хотел бы добавить метод, чтобы получить то, что вам нужно, как текущая функция возвращает объект.

В простейшей форме;

public function getInfo() 
{ 
    return $this->info; 
} 
Смежные вопросы