Статьи

Объектно-ориентированное программирование в WordPress: Scope

Продолжая наше обсуждение объектно-ориентированного программирования в WordPress, мы должны начать говорить об идее области видимости. Короче говоря, это относится к идее о том, что классы могут контролировать доступ к их атрибутам и функциям (или даже к ним можно получить доступ).

Это еще одна основная идея объектно-ориентированного программирования, после которой мы должны быть в хорошей форме, чтобы начать работу над реальным плагином WordPress.

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

  1. Введение
  2. Классы
  3. Типы
  4. Управляющие структуры: условные высказывания
  5. Управляющие структуры: петли
  6. Функции и атрибуты

Как только вы все пойманы, давайте продолжим наше обсуждение последней части парадигмы, необходимой нам для понимания, прежде чем мы начнем практическое применение объектно-ориентированного программирования в WordPress.

Согласно Википедии , первое определение объема выглядит следующим образом:

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

Если вы не опытный программист, это немного сбивает с толку, не так ли? На самом деле, это может даже читать как жаргон.

Но это нормально, потому что цель этой статьи — дать рабочее определение области действия, а также некоторые практические примеры того, как она выглядит в контексте программы.

Итак, прежде чем мы рассмотрим три различных аспекта области видимости в объектно-ориентированном программировании, давайте сформулируем более четкое определение.

Короче говоря, область действия относится к тому, как переменные и функции могут быть доступны из сторонних объектов или дочерних объектов в программе.

Например, скажем, что у вас есть объект BlogPost объект Author . Далее, допустим, что у автора есть атрибуты для first_name и last_name и BlogPost хочет получить к ним доступ, чтобы, скажем, отобразить их на экране.

Возможно, иллюстрация высокого уровня поможет:

В этом посте BlogPost запрашивает информацию об имени из класса Author . Обратите внимание, что на диаграмме выше имя класса находится в первом блоге, атрибуты во втором блоке, а затем пустые третьи блоки обычно зарезервированы для функций.

Но это выходит за рамки этой статьи.

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

Для этого переменным и функциям должна быть предоставлена ​​определенная область, которая предоставляет другим объектам доступ к их информации. К объектам этого типа относятся сторонние объекты, которые хотят использовать данные, представленные классом, а объект другого типа представляет объект, который наследует информацию из этого класса.

Наследование выходит за рамки того, что мы собираемся осветить в этой конкретной статье; однако мы расскажем об этом чуть позже в этой серии для тех, кто является новичком в объектно-ориентированном программировании.

Итак, с учетом вышесказанного мы готовы взглянуть на практический пример области применения, включая то, как мы использовали его до сих пор в этой серии и как это влияет на дальнейшее развитие проектных решений.

Учебник выше должен был объяснить, по крайней мере, на высоком уровне, что такое область и как это важно, но если нет, то, возможно, следующие разделы будут.

В частности, мы собираемся взглянуть на каждый из типов областей, которые могут иметь переменные и функции, мы объясним, что означает каждая из них, а затем мы объясним, когда вы захотите использовать каждый из них.

Прежде чем двигаться дальше, обратите внимание, что public , protected и private ключевые слова могут использоваться для определения как атрибутов, так и функций. Это важно, потому что правила, которые применяются к атрибутам, также применимы к функциям.

С учетом сказанного, давайте посмотрим на каждое из ключевых слов.

Проще говоря, public атрибуты и функции доступны для каждого типа объекта, который пытается получить доступ к переменной или функции.

Например:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
class Author {
 
    public $first_name;
     
    public $last_name;
     
    public function set_first_name( $name ) {
        $this->first_name = $name;
    }
  
    public function set_last_name( $name ) {
        $this->last_name = $name;
    }
  
    public function get_first_name() {
        return $this->first_name;
    }
     
    public function get_last_name() {
        return $this->last_name;
    }
     
    // Other class details…
     
}

При такой настройке любой объект, который вызывает экземпляр этого объекта, может не только получить доступ к атрибутам $first_name и $last_name , но и изменить их. Точно так же любой объект, который вызывает экземпляр объекта, может получить доступ к функциям для получения имени и изменения имени.

Таким образом, возникает вопрос: какой смысл иметь эти функции, если атрибут обнародован? Я имею в виду, это избыточно, не так ли? Да. И мы ответим на это позже в этой статье, как только поговорим о private ключевом слове.

Далее, protected атрибуты и функции доступны в контексте класса, в котором они определены, но не для сторонних объектов. Тем не менее, они можно вызывать из своего собственного класса, но не из внешних классов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
class Author {
 
    protected $first_name;
     
    protected $last_name;
     
    protected function set_first_name( $name ) {
        $this->first_name = $name;
    }
  
    protected function set_last_name( $name ) {
        $this->last_name = $name;
    }
  
    protected function get_first_name() {
        return $this->first_name;
    }
     
    protected function get_last_name() {
        return $this->last_name;
    }
     
    // Other class details…
     
}

Но есть исключение: подклассы.

