Что такое инкапсуляция с простым примером в php?
Инкапсуляция – это просто перенос некоторых данных в объект. Термин «инкапсуляция» часто используется взаимозаменяемо с «скрытием информации». В Википедии есть хорошая статья .
Вот пример из первой ссылки в поиске Google для «инкапсуляции php» :
<?php class App { private static $_user; public function User( ) { if( $this->_user == null ) { $this->_user = new User(); } return $this->_user; } } class User { private $_name; public function __construct() { $this->_name = "Joseph Crawford Jr."; } public function GetName() { return $this->_name; } } $app = new App(); echo $app->User()->GetName(); ?>
Инкапсуляция – это механизм, который связывает вместе код и данные, которыми он управляет, и сохраняет как безопасные от внешних помех, так и неправильное использование. Обертка данных и методов в один блок (называемый классом) называется инкапсуляцией. Преимущество инкапсуляции заключается в том, что она выполняет задачу внутри, не заставляя вас беспокоиться.
Инкапсуляция – это способ хранения объекта или данных как свойства внутри другого объекта , так что внешний объект имеет полный контроль над тем, как можно обращаться к внутренним данным или объектам.
Например
class OuterClass { private var $innerobject; function increment() { return $this->innerobject->increment(); } }
У вас есть дополнительный слой вокруг объекта, который инкапсулирован, что позволяет внешнему объекту контролировать доступ к внутреннему объекту. Это, в сочетании с созданием внутреннего объекта / свойства private
, позволяет скрывать информацию .
encapsulation: Инкапсуляция представляет собой концепцию обертывания или связывания связанных элементов данных и методов в одном модуле, известном как инкапсуляция.
вот правильный пример инкапсуляции
<?php class person { public $name; public $age; function __construct($n, $a) { $this -> name = $n; $this -> age = $a; } public function setAge($ag) { $this -> ag = $ag; } public function display() { echo "welcome " . $this -> name . "<br/>"; return $this -> age - $this -> ag; } } $person = new person("Pankaj", 25); $person -> setAge(10); echo "You are " . $person -> display() . " years old"; ?>
Люди, похоже, смешивают детали объектной ориентации с инкапсуляцией, которая является гораздо более старой и более широкой концепцией. Инкапсулированная структура данных
Вы можете делать инкапсуляцию практически на любом языке, и вы получаете огромные преимущества с точки зрения модуляции и ремонтопригодности.
Инкапсуляция – это механизм защиты для вашего класса и структуры данных. Это делает вашу жизнь намного проще. С помощью Encapsulation у вас есть элемент управления доступом и установки параметров и методов класса. У вас есть контроль, чтобы сказать, какая часть видима аутсайдерам и как можно установить параметры ваших объектов.
Доступ и настройка параметров класса
(Хороший способ)
<?php class User { private $gender; public function getGender() { return $this->gender; } public function setGender($gender) { if ('male' !== $gender and 'female' !== $gender) { throw new \Exception('Set male or female for gender'); } $this->gender = $gender; } }
Теперь вы можете создать объект из своего класса User, и вы можете безопасно установить гендерные параметры. Если вы установите что-то неправильное для своего класса, тогда оно будет выбрасывать и исключать. Вы можете подумать, что это необязательно, но когда ваш код растет, вам хотелось бы увидеть значимое сообщение об исключении, а не неудобную логическую проблему в системе без исключения.
$user = new User(); $user->setGender('male'); // An exception will throw and you can not set 'Y' to user gender $user->setGender('Y');
(Плохой способ)
Если вы не выполните роли Encapsulation, тогда ваш код будет примерно таким. Очень трудно поддерживать. Обратите внимание, что мы можем установить что-либо для пользовательского свойства gender.
<?php class User { public $gender; } $user = new User(); $user->gender = 'male'; // No exception will throw and you can set 'Y' to user gender however // eventually you will face some logical issue in your system that is // very hard to detect $user->gender = 'Y';
Методы класса доступа
(Хороший способ)
<?php class User { public function doSomethingComplex() { $this->doThis(...); ... $this->doThat(...); ... $this->doThisExtra(...); } private function doThis(...some Parameters...) { ... } private function doThat(...some Parameters...) { ... } private function doThisExtra(...some Parameters...) { ... } }
Мы все знаем, что мы не должны делать функцию с 200 строк кода, вместо этого мы должны разбить ее на некоторую индивидуальную функцию, которая разбивает код и улучшает читаемость кода. Теперь с инкапсуляцией вы можете заставить эти функции быть закрытыми, это значит, что они недоступны посторонним, а позже, когда вы хотите изменить функцию, вы были бы счастливы, если увидите ключевое слово private.
(Плохой способ)
class User { public function doSomethingComplex() { // do everything here ... ... ... ... } }
Противоположность инкапсуляции будет чем-то вроде передачи переменной в каждый метод (например, дескриптор файла для каждого связанного с файлом метода) или глобальных переменных.
Инкапсуляция – это процесс удаления данных объекта из внешнего мира и доступ к нему ограничивается членами класса.
Инкапсуляция : – упаковка данных в одном устройстве. также мы можем сказать, что скрываем информацию о необходимых деталях. Пример . У вас есть мобильный телефон. Там есть какой-то интерфейс, который помогает вам взаимодействовать с мобильным телефоном, и вы можете использовать услуги мобильного телефона. Но фактически работающий в сотовом телефоне скроется. u не знаю, как это работает внутри страны.
Объединение элементов данных и метода вместе в один блок (т.е. класс) называется инкапсуляцией . Инкапсуляция подобна капсуле. Это включает связанные операции и данные, связанные с объектом в этот объект. Инкапсуляция подобна вашей сумке, в которой вы можете хранить свою ручку, книгу и т. Д. Это означает, что это свойство инкапсулирования членов и функций.
<?php class YourMarks { private $mark; public Marks { get { return $mark; } set { if ($mark > 0) $mark = 10; else $mark = 0; } } } ?>
Я даю еще один пример реальной жизни (ежедневное использование), который является «телевизионной операцией». Многие люди управляют телевидением в повседневной жизни.
Он инкапсулирован крышкой, и мы можем работать с пультом дистанционного управления и не нужно открывать телевизор и менять канал. Здесь все закрыто, кроме удаленного, чтобы каждый мог получить доступ, чтобы не работать и не менять вещи в телевизоре.
Просто я предпочитаю, что это видимость свойств и метода вашего класса. Например – – государственное – частное – защищено
Давайте рассмотрим пример реальной жизни для инкапсуляции.
class MyClass{ private $name; public function showName($newName){ $this->name = $newName; return $this->name; } } //instantiate object $obj = new MyClass(); echo $obj->showName("tisuchi");
В этом случае инкапсуляция означает, что мы ограничиваем некоторые свойства. Например, свойство name, мы не можем получить доступ извне класса. С другой стороны, мы можем получить доступ к публичной функции под названием showName () с одним частным параметром.
Просто то, что я предпочитаю инкапсулировать,
Хотя, если у вас есть желание понять инкапсуляцию, я ссылаюсь на свой специальный учебник, основанный на инкапсуляции.
http://tisuchi.com/object-oriented-php-part-3-encapsulation-php/
Надеюсь, это сделает вашу концепцию более ясной. Повеселись!
В основном, это то, как мы определяем видимость наших свойств и методов. Когда вы создаете классы, вы должны спросить себя, какие свойства и методы можно получить за пределами класса. Допустим, у нас есть свойство foo. Если класс расширяет ваш класс, разрешено ли ему манипулировать и получать доступ к foo? Что делать, если кто-то создает экземпляры вашего класса? Разрешено ли им манипулировать и получать доступ к foo?
Инкапсуляция – это то, как вы хотели, чтобы ваши объекты / методы или свойства / переменные были видны в вашем приложении. например, :
class ecap { public $name; private $id; protected $tax; }
Если вы хотите получить доступ к закрытым или защищенным свойствам, вам необходимо использовать методы getter и setter в своем классе, которые будут доступны извне вашего класса. Значит, вы не можете получить доступ к своим частным или защищенным свойствам непосредственно извне своего класса, но можете использовать их с помощью любых методов. Давайте взглянем-
в классе добавьте следующий метод:
class ecap { public function userId(){ return $this->id; } }
и мы можем получить к нему доступ, как:
$obj = new ecap(); echo $obj->userId();