Абстрактное ключевое слово в PHP

Эй, я очень опытен с PHP, но я понятия не имею, что делает абстрактный абстрактный текст, когда дело доходит до ориентированного на объект программирования. Может ли кто-нибудь объяснить на английском языке, на что он может быть использован?

В каких ситуациях я бы использовал ключевое слово abstract? Как это изменит класс/интерфейс?

Ответ 1

(Надеюсь, это достаточно просто - я не думаю, что смогу сделать лучше ^^)

Класс abstract не может быть инстанцирован: вы можете создать только другой класс, который наследуется от класса abstract, и инициализировать этот дочерний класс.

И если вы объявляете некоторые методы как abstract, они должны быть определены в дочернем классе, для того, чтобы он был невозможен.

Ответ 2

Объявление абстрактного класса означает, что оно должно быть подклассифицировано для использования. Абстрактный класс не может быть создан. Его можно рассматривать как расширенный интерфейс, который может включать в себя код реализации (в отличие от интерфейса).

Объявляя абстрактный метод, вы вынуждаете подкласс выполнять этот метод.

Ответ 3

Определение упомянуто выше, теперь я попытаюсь привести вам пример:

"abstract" гарантирует, что вы будете следовать определенной логике, например. материал билета ВСЕГДА "бумага", или кредитная карта всегда должна иметь "код". Это важно, если вы работаете в крупной компании, имеющей строгую стандартизацию, или если вы хотите заставить своих разработчиков следовать определенной структуре, поэтому их код не будет в беспорядке.

    abstract class ticket{

    public function material()
    {
        return 'Paper';
    }

}

abstract class creditcard{

    public function material()
    {
        return 'Plastic';
    }

    abstract function setCode(); // the ";" semicolon is important otherwise it will cause an error

}

class key extends ticket{

    public function getMaterial()
    {
        return parent::material();
    }
}

class anotherKey extends creditcard{

    public function setCode($code)
    {
        $this->code = $code;
    }
}

Если мы не определим метод setCode, парсер вернет ошибку на "new anotherKey"

Ответ 4

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

здесь приведен пример кода

<?php
abstract class AbstrakteKlasse {
  public abstract function methode();
}

class ImplementierendeKlasse extends AbstrakteKlasse {
  public function methode() {
    print "ImplementierendeKlasse::methode() aufgerufen.\n";
  }
}

$objekt = new ImplementierendeKlasse;
$objekt->methode();
?>

Ответ 5

Хотя вы не можете создать экземпляр абстрактного класса, вы можете объявить конкретные методы/свойства/переменные (в С#, AFAIK), которые будут доступны для производного класса

class Program
    {
        static void Main(string[] args)
        {
            Dog a = new Dog();
           //concrete properties and methods in abstract base class 
          //are available to derived class
            a.Name = "SuperDog";
            a.EatFood();
            //And now calling Dog method
            a.Speak();            
            Console.WriteLine(a.GetType());

        }
    }

    public abstract class Animal
    {
        public string Name { get; set; }
        public void EatFood()
        {
            Console.WriteLine("Eating..");
        }
    }

    public class Dog :Animal
    {
        public void Speak()
        {
            Console.WriteLine("Bow .. Bow");
        }
    }

Ответ 6

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

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 "swat";
    }

}
$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 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());