Objekt-Vererbung

Vererbung ist ein gängiges Prinzip der Programmierung und PHP verwendet dieses Prinzip in seinem Objektmodell. Dieses Prinzip beeinflusst die Art und Weise, in der mehrere Klassen und Objekte in Beziehung zueinander stehen.

Wenn zum Beispiel eine Klasse erweitert wird, so erbt die Unterklasse alle Methoden der Sichtbarkeiten public und protected sowie alle Eigenschaften und Konstanten von der Elternklasse. Wenn eine Klasse diese Methoden nicht überschreibt, wird die ursprüngliche Funktionalität beibehalten.

Dies ist nützlich, um Funktionalität zu definieren und zu abstrahieren und erlaubt es, zusätzliche Funktionalität in ähnlichen Objekten zu implementieren, ohne sämtliche gemeinsame Funktionalitäten neu implementieren zu müssen.

Private Methoden einer Elternklasse sind für eine Kindklasse nicht zugänglich. Folglich können Kindklassen eine private Methode ohne Berücksichtigung der normalen Vererbungsregeln selbst reimplementieren. Vor PHP 8.0.0 wurden jedoch die Einschränkungen final und static auf private Methoden angewandt. Ab PHP 8.0.0 ist die einzige Einschränkung für private Methoden, die erzwungen wird, die die private final bei Konstruktoren, da dies ein üblicher Weg ist, den Konstruktor zu "deaktivieren", wenn stattdessen statische Fabrikmethoden (factory methods) verwendet werden.

Die Sichtbarkeit von Methoden, Eigenschaften und Konstanten kann gelockert werden, so kann z. B. eine protected Methode als public markiert werden, aber sie können nicht eingeschränkt werden, indem z. B. eine public Eigenschaft als private markiert wird.

Hinweis:

Wenn Autoloading nicht verwendet wird, so müssen die Klassen definiert werden, bevor sie verwendet werden. Wenn eine Klasse eine andere erweitert, so muss die Elternklasse vor der Kindklasse deklariert werden. Diese Regel gilt für Klassen, die von anderen Klassen und Interfaces erben.

Hinweis:

Es ist nicht erlaubt, eine schreib- und lesbare Eigenschaft mit einer schreibgeschützten Eigenschaft zu überschreiben oder umgekehrt.

<?php

class {
    public 
int $prop;
}
class 
extends {
    
// Unzulässig: lesen-schreiben -> nur-lesen
    
public readonly int $prop;
}
?>

Beispiel #1 Beispiel für Vererbung

<?php

class Foo
{
    public function 
printItem($string)
    {
        echo 
'Foo: ' $string PHP_EOL;
    }

    public function 
printPHP()
    {
        echo 
'PHP ist großartig.' PHP_EOL;
    }
}

class 
Bar extends Foo
{
    public function 
printItem($string)
    {
        echo 
'Bar: ' $string PHP_EOL;
    }
}

$foo = new Foo();
$bar = new Bar();
$foo->printItem('baz'); // Ausgabe: 'Foo: baz'
$foo->printPHP();       // Ausgabe: 'PHP ist großartig.'
$bar->printItem('baz'); // Ausgabe: 'Bar: baz'
$bar->printPHP();       // Ausgabe: 'PHP ist großartig.'

?>

Kompatibilität des Rückgabetyps bei internen Klassen

Vor PHP 8.1 haben die meisten internen Klassen oder Methoden ihren Rückgabetyp nicht deklariert und wenn sie erweitert wurden, war jeder Rückgabetyp erlaubt.

Seit PHP 8.1.0 sind die meisten internen Methoden dazu übergegangen, den Typ des Rückgabewertes "vorläufig" zu deklarieren. In diesem Fall muss der Typ des Rückgabewerts einer Methode mit dem des erweiterten Elternteils kompatibel sein, andernfalls wird ein Missbilligungs-Hinweis ausgegeben. Es ist zu beachten, dass eine fehlende explizite Deklaration des Rückgabetyps ebenfalls als Signaturfehler betrachtet wird, und daher zu einer entsprechenden Meldung führt.

