2016-10-10 15 views
-1

Можно ли вызвать метод parent в дочернем классе, ведьма не распространяется на родителя? У меня есть что-то вроде этого:PHP вызов метода класса внутренних классов без расширения родительского

<?php 

class wrapper { 

    private $inner; 

    public function __construct() { 
     $this->inner = new inner(); 
    } 

    // this will never get called :(
    public function foo() { 
     echo "foo called in parent"; 
    } 

    public function bar() { 
     return $this->inner->bar(); 
    } 

    public function getOtherStuff() { 
     return $this->inner->blafasel; 
    } 
} 

class inner { // would only be created in class wrapper, never outside 

    public $blafasel; 

    public function __construct() { 
     // do something 
     $this->blafasel = "other stuff"; 
    } 

    public function bar() { 
     // do stuff 
     echo "bar called in inner"; 

     $this->foo(); // fatal error, method not declared 
     parent::foo(); // fatal error, class has no parent 
     // ?? 
     return "something" 
    } 
} 

$test  = new wrapper(); 
$something = $test->bar(); 

?> 

пожалуйста, не спрашивайте, почему я уже не использую class inner extends wrapper. я должен использовать его, как эта причина старого материала и других необходимых вещей. Так можно ли вызвать wrapper :: foo без be static? wrapper использует некоторые общедоступные переменные внутреннего и другого.
Я попытался добавить $this при вызове конструктора внутреннего, но это приводит только к переполнению памяти или просто к отражению оболочки. Так можно ли вызвать метод foo() оболочки в inner'b bar() или мне нужно переписать все это, чтобы он мог использовать расширенные классы? Я знаю, что мне нужно переписать его, но потребовались недели, и мне нужна эта штука ... ну .. вчера.

Спасибо за любую помощь/советы/исправления :)

EDIT

Есть еще inner классов, которые назвали бы в обертки конструктора, и все есть (вроде) одни и те же методы, но делают разные материал, зависит от самого внутреннего класса. (Весь код слишком долго, даже для Pastebin)

некоторые фрагменты:

class wrapper { 
    public function __construct($loadclass=1) { 
     if($loadstuff==1) 
      $this->inner = new inner(); 
     else 
      $this->inenr = new otherinner(); 
    } 
} 

, а затем

class otherinner { 
    public function bar() { 
     // doing different stuff than inner::bar() 
     // but call wrappers foo() may with possible args 
    } 
} 

я надеюсь, что это будет ясно "почему не использовать расширяет"

+0

Ваш «Внутренний» класс не расширяет класс, поэтому он наследует? Проверьте документацию перед запросом – KDOT

+0

Вы не ищете 'parent :: foo()', так как оболочка не является родителем. На самом деле в вашем примере нет связи с внутренним классом-оболочкой. Вам нужно что-то вводить в этом случае, поэтому передайте ссылку на содержащий объект (обертку) или его метод, когда вы вызываете 'inner :: foo()'. Но, откровенно говоря, это пахнет плохим дизайном. – arkascha

+0

Я не уверен, что здесь полезны [php traits] (http://php.net/manual/en/language.oop5.traits.php). Чтобы связать оба класса, вам нужно будет использовать либо 'extend', либо' use'. – Jigar

ответ

0
class Inner extends Wrapper { 

    public function __construct() { 
     parent::foo(); 
    } 

} 

new Inner(); 

Ваша текущая обертка ожидает инъекции внутреннего объекта, эта обертка теперь является частичным объектом, внутренний mplete или extend

Расширяя частичный класс, класс расширения наследует частичный класс. Без расширения нет «родителя».

Вы просто используете обертку как инъекцию зависимости в своем коде, а не как расширение.

+0

, как я уже сказал, я знаю, как работают расширения, черты и пространства имен, но в этом случае не могут быть расширенные - старые классы, просто вызывающие оболочку с n args, и он разбивает беспорядок в собственные внутренние классы, для обмена идентичными функциями, я уже использую черты, и он отлично работает, но не «внешние» функции. – UnskilledFreak

+0

. Вы ответили на свой вопрос, его невозможно. Чтобы наследовать методы классов, он должен быть частичным класс и расширенный. Вы используете инъекцию зависимостей, поэтому вы не можете использовать «родительский», вы должны сделать каждый метод общедоступным и вызвать, если с момента ($ this-> inner-> bar(); или self :: foo();) @ UnskilledFreak – KDOT

+0

признал ваш ответ причиной того, как все должно быть сделано без «хаксинга». Спасибо! – UnskilledFreak