Closures are really useful, especially for creating plugins when a full blown controller is not needed, today I came across a problem when using a closure within a class and trying to use $this-> which resulted in getting this error:
Using $this when not in object context.
The problem is PHP 5.3 does not let you use $this inside a closure, take this example I have a method with a controller inside I'm trying to use $this-> to refer to a object.
public function routes(){
Router::any('(:all)', function($request) {
$row = $this->_db->get_post_by_slug($request);
}
}
This will result in an error when using PHP 5.3 or less for 5.4+ it works fine. So if you're still using 5.3 WHY? best to upgrade to latest stable release.
To make this backwards compatible and work in 5.3 a variable can hold a reference to $this and that can be passed/bound to the closures.
To do this create a variable and pass it $this<
$class = $this;
Then for the closures use the use function and pass in $class with a & to it's not passing it as a reference but referring to the actual object.
Router::any('(:all)', function($request) use (&$class){
The important part is use (&$class) that makes $class available to the closure which is the same as $this, now instead of writing $this->_db I would write $class->_db like this:
Router::any('(:all)', function($request) use (&$class){
$row = $class->_db->get_post_by_slug($request);
}
This enables closures to refer to objects in the main class in 5.3 for 5.4+ no change is needed and $this can be used freely.
Subscribe to my newsletter for the latest updates on my books and digital products.
Find posts, tutorials, and resources quickly.
Subscribe to my newsletter for the latest updates on my books and digital products.