2016-05-03 5 views
2

In Javascript weiß ich, dass es einfach ist, eine Klassenmethode einer einzelnen Instanz zu überschreiben, aber ich bin nicht ganz sicher, wie das in PHP managable ist. Hier ist meine erste Idee:PHP-Override-Funktion einer einzelnen Instanz

class Test { 
    public $var = "placeholder"; 
    public function testFunc() { 
     echo "test"; 
    } 
} 

$a = new Test(); 

$a->testFunc = function() { 
    $this->var = "overridden"; 
}; 

Mein zweiter Versuch mit anonymen Funktionsaufrufen war die leider den Objekt tötet Umfang ...

class Test { 
    public $var = "placeholder"; 
    public $testFunc = null; 
    public function callAnonymTestFunc() { 
     $this->testFunc(); 
    } 
} 

$a = new Test(); 

$a->testFunc = function() { 
    //here the object scope is gone... $this->var is not recognized anymore 
    $this->var = "overridden"; 
}; 

$a->callAnonymTestFunc(); 
+0

Ich bin nicht sicher, warum Sie das tun möchten. Ist es nur eine Immobilie zu setzen? Oder gibt es andere Funktionalität? –

+2

Möchten Sie auf Klassen- oder Objektebene überschreiben? Wenn Sie auf Klassenebene sind, können Sie einfach Ihre Klasse erweitern und die Funktion auf diese Weise überschreiben. Wenn auf Objektebene können Sie einen Rückruf an den Konstruktor übergeben. – Schore

+0

Es wäre auf Objektebene, können Sie vielleicht weiter erklären, was Sie mit "Sie könnten einen Rückruf an den Konstruktor übergeben" meinen? Danke im Voraus! – marius

Antwort

2

Um vollständig zu verstehen, was Sie versuchen, er zu erreichen Da Ihre gewünschte PHP-Version zuerst bekannt sein sollte, ist PHP 7 für OOP-Ansätze besser geeignet als jede frühere Version.

Wenn die Bindung Ihrer anonymen Funktion das Problem ist, können Sie bind the scope of a function ab PHP> = 5.4 zu einer Instanz, z.

$a->testFunc = Closure::bind(function() { 
    // here the object scope was gone... 
    $this->var = "overridden"; 
}, $a); 

Ab PHP> = 7 können Sie bindTo sofort auf dem erstellten Closure rufen

$a->testFunc = (function() { 
    // here the object scope was gone... 
    $this->var = "overridden"; 
})->bindTo($a); 

Obwohl Ihr Ansatz von dem, was Sie versuchen zu erreichen, jenseits meiner Vorstellungskraft ist. Vielleicht sollten Sie versuchen, Ihr Ziel zu klären, und ich werde alle möglichen Lösungen erarbeiten.

+0

thx es ging darum, den Umfang zu binden, hat perfekt funktioniert, danke! – marius

-2

I Vererbungsprinzip des OOP verwenden würde, die in funktionieren die meisten High-Level-Sprachen:

Class TestOverride extends Test { 
public function callAnonymTestFunc() { 
//overriden stuff 
} 
} 

$testOverriden = new TestOverriden(); 
$testOverriden->callAnonymTestFunc(); 
Verwandte Themen