note 102615 added to functions.anonymous

From: Date: Thu, 24 Feb 2011 15:51:10 +0000
Subject: note 102615 added to functions.anonymous
Groups: php.notes 
Request: Send a blank email to php-notes+get-177297@lists.php.net to get a copy of this message
You may have been disapointed if you tried to call a closure stored in an instance variable as you would regularly do with methods: <?php $obj = new StdClass(); $obj->func = function(){ echo "hello"; }; //$obj->func(); // doesn't work! php tries to match an instance method called "func" that is not defined in the original class' signature // you have to do this instead: $func = $obj->func; $func(); // or: call_user_func($obj->func); // however, you might wanna check this out: $array['func'] = function(){ echo "hello"; }; $array['func'](); // it works! i discovered that just recently ;) ?> Now, coming back to the problem of assigning functions/methods "on the fly" to an object and being able to call them as if they were regular methods, you could trick php with this lawbreaker-code: <?php class test{ private $functions = array(); private $vars = array(); function __set($name,$data) { if(is_callable($data)) $this->functions[$name] = $data; else $this->vars[$name] = $data; } function __get($name) { if(isset($this->vars[$name])) return $this->vars[$name]; } function __call($method,$args) { if(isset($this->functions[$method])) { call_user_func_array($this->functions[$method],$args); } else { // error out } } } // LET'S BREAK SOME LAW NOW! $obj = new test; $obj->sayHelloWithMyName = function($name){ echo "Hello $name!"; }; $obj->sayHelloWithMyName('Fabio'); // Hello Fabio! // THE OLD WAY (NON-CLOSURE) ALSO WORKS: function sayHello() { echo "Hello!"; } $obj->justSayHello = 'sayHello'; $obj->justSayHello(); // Hello! ?> NOTICE: of course this is very bad practice since you cannot refere to protected or private fields/methods inside these pseudo "methods" as they are not instance methods at all but rather ordinary functions/closures assigned to the object's instance variables "on the fly". But I hope you've enjoyed the jurney ;) ---- Server IP: 69.147.83.197 Probable Submitter: 187.54.190.149 ---- Manual Page -- http://www.php.net/manual/en/functions.anonymous.php Edit -- https://master.php.net/note/edit/102615 Del: integrated -- https://master.php.net/note/delete/102615/integrated Del: useless -- https://master.php.net/note/delete/102615/useless Del: bad code -- https://master.php.net/note/delete/102615/bad+code Del: spam -- https://master.php.net/note/delete/102615/spam Del: non-english -- https://master.php.net/note/delete/102615/non-english Del: in docs -- https://master.php.net/note/delete/102615/in+docs Del: other reasons-- https://master.php.net/note/delete/102615 Reject -- https://master.php.net/note/reject/102615 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#177297) next »