Ответы пользователя по тегу ООП
  • Зачем нужны абстрактные классы и интерфейсы в php?

    Acuna
    @Acuna
    Заполнил свой профиль
    Если совсем на пальцах для гарантированного понимания на наглядном примере: мы проектируем класс для работы с БД. Он должен работать с разными типами БД (MySQL, PostgreSQL, и т. д.). Каждый тип, с которым он может работать, мы реализовываем в виде отдельного класса (что в дальнейшем позволит просто добавлять к нашему проекту новые классы, не переписывая основной класс). Благодаря этому можно создавать другие классы на основе нашего абстрактного основного класса, не боясь, что необходимые для работы методы не будут определены (так как абстрактные методы обязаны быть переопределены при расширении функционала этого класса базовым абстрактным классом), что позволит предотвратить ситуации когда либо сам разраб забыл переопределить нужный для работы нашего расширения метод, либо другие программеры забыли/забили на это при создании своих расширений для этого класса, а тут компилятор скажет, мол, ты расширяешь свой класс базовым классом, это хорошо и правильно, но переопредели плиз эти абстрактные методы, ибо в них вообще вся суть расширения. Надеюсь хотя-бы это объяснение прольет свет. Штука крайне удобная, одна из самых удобных и нужных вещей в PHP и вообще во всех нормальных языках.
    Ответ написан
    Комментировать
  • Зачем прописывать методы в Interface когда можно так же в классе?

    Acuna
    @Acuna
    Заполнил свой профиль
    Интерфейсами очень хорошо реализовывать какие-либо слушатели или коллбеки для использования их значений извне.

    Например:

    public class MyClass {
      
      private String mess = "";
      private MyListener listener;
      
      public MyClass () {
        
        mess = "Успешно";
        
      }
      
      public void addListener (MyListener listener) {
        this.listener = listener;
      }
      
      public void connect () {
        
        listener.onSuccess (mess); // Какое-либо действие в случае успеха, например, подключение к серверу
        
      }
      
    }
    
    interface MyListener {
      
      void onSuccess (String mess);
      void onError (int code);
      
    }

    Теперь его можно вызвать следующим образом:

    MyClass myClass = new MyClass ();
    
    myClass.addListener (MyListener () {
      
      @Override
      public void onSuccess (String var1) {
         System.out.println (var1); // var1 имеет значение "Значение", которое мы получили в конструкторе класса MyClass. А тут с ней можно делать что угодно, например, слать HTTP-запросом куда-либо дальше.
      }
      
    });
    
    myClass.connect ();

    Просто и наглядно. Еще удобно их пользовать для описания методов каком-либо классе, чтобы другим программерам было удобнее копаться в чужом коде.
    Ответ написан
    Комментировать
  • Нужно ли учить ООП (PHP)?

    Acuna
    @Acuna
    Заполнил свой профиль
    Статья - неслабый вброс для поддержки активности в своем блоге, как это любит делать Mail.ru, когда писать дельного нечего, а надо.

    Учить надо хотя-бы потому, что это удобно. Приведу наглядный пример: у Вас есть метод для подключения к чему-либо (к какой-то БД, FTP, не важно). Он называется query (). Класс с этим методом Вы можете определить при запуске Вашего проекта (например, в index.php). Например, так:

    $db = new DB ([
      'server' => '127.0.0.1',
      'user' => 'root',
      'password' => '',
      'database' => 'my_db',
    ]);

    Как видите, этот класс инициализируется с нужными настройками. При его создании в методе __construct () Вы можете инициализировать само подключение к БД, выбор нужной БД и т. д. И уже в остальных методах Вы можете использовать эту переменную ($db), вводя ее в любой метод с помощью оператора global. Например, $db->query () выполняет запрос в БД (помните, что мы уже инициализировали подключение к БД при создании класса для работы с ней, поэтому мы можем выполнять запросы в нее из любого места Вашего скрипта). Я уж не говорю о том, что при этом методы могут иметь одинаковые названия в разных классах, но Вы всегда будете знать из какого экземпляра этот метод, и чем он занимается.
    Ответ написан
    Комментировать
  • Как правильно использовать $bd в ООП?

    Acuna
    @Acuna
    Заполнил свой профиль
    Все просто. Вы немного запутались в областях видимости)

    class MyClass {
      
      private $f3, $db;
      
      function __construct () {
        global $f3, $db;
       
        $this->f3 = $f3;
        $this->db = $db;
        
      }
      
      function MyFunc () {
        $this->f3->somebody ();
      }
      
    }
    
    $obj = new MyClass ();
    Ответ написан
    Комментировать
  • Как научиться писать такой ООП код?

    Acuna
    @Acuna
    Заполнил свой профиль
    Коллеги вверху правильно ответили, что не стоит так усложнять код кроме разве что академического интереса. Задание по вашей ссылке можно было бы уместить в одну простую функцию и не городить из этого целый движок. Проблема не в ООП, он очень нужный и классный (серьезно), однако проблема в том, что его часто суют где только можно, но где это совершенно не нужно. Можно и гвозди унитазом забивать, только зачем?
    Ответ написан
    Комментировать