S
S
saniii2018-02-02 12:19:29
PHP
saniii, 2018-02-02 12:19:29

How to assign global variable in PHP class?

I use the cUrl wrapper class for my needs. So the problem is the following, you need to use a proxy, but the problem is that you need to specify the proxy assignment in each function where the request goes through curl, is it possible to do something like a global variable? class example below under the spoiler:

spoiler
<?php

/**
* 
*    Файл-обертка для библиотеки cURL
*
*/

class Curl 
{

  const FOLLOWLOCATION = true;
  const RETURNTRANSFER = true;
  const AUTOREFERER = true;
  const TIMEOUT = 30;
  const CONNECT_TIME = 30;

  public $user_agent = null;
  public $proxy;

  private $ch = null;
  private $url = null;	
  private $httpheaders = [];
  private $postparams = null;
  private $proxy_type = null;
  private $cookies = null;

  
  public function __construct() 
  {
    $this->ch = curl_init();
  }
    
  //	Функция POST/GET - запросов
  public function post($url, $postparams = []) 
  {
    $this->url = $url;	
    if (isset($postparams)) {	
      $this->postparams = $postparams;
    }		
    return $this->exec();
  }
  
  //	Заголовок запроса (!)
  public function addHttpheaders($headers)
  {
    foreach ($headers as $name => $value) {
      if ($name == 'POST') {
        $this->httpheaders[$name] = $name . ' ' . $value;
      } else {
        $this->httpheaders[$name] = $name . ': ' . $value;
      }
    }
  }

  //	Присваемваем USER-AGENT
  public function setUserAgent($user_agent = null)
  {
    $this->user_agent = $user_agent;
  }

  //	Подключение прокси (HTTPS/SOCKS5)
  public function setProxy($proxy_ip, $proxy_type = '')
  {
    $this->proxy = $proxy_ip;
    $this->proxy_type = $proxy_type;
  }

  //	Временное имя дsя cookie файла
  private function nameCookies($name = null)
  {
    for ($i=0; $i<10; ++$i)
            $name .= chr(rand(97, 122));
        return $name . '.temp';
  }

  //	Создание cookie файла
  public function setFileCookies()
  {
    $this->cookies = $this->nameCookies();
    file_put_contents($this->cookies, "");
  }

  //	Удаление cookie файла
  public function clearCookies()
  {
    unlink($this->cookies);
  }

  private function exec()
  {
    curl_setopt($this->ch, CURLOPT_URL, $this->url);
    curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION , self::FOLLOWLOCATION);
    curl_setopt($this->ch, CURLOPT_AUTOREFERER, self::AUTOREFERER);
    curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, self::RETURNTRANSFER);	
    curl_setopt($this->ch, CURLOPT_HEADER, true);
    
    if ($this->postparams)
      curl_setopt($this->ch, CURLOPT_POSTFIELDS, $this->postparams);
    
    if (count($this->httpheaders))
      curl_setopt($this->ch, CURLOPT_HTTPHEADER, $this->httpheaders);

    if ($this->proxy)
      curl_setopt($this->ch, CURLOPT_PROXY, $this->setProxyIp());
      
    if ($this->proxy_type == 'socks5')
      curl_setopt($this->ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

    curl_setopt($this->ch, CURLOPT_TIMEOUT, self::TIMEOUT);
    curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, self::CONNECT_TIME);
    curl_setopt($this->ch, CURLOPT_COOKIEJAR, $this->cookies);	//	Файл для записи cookies
   		curl_setopt($this->ch, CURLOPT_COOKIEFILE, $this->cookies);	//	Файл для чтения cookies
    $response = curl_exec($this->ch);
    $response = substr($response, curl_getinfo($this->ch, CURLINFO_HEADER_SIZE));
        
    $this->postparams = null;
    
    return $response;
  }
  
  public function __destruct()
  {
    curl_close($this->ch);
  }
}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
O
OKyJIucT, 2018-02-02
@saniii

When instantiating a class, pass the proxy to the constructor.

public function __construct($proxy) 
  {
    $this->ch = curl_init();
    $this->proxy = $proxy;
  }

and than
$curl = new Curl('127.0.0.1');
$data = $curl->post('http://ya.ru');

But you have a setProxy method, why don't you like it? Here it is not necessary to set a proxy for this instance of the class every time, once specified, and will continue to work with the specified one, no matter how many times you call the exec method.
$curl = new Curl();
$curl->setProxy('127.0.0.1');

$data1 = $curl->post('http://ya.ru');
$data2 = $curl->post('http://vk.com');
$data3 = $curl->post('http://google.com');

basically one more line of code. Or, I misunderstood your question.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question