PHP: what is the use case of an abstract class

According to php.net documentation:

When inheriting from an abstract class, all methods marked as abstract in the parent class declaration must be defined by the child; in addition, these methods must be defined with the same (or less limited) visibility. For example, if an abstract method is defined as protected, the implementation of the function should be defined as protected or public, but not closed. In addition, the method signatures must match, i.e. Type hints and the number of required arguments must be the same. For example, if a child class defines an optional argument that does not have an abstract method signature, there is no conflict in the signature. This also applies to constructors with PHP 5.4. Up to 5.4 constructor signatures may vary.

In php.net they showed the following example:

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

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

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

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

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

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

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";

If I run this, I get the following output:

ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2

, , " , ", . , , ( ), , . PHP. , , - ; , . , ?

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

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

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

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

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

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

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') ."\n";
+4
2

, , ( ), , .

PHP , , " " 1; ( ). , Java #, . ( / 2.)

, PHP .

, [ ]?

" " / :

  • , 2

  • ; , .

  • ;

/ . ( .. , .)


1 , Ruby, Python JavaScript, OO , , .

2 / ( ) , . , .

+2

, , .

class Chair extends Furniture {
    // define methods to handle being sat on
}
class Table extends Furniture {
    // define methods to handle holding things up
}

. "" - . , "" "". :

abstract class Furniture {
    // define methods that apply to all kinds of furniture
}

" ". , , , .

, new Furniture() , . abstract class new Furniture() .

+3

Source: https://habr.com/ru/post/1607739/


All Articles