親の親(継承元の継承元)のメソッドを呼び出す方法

$grandParent = get_parent_class(get_parent_class($this));
$grandParent::parent_parent_method();

こんなコードでできる。
ただ、そもそも親の親を孫が直接呼び出すとか
オブジェクト思考の考え方からすれば変だと思う。

例えば

<?php
// おじいちゃん
class GrandParentClass{
	function TestMethod(){
		echo 'hoge';
	}
}

// おとん
class ParentClass extends GrandParentClass{
	function TestMethod(){
		parent::TestMethod();	// GrandParentClass::TestMethod();
		
		// 以下、ChildClass から呼び出されたくない処理
		echo 'fool !';
	}
}

// おれ
class ChildClass extends ParentClass{
	function TestMethod(){
		parent::TestMethod();	// ParentClass::TestMethod();
	}
}

こんな感じで継承していたとして

ChildClass::TestMethod

から

echo 'fool !';

を呼び出したくなかったら

<?php
// おじいちゃん
class GrandParentClass{
	function TestMethod(){
		echo 'hoge';
	}
}

// おとん
class ParentClass extends GrandParentClass{
	function TestMethod(){
		parent::TestMethod();	// GrandParentClass::TestMethod();
		
		// 以下、ChildClass から呼び出されたくない処理
		// 別のメソッドに切り出す
		$this->PrintFool();
	}
	
	// 呼び出されたくない処理を切り出したメソッド
	function PrintFool(){
		echo 'fool !';
	}
}

// おれ
class ChildClass extends ParentClass{
	function TestMethod(){
		parent::TestMethod();	// ParentClass::TestMethod();
	}
	
	function PrintFool(){
		// 処理を上書きして、何もしないようにする
	}
}

こんなかんじにすればいいと思う。

…とはいえ、会社や学校のコード規約とか
なんか暗黙の了解とか色々あって親クラスのメソッドを
切り分けるとかできないケースがあります。
僕も、会社でそんなケースにあたったので
最初に書いたような親の親のメソッドを
直接呼び出すコードを使って回避したのでした。