2017-02-14 1 views
-3
class A 
{ 
    private $a; 
} 

class B extends A 
{ 
    function __construct() 
    { 
     (new \ReflectionClass($this))->getProperty('a')->setAccessible(true); 
     unset($this->a); // fatal error 
    } 
} 

(new B()); 

Dies löst einen fatalen Fehler, obwohl ich die ZugänglichkeitIch kann geerbte private Variablen nicht aufheben; sogar mit Reflexion

+2

Statt die Klasse "zu erben", erstellen Sie stattdessen Ihre Klasse, indem Sie die Klasse verwenden, indem Sie sie einfügen und dann die Teile verwenden, die Sie verwenden möchten. Es ist viel einfacher zu pflegen. Vor allem, wenn Sie 'Schnittstellen' verwenden. –

Antwort

1

Nein, nein man kann nicht verändert. $a existiert nur in der Symboltabelle für Instanzen von class A, aber new B gibt Ihnen eine Instanz von class B. Aus der Perspektive Ihres Objekts new B, $a existiert per definitionem nicht: also unset($this->a) ist de facto unmöglich.

Verwandte Themen