Можно ли вызвать метод 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
}
}
я надеюсь, что это будет ясно "почему не использовать расширяет"
Ваш «Внутренний» класс не расширяет класс, поэтому он наследует? Проверьте документацию перед запросом – KDOT
Вы не ищете 'parent :: foo()', так как оболочка не является родителем. На самом деле в вашем примере нет связи с внутренним классом-оболочкой. Вам нужно что-то вводить в этом случае, поэтому передайте ссылку на содержащий объект (обертку) или его метод, когда вы вызываете 'inner :: foo()'. Но, откровенно говоря, это пахнет плохим дизайном. – arkascha
Я не уверен, что здесь полезны [php traits] (http://php.net/manual/en/language.oop5.traits.php). Чтобы связать оба класса, вам нужно будет использовать либо 'extend', либо' use'. – Jigar