【问题标题】:Calling a non static function in a static child class php在静态子类php中调用非静态函数
【发布时间】:2012-02-15 23:02:31
【问题描述】:

我有一个扩展普通类的单例类。 (Class1)

普通类有两个非静态函数,称为 set() 和 get()。 (Class2)

获取单例 (Class1) 实例的第三个类 (Class3) 通过单例使用 set() 和 get()。使用 Class3 可以正常工作,但是有什么方法可以在父类的单例中使用 get() 方法来查看“第三”类将其设置为什么?

我似乎无法调用 get,因为它是非静态的。请让我知道这是否令人困惑。

class Class1 {
     public function doThings(){
         $this->view->set("css","1234");
     }
}

class Singleton extends Class3 {
      static public function instance()
      {
           if (!self::$_instance instanceof self) {
           self::$_instance = new self();
           }

          return self::$_instance;
      }
      //I want this singleton to call get("css") and have it return the value.

}


class Class3{
     public function get(arg){//implementation } 
     public function set(arg){//implementation }
}

【问题讨论】:

  • 您要求我们让您知道这是否令人困惑。令人困惑。
  • 好吧好吧,我发布了代码 sn-ps :)
  • 普通类有什么用途,为什么要用单例模式扩展它?
  • 普通类是一个模板类,我想通过我的单例扩展它以使用它的许多有用的功能。
  • 单身人士应该怎么做?你能再显示一些代码吗?

标签: php


【解决方案1】:

我从未见过仅针对单例的特定类,它扩展了它应该是单例的类。相反,试试这个:

class Class3
{  
    private $_instance;

    static public function instance()
    {
        if (!self::$_instance instanceof self) {
            self::$_instance = new self();
        }

        return self::$_instance;
    }

    public function get(arg){//implementation } 
    public function set(arg){//implementation }
}

// Calling code
// I want this singleton to call get("css") and have it return the value.

Class3::getInstance()->set('css', 'border:0');
Class3::getInstance()->get('css');

【讨论】:

  • 这很好,唯一的问题是除了get和set之外还有更多的功能,我不能只在单例中实现它们,从而扩展。
  • 你不是“在单例中实现它们”,单例表示 class3 的单个实例,这意味着它可以访问每个公共成员变量和函数,就好像它扩展了 class3。
  • 哦,等等,我收回我说过的话。我没有注意到您的解决方案是 class3 而不是单例。
【解决方案2】:

我刚刚解决了自己的问题,抱歉回复晚了。

我在单例中所要做的就是以这种方式调用 get():

self::instance()->get("css");

【讨论】:

  • 小心,如果你选择为另一个类做同样的事情,你最终会遇到命名空间冲突。
  • 如果你想对 class2 做同样的事情怎么办?您现在将有两个名为 Singleton 的类,这将由于命名空间冲突而导致错误。我建议您使用我的解决方案,以便您以后避免此问题。
  • 谢谢,这是有道理的。虽然它永远不会被这样使用
  • 不用担心,只是让您了解未来可能出现的问题。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
相关资源
最近更新 更多