В PHP оператор разрешения области видимости, или двойное двоеточие ::, позволяет получить доступ к константам, статическим свойствам и методам, а также к переопределенным свойствам и методам. В наших предыдущих статьях мы создали пару констант, но на самом деле никогда не обращались к ним.
Если вы обращаетесь, например, к константе вне класса, вы должны добавить оператор с двойным двоеточием к созданному объекту или даже к имени класса. Если вы обращаетесь к постоянному или переопределенному свойству или методу внутри класса, вы должны использовать ключевое слово self, parent или static. . В этой статье мы рассмотрим self и parent; мы рассмотрим static в следующем.
Self используется для доступа к константе внутри самого класса, а parent используется для доступа к унаследованной константе или переопределенному свойству или методу.
Подведение итогов. У нас есть следующие классы:
- "Немецкая овчарка"
- "Собака"
- Млекопитающее
- Животное
- "Машина"
- "Транспортное средство"
Каждый из этих классов является собственным файлом. Если вам нужно просмотреть их, нажмите на их ссылки выше, чтобы увидеть классы.
Родитель
Мы начнем с создания нового файла и установки нашего класса GermanShepherd.
Заглянув внутрь нашего класса GermanShepherd, мы увидим, что он имеет две константы: HAS_HEART и HAS_TAIL. На самом деле константа HAS_TAIL расположена в классе Dog, а константа HAS_HEART — в классе Animal. Благодаря наследованию они доступны в классе GermanShepherd.
Давайте попробуем var_dump()нашу константу HAS_HEART.
Запустив приведенное выше приложение, мы получим true.
Нам не нужно создавать экземпляр объекта, чтобы вызвать его. Все, что нам нужно сделать, это использовать имя класса, за которым следует двойное двоеточие, а затем имя константы. Глядя на наш класс автомобиля, у нас есть три константы: HAS_HEADLIGHTS, HAS_TAIL_LIGHTS и HAS_TURN_SIGNALS.
Давайте вызовем константу HAS_HEADLIGHTS без создания экземпляра объекта Car и посмотрим, возможно ли это.
Сброс приведенной выше константы дает следующий результат: true. Это работает, потому что константы принадлежат классу, а не объекту.
Часто используется пример с банковским счетом. У вас будет константа с именем NUMBER_OF_ACCOUNTS внутри вашего класса BankAccount. Каждый раз, когда открывается банковский счет, сумма денег, принадлежащая этому банковскому счету, сохраняется для этого объекта. Эти деньги принадлежат объекту. Количество счетов увеличивается, поскольку банку необходимо знать, сколько всего банковских счетов существует. Константа NUMBER_OF_ACCOUNTS принадлежит классу, а не объекту.
Давайте посмотрим, какие другие примеры мы можем сделать с оператором двойного двоеточия. В предыдущей статье мы рассмотрели Переопределение метода, где мы переопределили метод Dog walk() в нашем классе GermanShepherd.
Что, если бы мы захотели отобразить «Я ходячая немецкая овчарка» и все, что возвращает метод Dog walk()? Здесь мы можем использовать ключевое слово parent для доступа к методу walk() в родительском классе.
Во-первых, мы изменим метод walk() на вывод строки, а затем вернем выходные данные метода Dog walk().
Запуск кода дает нам следующий результат: Я гуляющая немецкая овчарка Я гуляющая собака.
Пройдитесь по коду, чтобы убедиться, что он закрепился у вас в голове:
- Создан экземпляр класса GermanShepherd.
- Вызывается метод $gs_dog-›walk().
- PHP входит в метод walk() в классе GermanShepherd и видит оператор echo. Это эхо: «Я ходячая немецкая овчарка».
- Затем PHP видит оператор return для parent::walk().
- PHP входит в родительский класс Dog и выполняет оператор walk() в классе Dog, который возвращает «Я гуляю с собакой».
Обычно вы этого не делаете. Это просто пример, чтобы показать вам, что это работает.
Себя
Как получить доступ к константам внутри самого класса? С помощью ключевого слова self. Допустим, мы хотели получить доступ к константе HAS_HEART внутри нашего метода GermanShepherd bark(). Мы можем отобразить содержимое с помощью вызова self::HAS_HEART.
Чтобы увидеть результаты, давайте создадим экземпляр класса GermanShepherd и вызовем метод bark().
Мы получим следующий результат: Has Heart: true. Громкий лай.
Опять же, вы, возможно, заметили, что константа HAS_HEART не находится внутри класса GermanShepherd; он живет в классе Animal. Пока существует правильная цепочка наследования, GermanShepherd имеет к ней доступ.
Думайте о self как о замене $this на постоянном уровне. Допустим, внутри нашего класса GermanShepherd существует константа. Если бы это было так, self вызвал бы его там. Родительский пропустит его и начнет искать в нашем родительском классе.
Дино Кайич в настоящее время является руководителем отдела информационных технологий в компаниях LSBio (LifeSpan BioSciences, Inc.), Absolute Antibody, Kerafast, Everest BioTech, Nordic MUbio и Exalpha. Он также является генеральным директором MyAutoSystem. Он имеет более чем десятилетний опыт разработки программного обеспечения. У него есть B.S. в области компьютерных наук и несовершеннолетнего в области биологии. Его опыт включает в себя создание приложений для электронной коммерции на уровне предприятия, разработку программного обеспечения на основе исследований и содействие распространению знаний посредством письма.
Вы можете связаться с ним в LinkedIn, подписаться на него в Instagram или подписаться на его публикацию в Medium.