扩展已经实例化的类,而不使用' new'

时间:2015-10-09 18:18:18

标签: php class oop extend

我正在使用Github的库,我将通过Composer添加到我的项目中。在我的代码中,我想扩展库类。我通常可以使用简单的extendnew来执行此操作,例如

class myNewClasses extends classesFromTheLibrary
{
// add my custom methods here
}

// instantiate with new
$allClasses = new myNewClasses; // $allClasses can access methods in myNewClasses and classesFromTheLibrary

但是,这个库实例化如下:

$document = \Sokil\Vast\Document::create('2.0');

因此无法使用new技术。另外,我想扩展的一些类在不同的命名空间中,例如\Sokil\Vast\Ad\Inline

如何以实例化方式和不同的命名空间扩展类?

作为参考,我尝试使用的库是here ......我已经尝试了所讨论的装饰技术here,但这似乎也无法发挥作用。

**编辑**

也许我在这里用extends咆哮错误的树:::create('2.0')可能会分散注意力。

我要做的是将一个方法添加到父级的不同命名空间中的类。

第一个实例化发生在顶层:\Sokil\Vast\Document,但我要扩展的类是\Sokil\Vast\Ad\Inline ...但是如果我扩展该类,我就无法实例化它,因为它是在我无法访问的\Sokil\Vast\Document内实例化的。希望有道理。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

也许这样做:

class myDocClass extends \Sokil\Vast\Document {
    private $parentObj;
    public function __construct() {
        $this->parentObj = parent::create('2.0');
    }
}

$myDoc = new myDocClass();

您无法分配给$this,因此我创建了一个链接到父obj的属性,该属性在父级的create()静态方法中实例化。

答案 1 :(得分:1)

由于0.6版增加了覆盖元素类的功能,因此可以添加任何自定义元素或元素的属性。

首先让我们为MediaFile创建类并添加一些自定义属性:

<?php

namespace Acme\Vast\ElementBuilder\Element;

use Sokil\Vast\Creative\InLine\Linear\MediaFile;

class AcmeMediaFile extends MediaFile
{
    public function setMinDiration($seconds)
    {
        $seconds = (int)$seconds;
        if ($seconds <= 0) {
            thow new \InvalidArgumentException('Invalid min duration specified, must be positive int')
        }

        $this->domElement->setAttribute('minDuration', $seconds);

        return $this;
    }
}

现在,我们需要覆盖默认的元素生成器并创建自己的MediaFile工厂方法:

<?php

namespace Acme\Vast\ElementBuilder;

use Sokil\Vast\ElementBuilder;
use Acme\Vast\ElementBuilder\Element\AcmeMediaFile;

class AcmeElementBuilder extends ElementBuilder
{
    /**
     * <Ad><InLine><Creatives><Creative><Linear><MediaFile>
     *
     * @param \DOMElement $mediaFileDomElement
     *
     * @return AcmeMediaFile
     */
    public function createInLineAdLinearCreativeMediaFile(\DOMElement $mediaFileDomElement)
    {
        return new AcmeMediaFile($mediaFileDomElement);
    }
}

现在,我们需要配置VAST工厂以使用覆盖的元素生成器:

<?php

use Acme\Vast\ElementBuilder\AcmeElementBuilder;
use Sokil\Vast\Factory;

$elementBuilder = new AcmeElementBuilder();
$factory = new Factory($elementBuilder);

$document = $factory->create('4.1');

$ad = $document->createInLineAdSection();
$creative = $ad->createLinearCreative();
$mediaFile = $creative->createMediaFile();

$mediaFile->setMinDiration(10);

有关更多详细信息,请参见https://github.com/sokil/php-vast#custom-specification-support