Wenn der Rückgabetyp für eine überschreibende Methode aufgrund von Kompatibilitätsproblemen zwischen PHP-Versionen nicht deklariert werden kann, kann das Attribut #[ReturnTypeWillChange] hinzugefügt werden, um den Missbilligungs-Hinweis zu unterdrücken.

Beispiel #2 Die überschreibende Methode deklariert keinen Rückgabetyp

<?php
class MyDateTime extends DateTime
{
    public function 
modify(string $modifier) { return false; }
}

// "Deprecated: Return type of MyDateTime::modify(string $modifier) should either be compatible with DateTime::modify(string $modifier): DateTime|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice" as of PHP 8.1.0
?>

Beispiel #3 Die überschreibende Methode deklariert einen falschen Rückgabetyp

<?php
class MyDateTime extends DateTime
{
    public function 
modify(string $modifier): ?DateTime { return null; }
}

// "Deprecated: Return type of MyDateTime::modify(string $modifier): ?DateTime should either be compatible with DateTime::modify(string $modifier): DateTime|false, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice" as of PHP 8.1.0
?>

Beispiel #4 Die überschreibende Methode deklariert einen falschen Rückgabetyp ohne Missbilligungs-Hinweis

<?php
class MyDateTime extends DateTime
{
    
/**
     * @return DateTime|false
     */
    #[ReturnTypeWillChange]
    
public function modify(string $modifier) { return false; }
}

// Es wird kein Missbilligungs-Hinweis ausgelöst
?>

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

Abmahnwelle durch Google Fonts - was ist zu beachten und wie schütze ich mich?

Abmahnwelle durch Google Fonts - was ist zu beachten und wie schütze ich mich?

Eine Abmahnwelle wegen Google Fonts rollt derzeit durch das Land und verunsichert viele Betreiber von Webseiten. Ausschlaggebend hierfür war ein Urteil des Landgerichts München vom 20.01.2022. ...

Bernie

Autor : ebiz-consult GmbH & Co. KG
Kategorie: Dies und Das

Was zeichnet einen Full-Stack-Webentwickler aus und welche Fähigkeiten muss ein Full-Stack-Webentwickler besitzen?

In immer mehr Stellenausschreibungen liest man den Begriff "Full-Stack-Webentwickler". Was aber macht einen Full-Stack-Webentwickler eigentlich aus? Welche Themen der Webentwicklung sollte er abdecken können? ...

TheMax

Autor : TheMax
Kategorie: PHP Magazin

phpFox 4.8.11 erschienen

phpFox, ein professionelles Facebook Clone Script ist in der Version 4.8.11 erschienen ...

PhpFox

Autor : PhpFox
Kategorie: Firmennews & Pressemitteilungen

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

Text import mit š

leider habe ich keinen Ansatz mehr, habe nun behelfsmäßig alle betreffenden Zeichen im csv als Zeichen wie & oder % gesetzt und diese dann mit r ...

Geschrieben von jamessbuzzz am 01.12.2022 15:02:54
Forum: PHP Developer Forum
eMail Neuregistrierung

Besser spät als nie: Es gab einen Relaunch mit dem wir sowohl das Forum als auch den Rest der Webseite mal etwas modernisiert haben. Im Zuge der ...

Geschrieben von Jens am 28.11.2022 15:42:59
Forum: News / Kostenloses
.htaccess

Kannst du vielleicht mit 1-2 Beispielen ausführen was du erwartest und wie das tatsächliche Verhalten ist? So spontan würde ich erwarten, dass ...

Paginator - Normale Abfrage klappt einwandfrei ...

Das nennt sich "seitenweises blättern". Du musst mit Links und den entsprechenden Parametern arbeiten. Ich habe anno dunnemals dazu ein Tutorial ...

Geschrieben von Kropff am 25.11.2022 18:07:20
Forum: PHP Developer Forum