PHP

PHP 親・子クラスのプロパティの関係を整理する

PHP

 

子クラスが親クラスのプロパティを上書きするケース

 

client.php

<?php

require './ChildClass.php';

$instance_child = new ChildClass();
echo $instance_child->getName();

 

ChildClass.php

<?php

require './ParentClass.php';

class ChildClass extends ParentClass
{
    public $name = "child";
}

ParentClass.php

<?php

class ParentClass
{
    public $name = "parent";

    public function getName()
    {
        return $this->name;
    }
}

 

php client.php

結果

child

 

 

子クラスが親クラスのプロパティをメソッドで参照するケース

 

client.php

<?php

require './ChildClass.php';

$instance_child = new ChildClass();
echo $instance_child->getName();
echo $instance_child->getParentName();

 

ChildClass.php

<?php

require './ParentClass.php';

class ChildClass extends ParentClass
{
    public $name = "child\n";

    public function getName()
    {
        return $this->name;
    }

    public function getParentName()
    {
        return parent::getName();
    }
}

 

ParentClass.php

<?php

class ParentClass
{
    public $parent_name = "parent\n";

    public function getName()
    {
        return $this->parent_name;
    }
}

 

php client.php

結果

child
parent

 

 

子クラスから親クラスのプロパティを上書きする

 

 

client.php

<?php

require './ChildClass.php';

$instance_child = new ChildClass();
$instance_child->setName("child\n");
echo $instance_child->getName();

 

ChildClass.php

<?php

require './ParentClass.php';

class ChildClass extends ParentClass
{
    public function setName(string $string)
    {
        $this->parent_name = $string;
    }
}

ParentClass.php

<?php

class ParentClass
{
    public $parent_name = "parent\n";

    public function getName()
    {
        return $this->parent_name;
    }
}

 

php client.php

結果

child

 

上記から、ParentClass::$parent_nameのアクセス修飾子をprivateにする

 

<?php

class ParentClass
{
    private $_parent_name = "parent\n"; //  ●publicからprivateに変更 ... 子クラスからの変更を許さない

    public function getName()
    {
        return $this->_parent_name;
    }
}

 

結果

parent

setName()での書き換えが出来ていないことが確認できます。

 

上記から、ParentClass::$parent_nameのアクセス修飾子をprotectedにする

 

<?php

class ParentClass
{
    protected $parent_name = "parent\n"; //  ●privateからprotectedに変更 ... 子クラスからの変更を許す

    public function getName()
    {
        return $this->parent_name;
    }
}

 

結果

child

書き換えができた

 

staticによる親・子別のプロパティ参照

 

client.php

<?php

require './ChildClass.php';

$instance_child = new ChildClass();
echo $instance_child->getName();

ParentClass.php

<?php

class ParentClass
{
    static protected $name = "parent\n";
}

ChildClass.php

<?php

require './ParentClass.php';

class ChildClass extends ParentClass
{
    static public $name = "child\n";

    public function getName()
    {
        echo self::$name;
        echo parent::$name;
    }
}

 

結果

child
parent

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)