【问题标题】:Extending type with private constructor?使用私有构造函数扩展类型?
【发布时间】:2013-05-28 08:47:17
【问题描述】:

我想为框架提供的类型添加一些功能,但这种类型是singleton

因此,它的构造函数是私有的。我的班级也应该是singleton,但我不知道如何初始化它。我无法更改原始类的代码。

现在我不扩展,只保留一个在我的getInstance 中初始化的私有属性,并使用__call(),但使用起来不够直观。我无法将我的对象传递给需要原始类的对象。

【问题讨论】:

  • 您介意分享一些可以证明您的问题的代码吗?
  • "My" 基类在 api.drupal.org 中有描述,它是 down for me,所以我无法将您链接到它。目前,我自己的代码没什么可看的。简单的 getInstance 调用和私有属性。

标签: php oop singleton


【解决方案1】:

您需要将扩展​​类中的构造函数保持为私有。但是,您可以执行以下操作:

class originalClass
{
    private function __construct()
    {
        /* Do something */
    }

    public static function init()
    {
        self::__construct();
     }
}


class extendedClass extends originalClass
{
    private function __construct()
    {
        parent::init();
    }

    public static function init()
    {
        self::__construct();
    }
}

$var = extendedClass::init();

或者,您可以选择让您的类作为一个独立的类,并使用魔术方法来访问“父”对象:

class pdoExtender
{
    private $someProperty;

    public function __construct()
    {
        $this->someProperty = new PDO(...);
    }

    public function __call($name, $args)
    {
        if(method_exists(array($this, $someProperty), $name))
        {
            return call_user_func_array(array($this, $someProperty), $args);
        }
    }
}

// Example function calls:
    $db = new pdoExtender;

    // As (obj)pdoExtender doesn't have the method 'prepare()', the __call() method is invoked to check the 'parent' object, PDO
    $db->prepare(); 

【讨论】:

  • 原始课程对我来说是不可编辑的。如果我要破解我的框架,我可以放弃继承并直接添加我的功能 - 但我不想,我想提供插件,而不是破解。编辑了我的问题以反映这一点。
  • 使用 __call 是〜我现在正在做的事情。它有一个很大的缺陷——我不能将我的对象直接传递给需要基类的函数。无法定义类型转换,因为 php 声称不需要。因此,如果没有真正的继承,我就卡住了
  • 那为什么要放弃继承呢?你能不扩展类(即使使用私有构造函数),然后使用__call()在你自己的类中加载私有构造函数?
  • 也许我可以。关键是 - 我不知道如何让它发挥作用。
  • 对不起,误会了!让我补充一下我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2021-02-13
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
相关资源
最近更新 更多