views:

120

answers:

4

Hi all,

I'm having some trouble extending Classes in PHP. Have been Googling for a while.

 $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";

    }
 }

I'm ok at procedural PHP.

+2  A: 

It can't be done. First off, class A is class B's parent, so using something with parent is right off the list.

There is a number of things that goes for a child class that does not go for a parent class:

  • Class B needs A to be present in order to work
  • Class B can do everything A can plus more
  • Class B has access (as far as it is allowed to access) all data of class A

None of these things is true in reverse, so together they make up the reason why you cannot call a child's function.

Jasper
Thanks. So this would mean it's normal practice to create one big parent class with lots of functions that call functions in the other included classes?
Fffff
Um, no, not really.
Amber
not quite... you should try $b = new B(); $b->one(); Maybe the fact that that works is able to explain to you what you misunderstood.
Jasper
A: 

Have a close read of the Object Inheritance section of the PHP manual. Yes, there's a lot of information in http://us2.php.net/oop, but it may help you think about what you can get out of OOP.

artlung
A: 

here's what you can do:

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

Of course, there's much more. There's a good OOP section in the php manual (in artlung's answer).

grossvogel
+2  A: 

Your examples are fine, but you are showing a little confusion here:

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

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

what you want is this I think:

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";
    }
}

Then you want to make an object of type B and call function "one"

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

This will output

A is running one
B is running two

This is an example of polymorphic class behavior. The superclass will know to call the current instance's version of the function "two". This is a standard feature of PHP and most object oriented languages.

Note, that a superclass never knows about subclasses, the only reason you can call the "two" method and have B's version run is because the function "two" was defined in the parent (A) class.

Zak