PHPオブジェクト指向のかんたんな問題(protected / private の違いを確かめる)

PHP5系以降はオブジェクト指向プログラミングでの開発が可能になった。
オブジェクト指向が苦手なひとにこそ、protectedとprivateの違いを理解しているか確認問題として使って欲しい。

以下のコードを実行した際、
l.31 echo $obj->public;
l.34 $obj2->printHello();
l.35 $obj2->printPrivate();
はそれぞれどう出力するか?

<?php

class MyClass {
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello() {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
# echo $obj->public;
# echo $obj->protected; // cannot access
# echo $obj->private; // cannot access
# $obj->printHello();
class MyClass2 extends MyClass {

    protected $protected = 'Protected2';
    private $private = 'Private2';

    function printPrivate() {
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public;
# echo $obj2->private;
# echo $obj2->protected;
$obj2->printHello();
$obj2->printPrivate();


解答は実際に実行して確かめてみてください。