我正在使用Github的库,我将通过Composer添加到我的项目中。在我的代码中,我想扩展库类。我通常可以使用简单的extend
和new
来执行此操作,例如
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
内实例化的。希望有道理。有什么想法吗?
答案 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。