2012-02-29 2 views
2

Так что, когда я пытаюсь запустить эту строку кода, я получаю следующее сообщение об ошибке:Вызов неопределенной функции, которая не определена?

Фатальная ошибка: Вызов неопределенной функции curl_http_api_request_() в/Applications/XAMPP/xamppfiles/HTDOCS/CI/приложения/библиотеки/Shopify.php на линии 58

Где линия 58 именно эта линия:

$response = curl_http_api_request_($method, $url, $query, $payload, $request_headers, $response_headers); 

Я не совсем уверен, почему это не может вызвать вторую функцию. Код ниже. Я понятия не имею, и я не понимаю, в чем проблема.

class Shopify 
{ 
public $_api_key; 
public $_shared_secret; 
public $CI; // To hold the CI superglobal 



public function __construct() 
{ 
    $this->_assign_libraries(); // Loads the CI superglobal and loads the config into it 

    // Get values from the CI config 
    $this->_api_key      = $this->CI->config->item('api_key', 'shopify'); 
    $this->_shared_secret    = $this->CI->config->item('shared_secret', 'shopify'); 
} 

public function shopify_app_install_url($shop_domain) 
{ 
    return "http://$shop_domain/admin/api/auth?api_key=". $this->_api_key; 
} 


public function shopify_is_app_installed($shop, $t, $timestamp, $signature) 
{ 
    return (md5($this->_shared_secret . "shop={$shop}t={$t}timestamp={$timestamp}") === $signature); 
} 


public function shopify_api_client($shops_myshopify_domain, $shops_token, $private_app=false) 
{ 
    $password = $private_app ? $this->_shared_secret : md5($this->_shared_secret.$shops_token); 
    $baseurl = "https://" . $this->_api_key . ":[email protected]$shops_myshopify_domain/"; 

    return function ($method, $path, $params=array(), &$response_headers=array()) use ($baseurl) 
    { 
     $url = $baseurl.ltrim($path, '/'); 
     $query = in_array($method, array('GET','DELETE')) ? $params : array(); 
     $payload = in_array($method, array('POST','PUT')) ? stripslashes(json_encode($params)) : array(); 
     $request_headers = in_array($method, array('POST','PUT')) ? array("Content-Type: application/json; charset=utf-8", 'Expect:') : array(); 

     $response = curl_http_api_request_($method, $url, $query, $payload, $request_headers, $response_headers); 
     $response = json_decode($response, true); 

     if (isset($response['errors']) or ($response_headers['http_status_code'] >= 400)) 
      throw new ShopifyApiException(compact('method', 'path', 'params', 'response_headers', 'response', 'shops_myshopify_domain', 'shops_token')); 

     return (is_array($response) and (count($response) > 0)) ? array_shift($response) : $response; 
    }; 
} 

    public function curl_http_api_request_($method, $url, $query='', $payload='', $request_headers=array(), &$response_headers=array()) 
    { 
     $url = curl_append_query_($url, $query); 
     $ch = curl_init($url); 
     curl_setopts_($ch, $method, $payload, $request_headers); 
     $response = curl_exec($ch); 
     $errno = curl_errno($ch); 
     $error = curl_error($ch); 
     curl_close($ch); 

     if ($errno) throw new ShopifyCurlException($error, $errno); 

     list($message_headers, $message_body) = preg_split("/\r\n\r\n|\n\n|\r\r/", $response, 2); 
     $response_headers = $this->curl_parse_headers_($message_headers); 

     return $message_body; 
    } 

     private function curl_append_query_($url, $query) 
     { 
      if (empty($query)) return $url; 
      if (is_array($query)) return "$url?".http_build_query($query); 
      else return "$url?$query"; 
     } 

     private function curl_setopts_($ch, $method, $payload, $request_headers) 
     { 
      curl_setopt($ch, CURLOPT_HEADER, true); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
      curl_setopt($ch, CURLOPT_MAXREDIRS, 3); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); 
      curl_setopt($ch, CURLOPT_USERAGENT, 'HAC'); 
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); 
      curl_setopt($ch, CURLOPT_TIMEOUT, 30); 

      if ('GET' == $method) 
      { 
       curl_setopt($ch, CURLOPT_HTTPGET, true); 
      } 
      else 
      { 
       curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, $method); 
       if (!empty($request_headers)) curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers); 
       if (!empty($payload)) 
       { 
        if (is_array($payload)) $payload = http_build_query($payload); 
        curl_setopt ($ch, CURLOPT_POSTFIELDS, $payload); 
       } 
      } 
     } 

     private function curl_parse_headers_($message_headers) 
     { 
      $header_lines = preg_split("/\r\n|\n|\r/", $message_headers); 
      $headers = array(); 
      list(, $headers['http_status_code'], $headers['http_status_message']) = explode(' ', trim(array_shift($header_lines)), 3); 
      foreach ($header_lines as $header_line) 
      { 
       list($name, $value) = explode(':', $header_line, 2); 
       $name = strtolower($name); 
       $headers[$name] = trim($value); 
      } 

      return $headers; 
     } 


public function shopify_calls_made($response_headers) 
{ 
    return shopify_shop_api_call_limit_param_(0, $response_headers); 
} 

public function shopify_call_limit($response_headers) 
{ 
    return shopify_shop_api_call_limit_param_(1, $response_headers); 
} 

