On 11/1/07, Sebastian Hopfe <[EMAIL PROTECTED]> wrote:
>
> I think you should log it, because it seems to be, and you found this
> error.


i would not consider this a bug.
what paul is asking about is the variable function syntax in php.
http://www.php.net/manual/en/functions.variable-functions.php

whats happening is php is not resolving the first portion of the variable
contents
to a class name, nor is it capable of resolving the scope resolution syntax
when
dynamically evaluating a variable contents in the context of a method call.
there is no mention of such support in the manual.

consider this fragament (it will not work)
class DynamicMethodCaller {
public function memFunc() {
echo __METHOD__ . PHP_EOL;
}

public function invoker($dynamicMethod) {
$dynamicMethod();
}
}

$instance = new DynamicMethodCaller();
$instance->invoker('$this->memFunc');


now consider this revision (which works perfectly)
class DynamicMethodCaller {
public function memFunc() {
echo __METHOD__ . PHP_EOL;
 }

public function invoker($dynamicMethod) {
$this->$dynamicMethod();
 }
 }

$instance = new DynamicMethodCaller();
$instance->invoker('memFunc');


the only difference between this fragment and the one
originally posted is the use of static member functions in the
original post.  here are 2 fragments showing what works
and what doesnt when working with static class member functions

(doest work)
class DynamicMethodCaller {
static public function memFunc() {
echo __METHOD__ . PHP_EOL;
 }

public function invoker($dynamicMethod) {
$dynamicMethod();
 }
 }

$instance = new DynamicMethodCaller();
$instance->invoker('DynamicMethodCaller::memFunc');

(works)
class DynamicMethodCaller {
public function memFunc() {
echo __METHOD__ . PHP_EOL;
 }

public function invoker($dynamicMethod) {
self::$dynamicMethod();
 }
 }

$instance = new DynamicMethodCaller();
$instance->invoker('memFunc');

in general the use of eval() should be avoided unless absolutely necessary.
in this case it is not necessary; just use the syntax supported by the
interpreter
and youre good to go.

-nathan

Reply via email to