Как работать с абстрактным PHP? - PullRequest
4 голосов
/ 30 августа 2011

Зачем вам использовать такой реферат?Это ускоряет работу или для чего именно?

// file1.php
abstract class Search_Adapter_Abstract {
    private $ch = null;
    abstract private function __construct()
    {
    }       
    abstract public funciton __destruct() { 
      curl_close($this->ch);
    }
    abstract public function search($searchString,$offset,$count);
}

// file2.php
include("file1.php");
class abc extends Search_Adapter_Abstract
{
    // Will the curl_close now automatically be closed?

}

В чем причина расширения абстрактного здесь?Смущает меня.Что я могу получить от этого сейчас?

Ответы [ 3 ]

3 голосов
/ 30 августа 2011

Вы можете использовать абстрактные классы для определения и частичной реализации общих задач, которые должен выполнять расширенный класс.Поскольку объяснить это сложно без примера, рассмотрим следующее:

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

class Car {
  public $brand = 'mercedes';

  public function gasPerMile($weight) 
  {
    // Useless calculation, purely for illustrating
    $foo = $weight * 89 / 100;
    return $foo;
  }

  public function carSpecificFunction() 
  {
    // Only present in class Car
  }
}

class Truck {
  public $brand = 'MAN';

  public function gasPerMile($weight) 
  {
    // Useless calculation, purely for illustrating
    $foo = $weight * 89 / 100;
    return $foo;
  }

  public function truckSpecificFunction() 
  {
    // Only present in class Truck
  }
}

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

abstract class Vehicle {
  abstract public $brand;

  public function gasPerMile($weight) 
  {
    // Useless calculation, purely for illustrating
    $foo = $weight * 89 / 100;
    return $foo;
  }
}

Таким образом, вы гарантируете, что по крайней мере каждый класс, который расширяет Vehicle необходимо указать марку, и общий метод gasPerMile() может использоваться всеми расширенными классами.

Конечно, это простой пример, но, надеюсь, он иллюстрирует, почему абстрактные классы могут быть полезны.

3 голосов
/ 30 августа 2011

Это не будет популярным ответом, но все же ...

abstract, interface, private и другие ключевые слова, заимствованные из Java, являются элементами Культовое программирование груза и не служит никакой реальной цели в PHP, за исключением того, что автор выглядит более «серьезным» и «профессиональным».

Объяснение: эти ключевые слова являются контрактами времени компиляции, которые не влияют накак ваша программа работает и предназначена только для помощи компилятору ... при условии, что она у вас есть.В скомпилированном языке, таком как Java или C #, вы физически не можете развернуть программу, которая нарушает контракт, например, не реализует метод abstract.Вы просто не получаете это скомпилировано.Это хорошо, потому что вы можете исправить некоторые ошибки очень быстро, без тестирования и отладки.

PHP, напротив, не имеет компилятора и выполняет все проверки контрактов во время выполнения.Это плохо, потому что вам нужно тестировать и отлаживать, чтобы найти нарушения контракта вручную.Рассмотрим следующее:

class Abs {
    abstract function implementMe();
}

if ($_GET['x'] == 'foo')
    include "GoodClass.php";

if ($_GET['x'] == 'bar')
    include "BadClass.php";

, где «BadClass» расширяет «Abs», но не реализует метод «ImpleMe».Этот сценарий может быть развернут и будет работать нормально, пока кто-нибудь не вызовет его с «? X = bar», а затем - bang!- ваша программа внезапно падает.Что еще хуже, это будет «фатальная» ошибка, так что вы даже не сможете справиться с этим разумным образом.

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

2 голосов
/ 30 августа 2011

Таким образом, вы можете реализовать различные поисковые адаптеры, и все они должны реализовать этот метод поиска. См. Наследование здесь .
По сути, вы получаете то, что каждый класс, расширяющий "Search_Adapter_Abstract", может использоваться в качестве поискового адаптера.Поведение меняется (поскольку поиск метода реализован по-другому), но вы гарантируете, что метод «search» существует с этой сигнатурой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...