Классы PHP: общение родителей и детей - PullRequest
2 голосов
/ 04 мая 2010

У меня возникли проблемы с расширением классов в PHP. Некоторое время гуглил.

 $a = new A();
 $a->one();

 $a->two();
 // something like this, or...

 class A {
  public $test1;

   public function one() {
    echo "this is A-one";

    $this->two();
    $parent->two();
    $parent->B->two();
    // ...how do i do something like this (prepare it for using in instance $a)?

   }
 }

 class B extends A {
   public $test2;

    public function two($test) {
     echo "this is B-two";

    }
 }

Я в порядке с процедурным PHP.

Ответы [ 4 ]

2 голосов
/ 04 мая 2010

С вашими примерами все в порядке, но вы тут немного путаетесь:

public function one() {
    echo "this is A-one";

    $this->two();
    $parent->two();
    $parent->B->two();
}

что вы хотите, это я думаю:

class A
{
    function one()
    {
        echo "A is running one\n";
        $this->two();
    }
    function two()
    {
        echo "A is running two\n";
    }

}

class B extends A
{
    function two()
    {
        echo "B is running two\n";
    }
}

Затем вы хотите сделать объект типа B и вызвать функцию «one»

$myB = new B();
$b->one();

Это выдаст

A is running one
B is running two

Это пример полиморфного поведения классов. Суперкласс будет знать, чтобы вызвать версию функции текущего экземпляра «two». Это стандартная функция PHP и большинства объектно-ориентированных языков.

Обратите внимание, что суперкласс никогда не знает о подклассах, единственная причина, по которой вы можете вызвать метод "two" и запустить версию B, заключается в том, что функция "two" была определена в родительском (A) классе.

2 голосов
/ 04 мая 2010

Это не может быть сделано. Во-первых, класс A является родителем класса B, поэтому использование чего-либо с parent прямо в списке.

Существует ряд вещей, которые относятся к дочернему классу, но не относятся к родительскому классу:

  • Класс B должен присутствовать A для работы
  • Класс B может делать все, что может A плюс еще
  • Класс B имеет доступ (насколько это разрешено) ко всем данным класса A

Ничто из этого не верно в обратном порядке, поэтому вместе они составляют причину, по которой вы не можете вызвать функцию ребенка.

0 голосов
/ 04 мая 2010

вот что вы можете сделать:

class A{
  public function methodOfA (){
    echo "this is a method of A (and therefore also of B)";
  }
}

class B extends A{
  public function methodOfB (){
    echo "this is a method of B";
    // you can do {$this->methodOfA ()} if you want because all of A is inherited by B
  }
}

$a = new A ();  // $a is an A
$a->methodOfA ();     // this is OK because $a is an A
// can't do {$a->methodOfB ()} because $a is not a B

$b = new B ();  // $b is a B, and it is also an A, because B extends A
$b->methodOfB (); // ok because $b is a B
$b->methodOfA (); // ok becuase $b is an A

Конечно, есть гораздо больше. В руководстве по php есть хороший раздел ООП (в ответе artlung).

0 голосов
/ 04 мая 2010

Внимательно прочитайте раздел Object Inheritance руководства по PHP. Да, в http://us2.php.net/oop, содержится много информации, но она может помочь вам подумать о том, что вы можете получить из OOP .

...