public function shopify_calls_left($response_headers) 
{ 
    return shopify_call_limit($response_headers) - shopify_calls_made($response_headers); 
} 

    private function shopify_shop_api_call_limit_param_($index, $response_headers) 
    { 
     $params = explode('/', $response_headers['http_x_shopify_shop_api_call_limit']); 
     return (int) $params[$index]; 
    } 


/** 
* Shopify::_assign_libraries() 
* 
* Grab everything from the CI superobject that we need 
*/ 
public function _assign_libraries() 
{ 

     $this->CI =& get_instance(); 


     $this->CI->load->config('shopify', TRUE); 

     return; 

} 

UPDATE: Вся эта линия вышла на меня называя эту строку кода:

$shopify = $this->shopify->shopify_api_client($shops_myshopify_domain, $shops_token); 

Я также обновил код выше, чтобы включить весь файл.

+3

В качестве метода/функции в классе вы должны заявить, что, например, '$ ответ = $ this-> curl_http_api_request_ (. ...) ' –

+0

@LawrenceCherone: Я думаю, вы должны опубликовать это как ответ. :-) – ruakh

+0

$ это нехорошо, так как это порождает эту ошибку: Неустранимая ошибка: использование $ this, если не в контексте объекта. Анонимная функция имеет свой собственный контекст, поэтому вы не можете использовать $ this внутри него ... – Karol

ответ

2

Вы можете достичь этого только путем пропускания $ это как объект для анонимной функции, так как она имеет свой собственный контекст:

class example { 
    public function trigger() { 
     $func = $this->func(); 
     $func($this); 
    } 

    public function func() { 
     return function($obj) { 
      $obj->inner(); 
     }; 
    } 

    public function inner() { 
     die('inside inner'); 
    } 
} 

$obj = new example(); 
$obj->trigger(); 

EDIT: Так что в ответ на вашу проблему:

  1. Изменение эта линия:

    возврата функции (метод $, $ путь, $ PARAMS = массив(), response_headers & $ = массив)() использовать ($ BaseUrl)

в этом:

return function ($instance, $method, $path, $params=array(), &$response_headers=array()) use ($baseurl) 
  1. Внутри анонимной изменения функции этой линии:

    $ ответ = curl_http_api_request _ ($ метод, $ URL, $ запрос, $ полезная нагрузка, $ request_headers, $ response_headers);

в этом:

$response = $instance->curl_http_api_request_($method, $url, $query, $payload, $request_headers, $response_headers); 
  1. Теперь shopify_api_client функция вернет вам это анонимная функция без ошибок:

    $ Shopify = $ this-> shopify-> shopify_api_client ($ магазины_myshopify_domain, $ stores_token);

  2. Вы должны вызвать эту функцию следующим образом:

    $ Shopify ($ this-> Shopify ... И ЗДЕСЬ ВСЕ АРГУМЕНТЫ КОТОРЫХ анонимная функция ТРЕБУЕТСЯ ...);

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

+0

Можете ли вы взглянуть на код сейчас, когда я его обновляю? Я не знаю, что я вполне понимаю ваш ответ, и я думаю, что дополнительный код немного упрощает то, что я пытаюсь сделать. – mitchellwright

+1

FYI в PHP5.4 '$ this' доступен в анонимных функциях: http://www.php.net/manual/en/functions.anonymous.php (под изменением) –

+0

@MikeB Я не на PHP5.4, поэтому я получаю сообщение об ошибке: Fatal error: использование $ this, когда не в контексте объекта – mitchellwright

2

Если ваш доступ к методу вне класса вы должны указать это, если ваш доступ к методу внутри класса, вам нужно использовать $this->methodname()

<?php 
class shopify_api{ 
    ... 

    ... 

    ... 
    public function curl_http_api_request_($method, $url, $query='', $payload='', $request_headers=array(), &$response_headers=array()) 
    { 
     $url = curl_append_query_($url, $query); 
     $ch = curl_init($url); 
     curl_setopts_($ch, $method, $payload, $request_headers); 
     $response = curl_exec($ch); 
     $errno = curl_errno($ch); 
     $error = curl_error($ch); 
     curl_close($ch); 

     if ($errno) throw new ShopifyCurlException($error, $errno); 

     list($message_headers, $message_body) = preg_split("/\r\n\r\n|\n\n|\r\r/", $response, 2); 
     $response_headers = $this->curl_parse_headers_($message_headers); 

     return $message_body; 
    } 

} 

$shopify = new shopify_api(); 
//--------V 
$response=$shopify->curl_http_api_request_(); 
?> 


Поскольку вы обновили свой вопрос у вас попытался изменить:

$shopify = $this->shopify->shopify_api_client($shops_myshopify_domain, $shops_token); 

тоже: (как это кажется ваше добавление дополнительных Shopify свойство, я не могу видеть из yourcode где вы установили & закачиваемой свои методы к нему)

$shopify = $this->shopify_api_client($shops_myshopify_domain, $shops_token); 
+0

, если кто-нибудь знает, что '$ shopify' будет классифицироваться так же, как при подключении к нему класса, дайте мне знать, он все еще известен как переменная? lol его переменный объект right lol –

+0

Возможно, я не дал достаточно информации. Сначала я вызываю другую функцию. Я буду обновлять исходное сообщение. – mitchellwright

Смежные вопросы