2014-11-27 2 views
0

Я работаю над плагином для короткого кода WordPress, поэтому мне нужно определить функцию для использования с add_action('wp_footer', 'fnc_name'), например. Я создал плагин как класс с публичными функциями и статическими переменными.Как использовать переменную функции класса в локальной функции

Вот пример того, что я пытаюсь сделать (использование $count в локальной функции tryToGetIt):

class Test { 

    public static $count; 

    public function now() { 
     if (!$this::$count) { 
      $this::$count = 0; 
     } 
     $this::$count++; 

     $count = (string) $this::$count; 

     echo 'count should be '.$count; 

     function tryToGetIt() { 
      global $count; 
      echo 'count is '.$count; 
     } 
     tryToGetIt(); 
    } 
}; 

$test = new Test(); 
$test->now(); 

Вы можете увидеть демо на IDEONE: http://ideone.com/JMGIFr

Выход «счетчик должно быть 1 count is ';

Как вы можете видеть, я попытался объявить переменную $count с помощью global, чтобы использовать переменную из внешней функции, но это не работает. Я также пробовал $self = clone $this и использовал global $self в локальной функции.

Как локальная функция может использовать переменные из публичной функции класса?

+0

Интересно, почему вы планируете использовать «вложенную» функцию, это не очевидно, что вы получаете от нее. – birgire

+0

Попытка определить функцию для использования с WordPress 'add_action' – bozdoz

ответ

1

Я попробовал этот код, который работает

class Test { 

    public static $count; 

    public function now() { 
     if (!$this::$count) { 
      $this::$count = 0; 
     } 
     $this::$count++; 

     $count = (string) $this::$count; 

     echo 'count should be '.$count; 

     function tryToGetIt() { 
      echo 'count is '. Test::$count; 
     } 
     tryToGetIt(); 
    } 
}; 

$test = new Test(); 
$test->now(); 

Но я не уверен, я понимаю, почему вы пытаетесь это сделать. Почему бы не попробовать tryToGetIt() частную функцию внутри теста, а не вложенную в настоящее время()?

+0

Правильно ли это? Не следует ли использовать экземпляр класса вместо самого класса? – bozdoz

+0

Я построил тестовый пример, и, похоже, он работает нормально, если я проверю, существует ли эта функция: http://ideone.com/tdpnnZ – bozdoz

+0

Со статической переменной доступ к ней через экземпляр должен быть функциональным эквивалентно доступу к нему через сам класс. – bytesized

2

Вы можете сделать:

function tryToGetIt($count) { 
     echo 'count is '.$count; 
    } 
    tryToGetIt($count); 

Или выбрать статическую переменную использовать:

Test::$count внутри функции tryToGetIt().

+0

Я бы хотел, но так как мне нужно передать имя функции (без аргументов) в WordPress, я не думаю, что смогу. – bozdoz

+0

https://wordpress.org/support/topic/passing-arguments-to-add_action Помогает ли это? – Simeon

3

Это невозможно с global. PHP имеет ровно две области переменных: глобальные и локальные.

<?php 

$foo = 'bar'; // global scope <----------- 
              \ 
function x() {        | 
    $foo = 'baz'; // function local scope | 
              | 
    function y() {       | 
     global $foo; // access global scope/
     echo $foo; 
    } 
    y(); 
} 

x(); // outputs 'bar' 

ВЫ МОЖЕТЕ попробовать закрыть крышку, например.

function foo() { 
    $foo = 'bar'; 
    $baz = function() use (&$foo) { ... } 
} 

Практически невозможно получить доступ к области, определенной на некотором промежуточном уровне цепочки вызовов функций. У вас есть только локальная/текущая область действия и глобальная область действия.

+0

спасибо, исправлено ... –

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