0

PHP の OOP 継承に問題があります。私は動物とペンギンの 2 つのクラスを持っています。ペンギンは動物を拡張します。このような私のソースコード:

class Animal{
  public $type = "animal";

  function dance(){
    echo $this->type." dances!\n";
  }
}

と、

class Penguin extends Animal {
    private $type = "penguin";
}

そして、私のメインコードはこのようなものです;

include('animal.php');
include('private_penguin.php');

$tux = new Penguin();
$tux->type = "linux penguin";
$tux->dance();

これはすべて私のコードです。いくつかのチュートリアルで OOP を読みました。しかし、このコードのように、Fatal error: Access level to Penguin::$type must be public があります。しかし、私は持っていません。どちらが正しいですか!

Animal クラスの $type は public ですが、Penguin クラスは private です。

手伝って頂けますか!

4

4 に答える 4

3

outsideクラスからプライベート変数にアクセスすることはできません。例えば

class Penguin {
   function setType() {
      $this->type = 'penguin'; // works
   }
}

$tux->type = 'penguin'; // does not work

これが、プライベート変数を持つことの要点です。「外部」コードがオブジェクトの内部をいじるのを防ぐためです。

于 2013-02-26T05:44:19.640 に答える
1

子クラスの呼び出しを拡張または継承するときはいつでも、親のメソッドまたはプロパティが子からオーバーライドされます。あなたの場合、あなたのpublic $type = "animal";from animal.php はあなたの子供によってオーバーライドされています private $type = "penguin";

したがって$this->type、動物のクラスであっても、常にペンギンのクラスのキャラクターを持ちます (ペンギンのクラスで動物のクラスを拡張したため)。これは、オブジェクト指向プログラミングの非常に基本的な現象です。

于 2013-03-30T14:59:07.973 に答える
0

PHPで可視性を調べることができれば、そうなると思います。あなたが今行っているアクセスが許可されていない単純なプライベート変数。あなたができることは

class Penguin extends Animal {
    public $type = "penguin"; // else keep it as public without changing as in the Animal class
}

そうしないと

private $type以下に示すように、変数にアクセスするメソッドを記述できます。

参照しやすいようにドキュメントから抜粋

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; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private
于 2013-02-26T05:47:13.013 に答える
0

あなたのプライベート変数はPenguinclass 内にあります。したがって、このクラスの範囲外では使用できません。また、クラスを拡張している場合。メインページにもanimal.phpを含める必要はありません。private_penguin.php で拡張するためにのみ使用できます。

したがって、Penguin クラスのコードは次のようになります。

include('animal.php');   
 class Penguin extends Animal {
        private $type = "penguin";
        function getPrivateData()
        {
            echo $this->type;
        }
    }

その後、メインページで呼び出すことができます。

include('private_penguin.php');

$tux = new Penguin();
$tux->type = "linux penguin";
$tux->getPrivateData();

これはプライベート変数でそれを行います。

于 2013-02-26T05:56:14.287 に答える