Например, предположим, что вы определяете класс с именем Contributor который является подклассом Author , это означает, что Contributor имеет доступ ко всем protectedpublic ) атрибутам и функциям своего родительского класса.

01
02
03
04
05
06
07
08
09
10
<?php
 
class Contributor extends Author {
 
    /**
     * This class has access to all of the attributes
     * and functions of its parent class, Author.
     */
      
}

Учитывая приведенный выше код, это означает, что вы можете вызывать методы, такие как get_first_name() из класса Author или из класса Contributor но не из каких-либо внешних классов.

Следует признать, что подклассы больше связаны с наследованием, о чем мы поговорим позже в этой серии; тем не менее, я привожу это, чтобы дать важное разъяснение между public атрибутами и функциями и private атрибутами и функциями.

короче говоря, private атрибуты и функции блокируют атрибуты и функции в классе, в котором они определены. Это означает, что ни один внешний объект или подклассы не могут получить доступ к какой-либо информации.

Ясно, что это самая строгая форма области видимости, но ее не следует читать так, как будто это плохо (или хорошо). Вместо этого он предназначен для предоставления определенной информации возможности оставаться скрытой (или абстрагированной) в контексте класса, в котором она определена.

Возвращаясь к нашему первому примеру, давайте посмотрим, как мы можем реорганизовать класс таким образом, чтобы он обеспечивал максимальную полезность как для внешних классов, так и для подклассов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
class Author {
 
    private $first_name;
     
    private $last_name;
     
    private function set_first_name( $name ) {
        $this->first_name = $name;
    }
  
    private function set_last_name( $name ) {
        $this->last_name = $name;
    }
  
    private function get_first_name() {
        return $this->first_name;
    }
     
    private function get_last_name() {
        return $this->last_name;
    }
     
    // Other class details…
     
}

Во-первых, этот пример демонстрирует плохое использование ключевого слова private .

В этом примере не только недоступны атрибуты, но и функции недоступны. Другими словами, для других объектов во «внешнем мире» этот класс, кажется, не имеет ничего доступного. Хуже того, даже подклассы не могут получить доступ к этой информации.

Короче говоря, код не имеет смысла.

Итак, давайте немного изменим рефакторинг, чтобы атрибут оставался скрытым (и, следовательно, недоступным для сторонних объектов), и мы укажем способ для сторонних объектов извлекать имена, но позволят только фактический класс и его подклассы, чтобы изменить их:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?php
 
class Author {
 
    protected $first_name;
     
    protected $last_name;
  
    public function get_first_name() {
        return $this->first_name;
    }
     
    public function get_last_name() {
        return $this->last_name;
    }
     
    // Other class details…
     
}

Конечно, это всего лишь пример. Очевидно, что мы упускаем некоторые детали реализации, так что мы не делаем знать, какие детали могут потребовать, скажем, имена для обновления.

Но это не имеет значения: это показывает полный пример того, как private , protected и public аспекты класса могут работать совместно друг с другом, чтобы обеспечить безопасный, стратегический способ доступа к информации.

Что касается сферы действия, вы можете утверждать, что все сводится к абстракции и сокрытию информации.

То есть классы (которые являются чертежами объекта, если вы помните из наших предыдущих статей) должны стратегически организовать свою информацию так, чтобы:

  • информация, которая должна быть только доступной и актуальной для нее, должна оставаться private
  • информация, которая должна быть доступна сама по себе, и ее подклассы должны быть защищены
  • информация, которая должна быть доступна сторонним объектам, должна быть общедоступной

На самом деле, я сделаю еще один шаг и скажу, что вы вряд ли увидите множество атрибутов, помеченных как public . Вместо этого вы с большей вероятностью увидите атрибуты, помеченные как protected — для целей подклассов — или private , так что их данные могут управляться с помощью функций, которые имеют соответствующую область видимости.

Изначально это звучит относительно просто, правда? И сама концепция не очень сложна, но когда дело доходит до создания систем, которые полагаются на множество различных объектов, работающих вместе для обеспечения надежной абстракции, чистых интерфейсов, с помощью которых сторонние классы и подклассы могут взаимодействовать с ним, и эффективных способов Организация информации может стать более сложной — есть много движущихся частей для рассмотрения.

С учетом сказанного, это одна из тех вещей, которые написание кода, взаимодействие с другими разработчиками и чтение кода могут порождать опыт.

Что бы это ни стоило, я не боюсь признать, что это все еще стратегии, с которыми я борюсь не потому, что не понимаю концепции, а потому, что попытка обеспечить максимально чистую реализацию класса может быть трудной, особенно в системе. это может измениться.

Но это содержание для другого поста.

Конечно, если у вас есть вопросы или комментарии по поводу предметной области, не стесняйтесь оставлять их в комментариях.

Начиная с следующей статьи, мы собираемся включить часть этой информации в практическое приложение для создания плагина WordPress.

Таким образом, для тех из вас, кто ждал, чтобы увидеть, как эта серия работает в сочетании с WordPress, следующая статья должна начать объединять все концепции, поскольку мы продолжим серию с нашим собственным плагином WordPress, используя концепцию объектно-ориентированного программирования. ,