Überladung

Überladung bietet in PHP Möglichkeiten, um dynamisch Eigenschaften und Methoden zu erzeugen. Diese dynamisch erzeugten Entitäten werden unter Zuhilfenahme von magischen Methoden verarbeitet, die man in einer Klasse zu verschiedenen Aktivitäten definieren kann.

Die Überladungsmethoden werden aufgerufen, wenn mit Eigenschaften oder Methoden interagiert wird, die entweder nicht deklariert wurden oder im aktuellen Geltungsbereich nicht sichtbar sind. Im Rest dieses Abschnitts werden die Begriffe unzugreifbare Eigenschaft und unzugreifbare Methode verwendet, um auf die Kombination von Deklaration und Sichtbarkeit zu verweisen.

Alle Überladungsmethoden müssen als public definiert sein.

Hinweis:

Keiner der Parameter dieser magischen Methoden kann als Referenz übergeben werden.

Hinweis:

Die Interpretation von Überladung weicht von den meisten objektorientierten Programmiersprachen ab. Traditionell bezeichnet Überladung die Möglichkeit mehrere Methoden mit gleichem Namen aber unterschiedlichen Anzahlen und Typen von Parametern zu definieren.

Überladung von Eigenschaften

public __set(string $name, mixed $value): void
public __get(string $name): mixed
public __isset(string $name): bool
public __unset(string $name): void

__set wird aufgerufen, wenn Daten in unzugreifbare (protected oder private) Eigenschaften geschrieben werden sollen.

__get wird verwendet, um Daten aus unzugreifbaren (protected oder private) Eigenschaften zu lesen.

__isset wird aufgerufen, indem isset() oder empty() auf unzugreifbare (protected oder private) Eigenschaften angewendet wird.

__unset wird aufgerufen, wenn unset() für unzugreifbaren (protected oder private) Eigenschaften aufgerufen wird.

Der Parameter $name beinhaltet den Namen der Eigenschaft, mit der interagiert wird. Der Parameter $value der Funktion __set spezifiziert den Wert den die Eigenschaft $name annehmen soll.

Überladung von Eigenschaften funktioniert nur im Kontext von Objekten. Diese magischen Methoden werden nicht aus einem statischen Kontext aufgerufen. Diese Methoden sollten daher nicht als static deklariert werden. Eine Warnung wird ausgegeben, wenn eine dieser magischen Überladungsmethoden als static deklariert ist.

Hinweis:

Der Rückgabewert von __set wird, aufgrund der Behandlung des Zuweisungsoperators in PHP, ignoriert. Aus ähnlichen Gründen wird __get nicht aufgerufen, wenn man Zuweisungen in etwa wie folgt verkettet:

 $a = $obj->b = 8; 

Beispiel #1 Überladung von Eigenschaften mit den Methoden __get, __set, __isset und __unset

<?php
class EigenschaftTest 
{
    
/**  Speicherplatz für überladene Daten.  */
    
private $data = array();

    
/**  Überladung wird nicht bei deklarierten Eigenschaften benutzt.  */
    
public $declared 1;

    
/**  Überladung wird nur von außerhalb der Klasse angewendet.  */
    
private $hidden 2;

    public function 
__set($name$value
    {
        echo 
"Setze '$name' auf '$value'\n";
        
$this->data[$name] = $value;
    }

    public function 
__get($name
    {
        echo 
"Lese '$name'\n";
        if (
array_key_exists($name$this->data)) {
            return 
$this->data[$name];
        }

        
$trace debug_backtrace();
        
trigger_error(
            
'Undefinierte Eigenschaft für __get(): ' $name .
            
' in ' $trace[0]['file'] .
            
' Zeile ' $trace[0]['line'],
            
E_USER_NOTICE);
        return 
null;
    }

    public function 
__isset($name
    {
        echo 
"Ist '$name' gesetzt?\n";
        return isset(
$this->data[$name]);
    }

    public function 
__unset($name)
    {
        echo 
"Lösche '$name'\n";
        unset(
$this->data[$name]);
    }

    
/**  Keine magische Methode, nur beispielhaft hier.  */
    
public function getHidden() 
    {
        return 
$this->hidden;
    }
}


echo 
"<pre>\n";

$obj = new EigenschaftTest;

$obj->1;
echo 
$obj->"\n\n";

var_dump(isset($obj->a));
unset(
$obj->a);
var_dump(isset($obj->a));
echo 
"\n";

echo 
$obj->declared "\n\n";

echo 
"Wir experimentieren nun mit der private-Eigenschaft 'hidden':\n";
echo 
"Private ist innerhalb der Klasse sichtbar, also wird __get() nicht benutzt...\n";
echo 
$obj->getHidden() . "\n";
echo 
"Private nicht sichtbar von außerhalb der Klasse, also wird __get() benutzt...\n";
echo 
$obj->hidden "\n";
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Setze 'a' auf '1'
Lese 'a'
1

Ist 'a' gesetzt?
bool(true)
Lösche 'a'
Ist 'a' gesetzt?
bool(false)

1

Wir experimentieren nun mit der private-Eigenschaft 'hidden':
Private ist innerhalb der Klasse sichtbar, also wird __get() nicht benutzt...
2
Private nicht sichtbar von außerhalb der Klasse, also wird __get() benutzt...
Lese 'hidden'


Notice:  Undefinierte Eigenschaft für __get(): hidden in <file> Zeile 70 in <file> on line 29

Überladung von Methoden

public __call(string $name, array $arguments): mixed
public static __callStatic(string $name, array $arguments): mixed

__call wird aufgerufen, wenn eine unzugreifbare Methode in einem Objekt aufgerufen wird.

__callStatic wird aufgerufen, wenn eine unzugreifbare Methode in einem statischen Kontext aufgerufen wird.

Der Parameter $name ist der Name der aufgerufenen Methode. Der Parameter $arguments beinhaltet ein Array mit den Parametern, die der Methode $name übergeben wurden.

Beispiel #2 Überladung von Methoden mit den methoden __call und __callStatic

<?php
class MethodenTest {
    public function 
__call($name$arguments
    {
        
// Achtung: Der Wert von $name beachtet die Groß-/Kleinschreibung
        
echo "Rufe die Objektmethode '$name' "
             
implode(', '$arguments). "\n";
    }

    public static function 
__callStatic($name$arguments
    {
        
// Achtung: Der Wert von $name beachtet die Groß-/Kleinschreibung
        
echo "Rufe die statische Methode '$name' "
             
implode(', '$arguments). "\n";
    }
}

$obj = new MethodenTest;
$obj->runTest('eines Objektes auf');

MethodTest::runTest('aus statischem Kontext auf');
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Rufe die Objektmethode 'runTest' eines Objektes auf
Rufe die statische Methode 'runTest' aus statischem Kontext auf

Hier Kannst Du einen Kommentar verfassen


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

PhpStorm 2022. 3 Update mit PHP 8.3 Unterstützung

PhpStorm 2022. 3 Update mit PHP 8.3 Unterstützung

PhpStorm unterstützt jetzt PHP 8. 2, die neueste Version von PHP. Somit können alle neuen Funktionen genutzt werden, die in der PHP 8. 2 Version eingeführt wurden. ...

admin

Autor : admin
Kategorie: Software-Updates

Was muss ich in WordPress einstellen, damit Google Fonts nicht mehr geladen werden?

Möchten Du WordPress davon abhalten, Google Fonts zu verwenden? Hier erfährst Du, was du dafür in WordPress einstellen musst. ...

admin

Autor : admin
Kategorie: Sonstige Tutorials

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

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