Статические вызовы PHP от объекта - PullRequest
0 голосов
/ 02 января 2012

У меня есть метод класса PHP, который использует статическую функцию из другого класса. Как мне разрешить этой статической функции изменять переменные внутри вызывающего класса .. Пример следующим образом:

РОДИТЕЛЕЙ:

class sys_core
{
   public $test = 'no';

   // --------------------
   public function __construct()
   {
   }

   // --------------------
   public function init()
   {
      sys_loader::load_config('123');
      print $this->test;
   }

   // --------------------
   // --------------------
   // --------------------
   // --------------------
   // --------------------

} // END Class

СТАТИЧЕСКИЙ КЛАСС

class sys_loader
{
   private $registry = array();

   // --------------------
   public static function load_config($file)
   {
      $this->test = 'yes';
   }

   // --------------------
   // --------------------
   // --------------------
   // --------------------

} // END Class

ОШИБКА:

Fatal error: Using $this when not in object context

Ответы [ 4 ]

2 голосов
/ 02 января 2012

На мой взгляд, sys_loader может изменить $ test sys_core тремя способами:

1) sys_loader передается ссылка на sys_core-> test2) sys_loader возвращает новое значение для него или3) оборудуйте sys_core установщиком для $ test и передайте sys_loader ссылку на sys_core.С этой ссылкой sys_loader может получить доступ к любым переменным и функциям, которые sys_core позволяет.

Вот биты, которые я изменил / добавил, чтобы заставить работать # 3:

Пример использования:

$sc = new sys_core();
$sc->setConfigFile('123');
$sc->init();

Выход:123yes

class sys_core

// new
private $configFile = null;

// new
function getConfigFile() {
  return $this->configFile;
}

// new
function setConfigFile($value) {
  $this->configFile = $value;
}

// new
function setTest($value) {
  $this->test = $value;
}


public function init()
{
// sys_loader::load_config('123');
  sys_loader::load_config($this);
  print $this->test;
}

class sys_loader

// public static function load_config($file)
public static function load_config($caller)
{
// $this->test = 'yes';
  $caller->setTest('yes');
// new, example
  $config = $caller->getConfigFile();
// new, example
  echo $config;
}
1 голос
/ 02 января 2012

Если это поможет, вы можете передать ссылку на ваш экземпляр sys_core в качестве параметра методу sys_loader :: load_config:

class sys_core
{...
    public function init()
    {
       sys_loader::load_config('123', $this);
       print $this->test;
    }    
 ...
}

class sys_loader
{
  ...
   // --------------------
   public static function load_config($file, $core)
   {
      $core->test = 'yes';
   }
 ...
}
0 голосов
/ 02 января 2012

Вы можете получить доступ к любому общедоступному члену за пределами этого класса, закрытые члены могут быть доступны только самому классу, а защищенные члены - к подклассам.

self используется для статических членов.... по одному на класс.

this используется для нестатических элементов ... по одному на экземпляр.

0 голосов
/ 02 января 2012

Вы не можете. По определению static означает не привязанный ни к какому объекту. (Что вы пытаетесь достичь здесь?)

Статические методы для каждого класса, они могут принимать параметры и изменять статические переменные. Выясните, что вам нужно, нарисуйте диаграмму и реализуйте ее.

...