Что такое инкапсуляция с простым примером в php? - PullRequest
31 голосов
/ 12 июня 2009

Что такое инкапсуляция с простым примером в php?

Ответы [ 14 ]

36 голосов
/ 12 июня 2009

Инкапсуляция - это просто завершение некоторых данных в объекте. Термин «инкапсуляция» часто используется взаимозаменяемо с «сокрытием информации». В Википедии есть довольно полная статья .

Вот пример из первой ссылки в поиске Google для 'php encapsulation' :

<?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();

?>
11 голосов

Инкапсуляция - это механизм, который связывает воедино код и данные, которыми он манипулирует, и защищает как от внешнего вмешательства, так и от неправильного использования. Упаковка данных и методов в единый модуль (называемый классом) называется инкапсуляцией. Преимущество инкапсуляции состоит в том, что она выполняет задачу внутри, не заставляя вас беспокоиться.

10 голосов
/ 28 июля 2015

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

Доступ и настройка параметров класса

(Good Way)

<?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, ваш код будет выглядеть примерно так. Очень сложно поддерживать. Обратите внимание, что мы можем установить что-либо для свойства пола пользователя.

<?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';

Методы класса доступа

(Good Way)

<?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
        ...
        ...
        ...
        ...
    }
}
7 голосов
/ 12 июня 2009

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

Например

class OuterClass
{
  private var $innerobject;

  function increment()
  {
    return $this->innerobject->increment();
  }
}

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

3 голосов
/ 08 мая 2018
/* class that covers all ATM related operations */
class ATM {

    private $customerId;
    private $atmPinNumber;
    private $amount;

    // Varify ATM card user
    public function verifyCustomer($customerId, $atmPinNumber) {
        ... function body ...
    }

    // Withdraw Cash function
    public function withdrawCash($amount) {
        ... function body ...
    }

    // Retrive mini statement of our account
    public function miniStatement() {
        ... function body ...
    }
}

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

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

Это означает, что пользователи не имеют полной информации о реализации для класса ATM. Это просто известно как скрытие данных.

Ссылка: http://www.thecreativedev.com/php-encapsulation-with-simple-example/

3 голосов
/ 13 ноября 2012

Люди, кажется, смешивают детали ориентации объекта с инкапсуляцией, которая является гораздо более старой и широкой концепцией. Инкапсулированная структура данных

  • может передаваться с одной ссылкой, например, приращением (myDate) а не приращение (год, месяц, день)
  • имеет набор применимых операций, хранящихся в одном программном блоке (класс, модуль, файл и т. д.)
  • не позволяет любому клиенту видеть или манипулировать его подкомпонентами ИСКЛЮЧИТЬ, вызвав соответствующие операции

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

2 голосов
/ 07 марта 2017

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

<?php
 class YourMarks
  {
   private $mark;
   public Marks
  {
   get { return $mark; }
   set { if ($mark > 0) $mark = 10; else $mark = 0; }
  }
  }
?>

Я привожу еще один пример из реальной жизни (ежедневное использование), который называется «работа с телевизором». Многие люди используют телевизор в повседневной жизни.

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

2 голосов
/ 20 августа 2014

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

2 голосов
/ 16 января 2014

Инкапсуляция - это процесс сокрытия данных объекта от внешнего мира и доступ к ним ограничен членами класса.

2 голосов
/ 12 июня 2009

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

...