PHPでオーバーライドすると、関係ないメソッドの動作が変わるかも

サブクラスでメソッドをオーバーライドし、そのメソッドを呼んでいるメソッドがスーパークラスにあると、そのメソッドの動作もが変わってしまう場合があるようだ。

<?php
class ClassA {
  function hoge() {
    print("hoge\n");
  }
  function callHoge() {
    $this->hoge();
  }
}
class ClassB extends ClassA {
  function hoge() {
    print("HOGE\n");
  }
}

$hoge = new ClassB();
$hoge->hoge();
$hoge->callHoge();
?>

出力結果:

HOGE
HOGE

PHPのクラスで自身のメソッドを利用する場合は$this->method()と書くのだが、この$thisは、インスタンスの自身を指すようだ。メソッド名だけを記述するとFatal error: Call to undefined functionになる。
ちなみに、やりたい事をC++で書くとこんな感じ。

#include<iostream>

using std::cout;
using std::endl;

class ClassA {
public:
  void hoge() {
    cout << "hoge" << endl;
  }
  void callHoge() {
    hoge(); // あるいはthis->hoge()でも同様
  }
};
class ClassB : public ClassA {
public:
    void hoge() {
    cout << "HOGE" << endl;
  }
};

int main() {
  ClassB *hoge = new ClassB();
  hoge->hoge();
  hoge->callHoge();
  delete hoge;
  return 0;
}

出力結果:

HOGE
hoge

クラスの自身を指すにはselfが使えるが、

  function callHoge() {
    self::hoge();
  }

と書いてもFatal error: Undefined class name 'self'となってしまう。どうやらselfはフィールドにだけ使えるらしい。でもClassBからparent::hoge()は使える。

  function callHoge() {
    ClassA::hoge();
  }

とクラス名を明示すれば期待通りに動くんだけど……。
だいたいなんで自身のメソッドを利用するのにオブジェクトやら名前空間やらが必要なんだ。メソッド名だけでアクセスさせてくれよ。何か方法があるのだろうか。