PHP. Позднее статическое связывание

21.03.2019

Теги: PHPWeb-разработкаКласс

Позднее статическое связывание дает возможность унаследованным методам класса иметь доступ к статическим методам, свойствам и константам класса потомка, а не только родительского класса. Рассмотрим пример:

class Abc {
    const NAME = 'ABC';
    public function getName() {
        return self::NAME;
    }
}
class Xyz extends Abc {
    const NAME = 'XYZ';
}

$abc = new Abc();
$xyz = new Xyz();

echo $abc->getName(), "\n";
echo $xyz->getName(), "\n";

Этот код выдаст такой результат:

ABC
ABC

Класс Xyz унаследовал метод getName(), но при этом self все еще указывает на класс, в котором оно используется. И рассмотрим новый пример:

class Abc {
    const NAME = 'ABC';
    public function getName() {
        return static::NAME;
    }
}
class Xyz extends Abc {
    const NAME = 'XYZ';
}

$abc = new Abc();
$xyz = new Xyz();

echo $abc->getName(), "\n";
echo $xyz->getName(), "\n";

Этот код выдаст такой результат:

ABC
XYZ

Ключевое слово static указывает, что необходимо использовать константу унаследованного класса, вместо константы, которая была определена в классе, где объявлен метод getName().

Основное отличие между этими двумя способами доступа (и причина, почему связывание назвали поздним), в том, что PHP определят значение для self::NAME во время «компиляции» (когда символы PHP преобразуются в машинный код, который будет обрабатываться движком), а для static::NAME значение будет определено в момент запуска (в тот момент, когда машинный код будет выполнятся в движке).

Еще один пример — доступ к статическому методу класса потомка:

<?php
class Abc {
    public function __construct() {
        self::who();
    }

    public static function who() {
        echo __CLASS__, "\n";
    }
}

class Xyz extends Abc {
    public static function who() {
        echo __CLASS__, "\n";
    }
}

$abc = new Abc();
$xyz = new Xyz();
Abc
Abc
<?php
class Abc {
    public function __construct() {
        static::who();
    }

    public static function who() {
        echo __CLASS__, "\n";
    }
}

class Xyz extends Abc {
    public static function who() {
        echo __CLASS__, "\n";
    }
}

$abc = new Abc();
$xyz = new Xyz();
Abc
Xyz

Поиск: PHP • Web-разработка • Класс • static • self

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.