Как получить доступ к этой переменной внутри вложенных функций в 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"));
}
}
но
Есть ли способ лучше?