2015-10-09 4 views
2

Я использую библиотеку из Github, которую я добавляю в свой проект через Composer. В моем коде я хочу расширить классы библиотеки. Обычно я мог бы сделать это с помощью простых extend и new, например.Расширение класса, созданного без '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, но это, кажется, не работает.

** EDIT **

Возможно, я ложному дерево здесь с extends: ::create('2.0') может быть развлечением.

То, что я пытаюсь сделать, это добавить метод к классу в другом пространстве имен родительскому.

Первая конкретизация происходит на самом высоком уровне: \Sokil\Vast\Document, но класс я хочу продлить это \Sokil\Vast\Ad\Inline ... но если я продлить этот класс, я не могу создать его экземпляр, потому что конкретизируется в \Sokil\Vast\Document, что я дон У меня нет доступа. Надеюсь, это имеет смысл. Есть идеи?

+0

Похоже, что он создается через [статический метод] (http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php). Я не уверен, но, возможно, [это] (http://stackoverflow.com/questions/1280492/extending-php-static-classes) имеет значение. –

+2

Не работает ли 'myNewClasses :: create (" 2.0 ")'? Автор этого класса не предполагал, что он будет легко продлен (если бы он тогда использовал бы конструктор, а не статический метод). Жалоба на автора. –

+0

@ SverriM.Olsen, Нет - потому что ['create()'] (https://github.com/sokil/php-vast/blob/master/src/Sokil/Vast/Document.php#L29) всегда будет возвращаться экземпляр суперкласса без дополнительных изменений из подкласса. – HPierce

ответ

1

Возможно, это будет делать:

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

$myDoc = new myDocClass(); 

Вы не можете назначить $this, поэтому я создал свойство связывания с родительским OBJ, который конкретизируется в create() статического метода родителя.

+0

Кажется, что экземпляр класса, но затем ошибки далее вниз код, где он использует $ это говорит, что это null. –

+0

Какой метод вы пытались назвать? Все методы из родительского класса не находятся в '$ this', но они находятся в' $ this-> parentObj' (например, '$ this-> parentObj-> method()'). – Niloct