Я говорю конкретно о публичных, частных и защищенных ключевых словах, которые могут применяться к свойствам и методам. Я везде искал, и я знаю, что они делают и как их использовать, но не понимаю, как они будут практичны при программировании. Может ли кто-нибудь объяснить или привести пример?
Основной целью инкапсуляции (области) является обеспечение того, чтобы вы пишете код, который нельзя сломать. Это применимо к области в целом, поэтому позвольте мне использовать более простой пример локальной переменной внутри функции:
function xyz ($x) { $y = 1; while ($y <= 10) { $array[] = $y * $x; $y++; } return $array; }
Цель этой функции – передать число и вернуть массив. Пример кода довольно простой. Чтобы функция xyz () была надежной, вам нужно гарантировать, что она делает то же самое каждый раз. Итак, что, если кто-то имел возможность со стороны изменить начальное значение $ y или $ array? Или даже $ x? Если бы вы могли сделать это из-за пределов функции, вы больше не могли гарантировать, что эта функция возвращается.
Именно здесь вступает в действие область (инкапсуляция). Это способ установки границ, назначения разрешений того, что может и не может быть сделано с вашими переменными (и функциями, свойствами, методами, объектами), чтобы убедиться, что бит кода всегда будет делать то, что ожидается от него ,
Возьмем, например, любую встроенную функцию php, такую как … strtolower () или preg_match () или … ну что угодно. Они ожидают, что аргументы будут переданы им, и они вернут что-то конкретное. Внутри есть переменные, циклы и т. Д. … для ввода и вывода вывода. Если бы вы могли изменить этот материал снаружи, не было бы никакого способа гарантировать, что strotolower () вернет строку с нижним регистром, которую вы ее подаете, и это побеждает цель использования многоразового кода.
Это не всегда полезно, когда вы программируете для себя, но когда вы пишете код, который будет использоваться и использоваться многими людьми, особенно с использованием кода, который включает в себя дополнения / плагины и т. Д., Это бесценно для обеспечения вашего код делает то, что он должен делать, и к нему обращаются / используются / называются ожидаемым образом.
Частные / защищенные методы используются на скомпилированных языках, таких как C ++ и Java. Если код скомпилирован, а оставленный в форме скрипта, эти правила подлежат исполнению. И на этих языках можно скрыть громоздкие внутренние или машинные уровни.
PHP имеет только эти функции, потому что его разработчики считали, что недостаток защищенных / частных методов имел в виду, когда люди высмеивали PHP4 как не являющийся надлежащим объектно-ориентированным языком.
Использование инкапсуляции в концепции дизайна в PHP является бесспорным. Использование этих языковых конструкций, однако, не является необходимым и может быть легко удалено в исходном коде в любом случае. Но вместо правильной документации библиотеки или если сопрограммщики не соблюдают стиль кодирования, полезно ограничить доступ.
Итак, в заключение: случай технического использования скудный, поощряя использовать обозначенные интерфейсы для абстрактных процессов в порядке. Часто, однако, более разумно разрабатывать API-интерфейсы таким образом, чтобы обеспечить доступность всех желаемых функциональных возможностей и данных, поэтому уменьшается доступ к посторонним интерналам. Чем больше вы раскрываете, тем труднее будет изменить внутреннюю обработку позже. Более неотъемлемые данные, которые вы раскрываете, становятся менее обходными или запутанными объектными структурами.
Я думаю, что Грэди Буч подводит итог:
«инкапсуляция служит для разделения контрактного интерфейса абстракции и ее реализации»
вы можете найти приятное обсуждение здесь же. Хотя это связано с .net (не на php), но все же обсуждение довольно общее, которое также включает обсуждение статьи в википедии.