Php возвращает NULL для глобальной переменной - PullRequest
0 голосов
/ 13 сентября 2018

Итак, у меня есть следующий код:

public function pcieh_shortcodes_init() {
    $data = $this->data;
    var_dump($data); //Return an array which is Expected       

    function pcieh_shortcode($atts = [], $content = null) {
         global $data;
         var_dump($data); //Return NULL
     }

    add_shortcode('pcieh', 'pcieh_shortcode');
}

Когда я вызываю pcieh_shortcodes_int, я ожидаю, что $ data внутри pcieh_shortcode будет иметь то же значение, что и за пределами $ data, поскольку он глобален, но возвращает NULL. Почему это так и как я могу это исправить?

1 Ответ

0 голосов
/ 13 сентября 2018

Вместо этого

 public function pcieh_shortcodes_init() {
     $data = $this->data;
     var_dump($data); //Return an array which is Expected       

     function pcieh_shortcode($atts = [], $content = null) {
          global $data;
          var_dump($data); //Return NULL
      }

     add_shortcode('pcieh', 'pcieh_shortcode');
 }

Почему бы не это

public function pcieh_shortcodes_init() {
    $data = $this->data;
    var_dump($data); //Return an array which is Expected       
    add_shortcode('pcieh', [$this,'pcieh_shortcode']);
}

public function pcieh_shortcode($atts = [], $content = null) {
    var_dump($this->data); //Return NULL
}

Тогда нет необходимости в global или каких-либо безобразиях, связанных с ним.Вполне допустимо передать класс и метод в виде массива.

В основном WordPress использует call_user_func для вызова этого в любом случае.

http://php.net/manual/en/function.call-user-func.php

ОБНОВЛЕНИЕ

Я должен был отметить, что в исходном коде вопроса, даже если вы все же заставили его работать, у вас нет ссылки на фактический экземпляр этого класса, поэтому любое значение, которое вы устанавливаете вданные (после назначения краткого кода и глобального), вероятно, в любом случае были бы потеряны.Другими словами, вы потеряете состояние текущего объекта и любых данных, которые он содержит.

Таким образом, используя фактический экземпляр $this, вы можете быть уверены, что имеете дело с экземпляром, который хотите.

...