Зачем вы используете такой абстрактный? Ускоряет ли работа или что именно ее делает?
// 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? }
В чем причина продления абстракции здесь? Меня смущает. Что я могу получить от этого сейчас?
Вы можете использовать абстрактные классы для определения и частичного выполнения общих задач, которые должен выполнять расширенный класс. Поскольку объяснять это трудно без примера, рассмотрите это:
Без абстрактных классов вам нужно будет определить два базовых класса с теми же методами и реализацией. Поскольку ООП занимается предотвращением дублирования кода, это совершенно неправильно:
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()
может использоваться всеми расширенными классами.
Конечно, это простой пример, но, надеюсь, он иллюстрирует, почему абстрактные классы могут быть полезны.
Это не будет популярным ответом, но все же …
abstract
, interface
, private
и другие ключевые слова, заимствованные из Java, являются элементами программирования культового груза и не служат реальной цели в PHP, за исключением того, что автор становится более «серьезным» и «профессиональным».
Объяснение: эти ключевые слова – это контракты времени компиляции, которые не влияют на то, как работает ваша программа, и предназначены только для помощи компилятору … если у вас ее есть. На компилированном языке, таком как Java или C #, физически невозможно развернуть программу, нарушающую контракт, например, не реализует abstract
метод. Вы просто не скомпилируете его. Это хорошая вещь, потому что вы можете исправлять некоторые виды ошибок очень быстро, без тестирования и отладки.
PHP, напротив, не имеет компилятора и выполняет все проверки контрактов во время выполнения. Это Bad Thing, потому что вам нужно протестировать и отладить, чтобы найти нарушения контракта вручную. Рассмотрим следующее:
class Abs { abstract function implementMe(); } if ($_GET['x'] == 'foo') include "GoodClass.php"; if ($_GET['x'] == 'bar') include "BadClass.php";
где «BadClass» расширяет «Abs», но не реализует метод «implementMe». Этот скрипт может быть развернут и будет работать нормально, пока кто-то не назовет его «? X = bar», а затем – bang! – ваша программа внезапно падает. Чтобы ухудшить ситуацию, это будет «фатальной» ошибкой, так что вы не сможете даже обрабатывать ее разумным образом.
То есть, abstract
и друзья не только бесполезны, но и весьма вредны для PHP. Мало того, что они не помогают вам с поиском ошибок, но также являются потенциальным источником еще большего количества сбоев. Держись подальше.
Таким образом, вы можете реализовать различные поисковые адаптеры, и все они должны реализовать этот метод поиска. См. Здесь наследование .
В основном вы получаете то, что каждый класс, расширяющий «Search_Adapter_Abstract», может использоваться в качестве поискового адаптера. Изменение поведения (потому что поиск метода реализуется по-разному), но вы гарантируете, что метод «поиска» существует с этой сигнатурой.