PHP

PHPの親クラスと子クラスに同じ定数(const)があった時のselfとstaticの違い。

  • selfの場合、親にしかないメソッド呼んだときは親の定数が使われる。
  • staticの場合、親にしかないメソッドでも子の方が採用。
<?php
class OYA {
    const TEST = '親';

    public function getSelfOverride() {
        return self::TEST;
    }

    public function getSelfOya() {
        return self::TEST;
    }

    public function getStaticOverride() {
        return static::TEST;
    }

    public function getStaticOya() {
        return static::TEST;
    }

}

class KO extends OYA {
    const TEST = '子'; 

    public function getSelfOverride() {
        return self::TEST;
    }

    public function getSelfKo() {
        return self::TEST;
    }

    public function getStaticOverride() {
        return static::TEST;
    }

    public function getStaticKo() {
        return static::TEST;
    }    
}

var_dump(phpversion() === "7.0.15-0ubuntu0.16.04.4");

var_dump(OYA::TEST === '親');
var_dump(KO::TEST  === '子');

$ko = new KO;
var_dump($ko::TEST === '子');

var_dump($ko->getSelfOverride() === '子');
var_dump($ko->getSelfKo()       === '子');
var_dump($ko->getSelfOya()      === '親');

var_dump($ko->getStaticOverride() === '子');
var_dump($ko->getStaticKo()       === '子');
var_dump($ko->getStaticOya()      === '子');