マジックメソッド
- インスタンスがある特定の条件になったときに、明示的にcallしなくても暗黙的にcallされるメソッド。
- 名前の先頭2文字がアンダースコア(__)になっている。
- 必ずpublicで定義する必要あり。
- マジックメソッドの引数は参照渡しはできない。
<?php
class SampleClass
{
    private $values = array();
    //getter
    public function __get($name)
    {
        echo "__get: $name", PHP_EOL;
    }
    //setter
    public function __set($name, $value)
    {
        echo "__set: $name setted to $value", PHP_EOL;
        $this->values[$name] = $value;
    }
    //アクセス不能なプロパティにisset()を実行
    public function __isset($name)
    {
        echo "__isset: $name", PHP_EOL;
        return isset($this->values[$name]);
    }
    //アクセス不能なプロパティにunset()を実行
    public function __unset($name)
    {
        echo "__unset: $name", PHP_EOL;
        unset($this->values[$name]);
    }
    //アクセス不能なメソッドを呼び出す
    public function __call($name, $args)
    {
        echo "__call: $name", PHP_EOL;
    }
    public function __invoke($name)
    {
        echo "__invoke: $name", PHP_EOL;
    }
}
$obj = new SampleClass;
//アクセス不能プロパティに10を代入する
//__set()が呼ばれる
$obj->foo = 10;
//アクセス不能プロパティの$fooを取得する
//__get()が呼ばれる
$obj->foo;
var_dump(isset($obj->foo)); //true
//アクセス不能なプロパティに対してunset()を実行
//__unset()が呼ばれる
unset($obj->foo);
var_dump(isset($obj->foo)); //false
//アクセス不能なメソッドを呼び出す
//___call()が呼ばれる
$obj->bar();
遅延静的束縛(Late Static Bindings)
- 継承されたクラスのメソッドなどを親クラスで解決する機能
- 直近の 非転送コールのクラス名を保存します。
- 
staticキーワードをつける。
- 普通にインスタンスからアロー演算子でアクセスする時と同じような挙動になる。
非転送コール
- self:: や parent::、static:: による静的なコール
転送コール
- クラス名::といったクラス名を明示したコール
self::の制限
self:: あるいは __CLASS__による現在のクラスへの静的参照は、 そのメソッドが属するクラス (つまり、 その>メソッドが定義されているクラス) に解決されます。
<?php
class Foo
{
    public function helloGateway()
    {
        self::hello();
    }
    public static function hello()
    {
        echo __CLASS__, ' hello!', PHP_EOL;
    }
}
class Bar extends Foo
{
    public static function hello()
    {
        echo __CLASS__, ' hello!', PHP_EOL;
    }
}
$bar = new Bar();
//Fooを継承しhello()メソッドをオーバーライドしたBarクラスでも
//自分自身の親が持つメソッドを参照することができない。
$bar->helloGateway(); //Foo hello!
staticキーワードを用いることで、実行時に最初にコールされたクラスを参照する。
<?php
class Foo
{
    public function helloGateway()
    {
       static::hello(); //遅延静的束縛
    }
}
--------------------
$bar = new Bar();
$bar->helloGateway(); //Bar hello!
参考
公式ドキュメント
https://www.php.net/manual/ja/language.oop5.magic.php
https://www.php.net/manual/ja/language.oop5.late-static-bindings.php