<?php

class Foo
{
    const NAME = 'Foo';

    //Always Foo::NAME (Foo) due to self
    protected static $staticName = self::NAME;

    public function __construct()
    {
        echo $this::NAME;
    }

    public function getStaticName()
    {
       echo $this::$staticName;
    }
}

class Bar extends Foo
{
    const NAME = 'FooBar';

    /**
     * override getStaticName to output Bar::NAME
     */
    public function getStaticName()
    {
        $this::$staticName = $this::NAME;
        parent::getStaticName();
    }
}

$foo = new Foo; //outputs Foo
echo PHP_EOL;
$bar = new Bar; //outputs FooBar
echo PHP_EOL;
$foo->getStaticName(); //outputs Foo
echo PHP_EOL;
$bar->getStaticName(); //outputs FooBar
echo PHP_EOL;
$foo->getStaticName(); //outputs FooBar