I wrote this simple example that demonstrates my problem. I've a Base class and Derived class. When I call derived class's `justdoit` function, it doesn't call derived class `doer` function, instead it calls base class's `doer` function.

Expected output:

```
Base::doer
Derived::doer

```

Actual output:

```
Base::doer
Base::doer

```

Code:

```
<?

class Base {
 public function justdoit() {
  $this->doer();
 }
 private function doer() {
  print "Base::doer\n";
 }
}

class Derived extends Base {
 private function doer() {
  print "Derived::doer\n";
 }
}

$b = new Base;
$b->justdoit();

$d = new Derived;
$d->justdoit();

?>

```

Here's this same code example in C++ and it works:

```
class A {
    public:
        void justdoit();
    private:
        virtual void doit();
};

void A::justdoit() {
    doit();
}

void A::doit() {
    std::cout << "A::doit\n";
}

class B : public A {
    private:
        virtual void doit();
};

void B::doit() {
    std::cout << "B::doit\n";
}

int main() {
 A a;
 B b;
 a.justdoit();
 b.justdoit();
}

```

Output:

```
A::doit
B::doit

```

Funny thing is if I change my original PHP example and replace `private function` with `protected function` it starts working:

```
<?

class Base {
 public function justdoit() {
  $this->doer();
 }
 protected function doer() {
  print "Base::doer\n";
 }
}

class Derived extends Base {
 protected function doer() {
  print "Derived::doer\n";
 }
}

$b = new Base;
$b->justdoit();

$d = new Derived;
$d->justdoit();

?>

```

Output:

```
Base::doer
Derived::doer

```

Does anyone know why PHP and C++ produce different results and why does changing `private` to `protected` in PHP makes it produce the same result as C++?