2015-06-03 1 views
0

У меня есть контроллер для Nu мыла WSDL Как:

class webservice extends CI_Controller 
     { 
     function index() 
     { 
       $this->load->library('encrypt'); 
       $this->load->model('MWSDl'); 
//... 
      function buy($apicode) 
      { 
       if(!$this->MWSDl->check_gateway($apicode)) //Error occurred php Cannot find "$this" Variable 
      } 
//... 
      $this->nusoap_server->service(file_get_contents("php://input")); 
     } 
    } 

Как получить доступ к $this внутри buy функции?
Я пробовал global $this Но произошла ошибка!
Ошибка:
Fatal error: Using $this when not in object context in \controllers\webservice.php on line 9

+0

Если вы хотите получить доступ к '$ this', почему вы не сделали функцию методом класса? То есть не определен внутри метода 'index()'. Кроме того, почему вы вызываете 'parent :: __ construct()' в методе? –

+0

Если я положил функцию 'buy' из индекса Nusoap, не работала и не была ошибка –

+0

Возможно, вы должны сообщить нам об этой ошибке. В настоящее время это звучит как проблема xy. –

ответ

0

меня решить эту проблему с помощью $GLOBALS

class webservice extends CI_Controller 
     { 
     function index() 
     { 
       $this->load->library('encrypt'); 
       $this->load->model('MWSDl'); 
//... 
     $GLOBALS['this'] = $this; 
      function buy($apicode) 
      { 
       if(!$GLOBALS['this']->MWSDl->check_gateway($apicode)) //Error occurred php Cannot find "$this" Variable 
      } 
//... 
      $this->nusoap_server->service(file_get_contents("php://input")); 
     } 
    } 

но
Есть ли лучший способ?

1

Вы ошибаетесь в отношении всей концепции. PHP не является Javascript. Вы не должны устанавливать функции, особенно не при использовании фреймворков ООП. Если вы дважды запустите индекс функции, во второй раз вы, вероятно, получите сообщение об ошибке, когда функция покупки уже объявлена, поскольку первый запуск индекса объявит функцию покупки.

Я бы объявил их как функции/методы класса.

class Webservice extends CI_Controller { 

     function __construct() 
     { 
      parent::construct(); 
      $this->load->library('encrypt'); 
      $this->load->model('MWSDl'); 
     } 

     function index() 
     { 
      // do something like 
      $apicode = 'xxxxxx'; 
      $this->buy($apicode); 

      //or what ever else you need to do 
     } 


     function buy($apicode) 
     { 
      if(!$this->MWSDl->check_gateway($apicode)) { 

       $this->nusoap_server->service(file_get_contents("php://input")); 

      } 
     } 
    } 

Не нужно использовать глобальные переменные в кодеигниторе.

Дайте мне знать, если это поможет.

+0

Функция не работает, когда функция 'buy' находится вне функции' index' !!! –

+0

какая функция не работает? – SasaT

0

Я понимаю ваш вопрос. У меня также была такая же проблема с nusoap. При регистрации службы вам необходимо выполнить функцию. Таким образом, в CI вы создаете его внутри функции класса, которая делает функцию сервиса вложенной внутри и не может быть выведена за пределы.

Почему бы вам не попробовать это внизу? Я использую его все время раньше, с помощником и т. Д. Это просто, и я попробовал, и он работает.

Поместите это внутри своей вложенной функции: $ ci = & get_instance();

, а остальное вам необходимо заменить $ this на $ ci экв. $ CI-> some_model-> some_function(); или $ ci-> some_var = 'something';

И он также работает, если вы попытались назвать db.

Надеюсь, это поможет вам.

+0

Я исправил его с помощью переменных Const. 'CI = &$this;' ... Очень время регистрации ... –

+0

Использование 'Phalconphp' ИЛИ' Yii' Лучше и быстрее. –