что такое абстрактный класс в PHP?


Что такое абстрактный класс в PHP? Где его можно использовать?

6 82

6 ответов:

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

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

посмотреть в этом разделе из руководства PHP для дальнейшего использования.

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

1. Не удается создать экземпляр абстрактного класса: классы, определенные как абстрактные, не могут быть созданы, и любой класс, содержащий хотя бы один абстрактный метод, также должен будьте абстрактны.

пример :

abstract class AbstractClass
{

    abstract protected function getValue();
    abstract protected function prefixValue($prefix);


    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass

2. Любой класс, содержащий хотя бы один абстрактный метод обязан быть абстрактным: абстрактный класс может иметь абстрактные и неабстрактные методы, но он должен содержать хотя бы один абстрактный метод. Если класс имеет хотя бы один абстрактный метод, то класс должен быть объявлен абстрактным.

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

пример :

class Non_Abstract_Class
{
   abstract protected function getValue();

    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new Non_Abstract_Class();
$obj->printOut();
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue)

3. Абстрактный метод не может содержать тело: методы, определенные как абстрактные, просто объявляют сигнатуру метода - они не могут определить реализацию. Но не абстрактный метод может определить реализацию.

abstract class AbstractClass
{
   abstract protected function getValue(){
   return "Hello how are you?";
   }

    public function printOut() {
        echo $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body

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

abstract class AbstractClass
{
    // Force Extending class to define this method
    abstract protected function getValue();

    // Common method
    public function printOut() {
        print $this->getValue() . "<br/>";
    }
}

class ConcreteClass1 extends AbstractClass
{
    public function printOut() {
        echo "dhairya";
    }

}
$class1 = new ConcreteClass1;
$class1->printOut();
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)

5. Такая же (или менее ограниченная) видимость:при наследовании от абстрактного класса, все методы, помеченные абстрактными в класс заявление родителя должны быть определены на ребенка; кроме того, эти методы должны быть определены с той же (или менее ограниченный) обзор. Например, если абстрактный метод определен как защищенный, то реализация функции должен быть определен как защищенный или публичный, но не частный.

обратите внимание, что абстрактный метод не должен быть частным.

abstract class AbstractClass
{

    abstract public function getValue();
    abstract protected function prefixValue($prefix);

        public function printOut() {
        print $this->getValue();
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."<br/>";
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass)

6. Сигнатуры абстрактных методов должны совпадать: при наследовании от абстрактного класса все методы, отмеченные abstract в объявлении родительского класса, должны быть определены дочерним элементом; сигнатуры методов должны совпадать, т. е. подсказки типа и количество требуемых аргументов должны быть одинаковыми. Например, если дочерний класс определяет необязательный аргумент, в котором отсутствует подпись абстрактного метода, конфликт в подписи отсутствует.

abstract class AbstractClass
{

    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{


    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "<br/>";
echo $class->prefixName("Pacwoman"), "<br/>";
//output: Mr. Pacman
//        Mrs. Pacwoman

7. Абстрактный класс не поддерживает множественное наследование:абстрактный класс расширяет другой абстрактный класс,абстрактный класс может обеспечить реализацию интерфейса.Но он не поддерживает множественное наследование.

interface MyInterface{
    public function foo();
    public function bar();
}

abstract class MyAbstract1{
    abstract public function baz();
}


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{
    public function foo(){ echo "foo"; }
    public function bar(){ echo "bar"; }
    public function baz(){ echo "baz"; }
}

class MyClass extends MyAbstract2{
}

$obj=new MyClass;
$obj->foo();
$obj->bar();
$obj->baz();
//output: foobarbaz

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

ниже пример вызовет фатальная ошибка: класс 'лошадь' не найден

class cart extends horse {
    public function get_breed() { return "Wood"; }
}

abstract class horse extends animal {
    public function get_breed() { return "Jersey"; }
}

abstract class animal {
    public abstract function get_breed();
}

$cart = new cart();
print($cart->get_breed());

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

этому есть хорошее объяснение здесь.

Абстрактный Класс
1. Содержит абстрактный метод
2. Не может быть непосредственно инициализирован
3. Невозможно создать объект абстрактного класса
4. Используется только для целей наследования

Абстрактный Метод
1. Не может содержать тело
2. Не может быть определен как частный
3. Дочерние классы должны определять методы, объявленные в абстрактном классе

пример Код:

abstract class A {
    public function test1() {
        echo 'Hello World';
    }
    abstract protected function f1();
    abstract public function f2();
    protected function test2(){
        echo 'Hello World test';
    }
}

class B extends A {
    public $a = 'India';
    public function f1() {
        echo "F1 Method Call";
    }
    public function f2() {
        echo "F2 Method Call";
    }
}

$b = new B();
echo $b->test1() . "<br/>";
echo $b->a . "<br/>";
echo $b->test2() . "<br/>";
echo $b->f1() . "<br/>";
echo $b->f2() . "<br/>";

выход:

Hello World
India
Hello World test
F1 Method Call
F2 Method Call

ссылки: абстрактный класс в Php и oops

  • абстрактный класс содержит только объявить сигнатуру метода, они не могут определить реализации.
  • класс абстракции определяются с помощью ключевого слова аннотация .
  • абстрактный класс невозможно реализовать множественное наследование.
  • последнюю версию PHP 5 поддерживает определение абстрактных классов и имеет методы.
  • классы определяются как абстрактные , мы не можем создать объект ( не создается )

http://www.codingslover.com/2015/07/abstract-class-in-php.html

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

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

для детализации абстрактного класса вы можете обратиться к моему блогу на абстрактный класс в PHP.