9

In javascript i know it is possible to simply override a class-method of a single instance but I am not quite sure how this is managable in PHP. Here is my first idea:

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

$a = new Test();

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

My second attempt was with anonymous function calls which unfortunately kills the object scope...

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();
marius
  • 1,118
  • 1
  • 18
  • 38
  • I'm not sure why you would want to do this. Is it solely to set a property? Or is there other functionality? – David Jones May 03 '16 at 08:13
  • 2
    Do you want to override on class or object level? If on class level, you can simply extend your class and override the function that way. If on object level you could pass a callback to the constructor. – Schore May 03 '16 at 08:15
  • it would be on object level, can you maybe explain further what you mean with 'you could pass a callback to the constructor'? Thanks in advance! – marius May 03 '16 at 08:18
  • I have found that a similar thread. [Custom anonymous function](http://stackoverflow.com/questions/5605404/calling-anonymous-functions-defined-as-object-variables-in-php) – Shintiger May 03 '16 at 08:26
  • Which PHP version are we talking about here? – dbf May 03 '16 at 17:11

2 Answers2

10

In order to fully understand what you are trying to achieve here, your desired PHP version should be known first, PHP 7 is more ideal for OOP approaches than any previous version.

If the binding of your anonymous function is the problem, you can bind the scope of a function as of PHP >= 5.4 to an instance, e.g.

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

As of PHP >= 7 you can call bindTo immediately on the created Closure

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

Though your approach of what you are trying to achieve is beyond my imagination. Maybe you should try to clarify your goal and I'll workout all possible solutions.

dbf
  • 3,278
  • 1
  • 24
  • 34
-6

I would use inheritance principle of OOP which works in most high-level languages:

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

$testOverriden = new TestOverriden();
$testOverriden->callAnonymTestFunc();
Maciej Asembler
  • 656
  • 3
  • 5