【问题标题】:PHP Access property of a class from within a class instantiated in the original class在原始类中实例化的类中的类的 PHP 访问属性
【发布时间】:2010-03-19 17:27:06
【问题描述】:

我不确定如何用正确的术语来解释这一点,所以也许举个例子是最好的方法......

$master = new MasterClass();

$master->doStuff();

class MasterClass {

    var $a;
    var $b;
    var $c;
    var $eventProccer;

    function MasterClass() 
    {
        $this->a = 1;
        $this->eventProccer = new EventProcess();
    }

    function printCurrent()
    {
        echo '<br>'.$this->a.'<br>';
    }

    function doStuff()
    {
        $this->printCurrent();
        $this->eventProccer->DoSomething();
        $this->printCurrent();
    }
}


class EventProcess {

    function EventProcess() {}

    function DoSomething() 
    {
        // trying to access and change the parent class' a,b,c properties

    }
}

我的问题是我不确定如何从 EventProcess->DoSomething() 方法中访问 MasterClass 的属性?我需要访问、执行操作和更新属性。 a,b,c 属性将是相当大的数组,并且 DoSomething() 方法将在脚本执行期间被多次调用。任何帮助或指针将不胜感激:)

【问题讨论】:

  • 我不确定到底是什么问题,但是不能将 MasterClass 的对象传递给 EventProcess->doSomething 吗?
  • 是的,你说得对,我已经意识到我正在测试的域被 cpanel 设置为 php4 运行,而我相信 php5 默认通过引用传递它。

标签: php design-patterns class oop


【解决方案1】:

这已经在 SO 上讨论过很多次,每次都没有“本地”的方式来做到这一点。您必须将对 MasterClass 实例的引用传递给子类。在 PHP5 中:

 $this->eventProccer = new EventProcess($this);

并将其存储在子类中,如下所示:

 class EventProcess
  {
    private $masterClass; // Reference to master class

    function __construct($masterClass) 
      {
        $this->masterClass = $masterClass;
      }

【讨论】:

  • 太好了,谢谢,我担心所用资源的开销,但我认为如果它通过引用传递,任何开销都会很小。
  • +1。这是迄今为止最简单的方法。另一种方法是使用访客模式:sourcemaking.com/design_patterns/visitor
  • 这段代码适用于PHP5中的PHP4或PHP4兼容。 var 在 PHP5 中已弃用。这将在 PHP5.3 及更高版本中触发 E_STRICT 警告。使用protectedpublicprivate
  • @takeshin 好点,将 var 更改为私有。然而,它不会在 PHP 4 中按预期工作,因为该对象不会作为引用传递。
  • 由 Iain 决定使用哪一个。我们不知道,他为什么在他的样本中使用var。也许他还在 PHP4 上。那么var就OK了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
相关资源
最近更新 更多