PHP: Какова цель инкапсуляции? - PullRequest
2 голосов
/ 05 сентября 2010

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

Ответы [ 4 ]

7 голосов
/ 05 сентября 2010

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

function xyz ($x) {
  $y = 1;
  while ($y <= 10) {
    $array[] = $y * $x;
    $y++;
  }
  return $array;
}

Цель этой функции - передать число и вернуть массив. Пример кода довольно прост. Чтобы функция xyz () была надежной, вам нужно гарантировать, что она каждый раз делает одно и то же. Так что, если бы кто-то имел возможность изменить это начальное значение массива $ y или $? Или даже $ х? Если бы вы могли сделать это извне функции, вы больше не могли бы гарантировать, что возвращает эта функция.

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

Возьмем, к примеру, любую встроенную функцию php, например ... strtolower () или preg_match () или ... ну что угодно. Они ожидают, что им будут переданы аргументы, и они возвращают что-то конкретное. Внутри есть переменные, циклы и т. Д. Для ввода и вывода результатов. Если бы вы могли изменить этот материал извне, не было бы никакого способа гарантировать, что strotolower () вернет строку в нижнем регистре, которую вы ей передаете, и это лишает смысла иметь повторно используемый блок кода.

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

1 голос
/ 05 сентября 2010

Закрытые / защищенные методы используются в скомпилированных языках, таких как C ++ и Java. Если код скомпилирован, а не оставлен в форме сценария, эти правила вступают в силу. И в этих языках, в частности, могут скрываться громоздкие реализации на внутреннем или машинном уровне.

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

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

0 голосов
/ 22 мая 2012

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

0 голосов
/ 05 сентября 2010

Я думаю, что Грэди Буч резюмирует это довольно хорошо:

"инкапсуляция служит для разделения договорного интерфейса абстракции и его реализации"

...