来自对象的PHP静态调用

时间:2012-01-02 17:02:44

标签: php class object static call

我有一个PHP类方法,它使用另一个类的静态函数。如何启用静态函数来修改调用类中的变量。示例如下:

PARENT:

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

ERROR:

Fatal error: Using $this when not in object context

4 个答案:

答案 0 :(得分:2)

在我看来,sys_loader可以修改sys_core的$ test 3方式:

1)sys_loader传递对sys_core-> test,
的引用 2)sys_loader为它返回一个新值或
3)为sys_core配备一个用于$ test的setter,并向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 :(得分:1)

如果有帮助,您可以将对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';
   }
 ...
}

答案 2 :(得分:0)

你做不到。根据定义,static表示不依赖于任何对象。 (你想在这里完成什么?)

静态方法是每个类,它们可以接受参数并修改static个变量。弄清楚你需要什么,绘制图表并实现它。

答案 3 :(得分:0)

您可以访问该类之外的任何公共成员,私有成员只能由类本身访问,受保护的成员可以通过子类访问。

self用于静态成员......每个类一个。

this用于非静态成员......每个实例一个。