belarusweb.net
© Петр Романовский Минск, 2016-2017.



belarusweb.net

Основы создания сайтов...
PHP+MySQL >>>
                          Учебник Задачник Справочник

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

В PHP статические ссылки на текущий класс, такие как self::, вычисляются исходя из области видимости того класса, в котором они были определены, а не вызваны. Поэтому при наследовании методов с такими ссылками может возникнуть ситуация, когда нужно будет использовать область видимости класса-потомка, вызывающего данный метод, а не область видимости родительского класса. Для таких случаев предусмотрена возможность позднего статического связывания, заключающаяся в использовании вместо конструкции self:: специальной конструкции static::, которая отслеживает и ссылается на текущую область видимости (см. пример 6.22).

<?php
class A{
	public static function my_func_1(){
      echo 'Класс А'.'<br>';
   }
   public static function my_func_2(){
      self::my_func_1();
   }
}

class B extends A {
    public static function my_func_1(){	//Переопределяем метод
        echo 'Класс B'.'<br>';
    }
}

B::my_func_2(); //Выведет 'Класс А', т.к. функция my_func_2 использует  
					 //статическую ссылку self::, которая использует область видимости
					 //того класса, в котором она была определена, а не используется

//Используем позднее статическое связывание					 
class C{
	public static function my_func_1(){
      echo 'Класс C';
   }
   public static function my_func_2(){
      static::my_func_1();
   }
}

class D extends C {
    public static function my_func_1(){	//Переопределяем метод
        echo 'Класс D';
    }
}

D::my_func_2();//Выведет 'Класс D', т.к. функция my_func_2 использует позднее
					//статическое связывание при помощи ссылки static::, которая использует 
					//область видимости класса, в котором она используется, а не определена
?> 

Пример 6.22. Использование позднего статического связывания

Конструкция static::, использующаяся для позднего статического связывания, предназначена для ссылки на статические поля (т.е. свойства и методы) класса. Поэтому, во избежание получения результатов отличных от ожидаемых, не следует использовать ее в нестатическом контексте.

Контрольные вопросы и задания

  1. Для чего используется конструкция static::?

Словарь новых английских слов

one-off [wʌnˈɒf] – одноразовый.
partial [ˈpɑːʃ(ə)l] – частичный.
class [klɑːs] – класс.
new [njuː] – новый.
empty [ˈempti] – пустой.
constant [ˈkɒnst(ə)nt] – константа.
person [ˈpəːs(ə)n] – личность, персона.
object [ˈɒbdʒɪkt] – объект.
method [ˈmɛθəd] – метод.
property [ˈprɒpəti] – свойство.
public [ˈpʌblɪk] – открытый, общественный.
protected [prəˈtektɪd] – защищенный.
private [ˈprʌɪvət] – закрытый, частный.
this [ðɪs] – это, этот.
static [ˈstatɪk] – статичный, неподвижный.
extend [ɪkˈstɛnd] – расширять.
self [self] – собственный.
parent [ˈpɛːr(ə)nt] – родитель, предок.
exit [ˈeksɪt] – выход, выйти.
nest [nest] – вставлять один предмет в другой.
final [ˈfʌɪn(ə)l] – заключительный, окончательный.
construct [kənˈstrʌkt] – создавать, конструировать.
destruct [dɪˈstrʌkt] – разрушать, уничтожать.
descendant [dɪˈsɛnd(ə)nt] – потомок.
abstract [ˈæbstrækt] – абстрактный, отвлеченный.
interface [ˈɪntəfeɪs] – интерфейс, область контакта.
implement [ˈɪmplɪment] – осуществлять, реализовывать.
trait [treɪt] – особенность, черта.
use [ˈjuːs] – употреблять, использовать.
instead [ɪnˈstɛd] – вместо, взамен.
as [æz] – как.
anonymous [əˈnɒnɪməs] – безымянный, анонимный.
clone [kləʊn] – клон, двойник.
set [set] – устанавливать.
unset [ʌnˈsɛt] – удалять.
get [ɡet] – получать.
call [kɔːl] – вызывать, звать.

Комментарии (0)
Петр Романовский
1. Приветствуются комментарии, которые содержат дополнения к материалу текущей страницы, а также ваши ответы на вопросы других пользователей.
2. Если вам что-то непонятно - спрашивайте, не забывая написать, что именно и с какого места.
Показаны все комментарии
Чтобы оставить свой комментарий, авторизуйтесь, пожалуйста!    
     
belarusweb.net © Петр Романовский, Минск, 2016-2017.
Связаться с автором
Наверх