2014-09-20 6 views
1

У меня есть ниже программыОбязательно ли объявлять абстрактный класс для абстрактного метода?

<?php 
abstract class foo 
{ 
    abstract public function callme(); 
    public function testing() 
    { 
     return $this->callme(); 
    } 
} 
class bar extends foo 
{ 
    public function callme() 
    { 
     return "hello"; 
    } 
} 

$objBar = new bar(); 
echo $objBar->testing(); 

?> 

я определил abstract class foo. Обязательно ли писать реферат перед классом? Потому что, если я удалил абстрактный, я получаю фатальную ошибку.

ответ

1

Да, если он содержит abstract методов.

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

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


Эти понятия, возможно, лучше объяснить с реальным миром, например, чем ваши стандартные abstract class Vehicle, class Car extends Vehicle учебников.

Предположим, у нас есть система отчетности, которая выполняет некоторые запросы в базе данных.

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

Таким образом, мы определяем:

abstract class Report 
{ 

} 

Ради аргумента, все отчеты требуют подключения к базе данных.

abstract class Report 
{ 
    /** @var PDO */ 
    protected $dbh; 

    public function __construct (PDO $dbh) 
    { 
     $this->dbh = $dbh; 
    } 

    /** 
    * @return array 
    */ 
    abstract public function getData(); 

} 

Здесь мы также решили, что все наши отчеты должны реализовать общедоступный метод getData, который возвращает массив.

Это означает:

  • Мы можем гарантировать, что все наши отчеты имеют подключение к базе данных
  • Мы можем создать экземпляр и затем запустить каждый отчет в том же образом

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

Другой код затем может выбрать отчет из пользовательского ввода, запустить его и сделать что-то с результатом getData (например, записать его в файл CSV), зная, что это будет массив.