Как получить доступ к этой переменной внутри вложенных функций в codeigniter?

У меня есть контроллер для мыла 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

2 ответа

Вы ошибаетесь по поводу всей концепции. PHP не является Javascript. Вы не должны вкладывать функции, особенно если вы используете OOP-фреймворки. Если вы дважды запустите индекс функции, во второй раз вы, вероятно, получите ошибку, что функция buy уже объявлена, поскольку при первом запуске индекса будет объявлена ​​функция buy.

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

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"));

            }
        }
    }

Нет необходимости использовать глобалы в codeigniter.

Позвольте мне знать, если это помогает.

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

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

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

а остальное вы должны заменить $this на $ci eq. $ CI->some_model->some_function(); или $ci->some_var = 'что-то';

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

Я надеюсь, что это поможет вам.

Я решил эту проблему с помощью $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"));
        }
    }

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

Другие вопросы по тегам