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();
5
  • I'm not sure why you would want to do this. Is it solely to set a property? Or is there other functionality? Commented May 3, 2016 at 8: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. Commented May 3, 2016 at 8: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! Commented May 3, 2016 at 8:18
  • I have found that a similar thread. Custom anonymous function Commented May 3, 2016 at 8:26
  • Which PHP version are we talking about here? Commented May 3, 2016 at 17:11

2 Answers 2

11

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.

Sign up to request clarification or add additional context in comments.

1 Comment

I wanted to inject a new function (not override an existing), but __magic methods prevent that.
-8

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();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.