首页 > 解决方案 > 我如何指向另一个函数?这可能吗?

问题描述

目的是使函数的名称更短。

我有一个名为somedescriptivefunctionName.

function somedescriptivefunctionName($a) {
   echo $a;
}

我想将它分配给$this->f这样我就不会乱扔长名称的代码。

$this->f('Yahoo!!'); // will echo 'Yahoo!!'

例如,我想象这样的事情:

$this->f = $this->somedescriptivefunctionName; // wrong way

这可能吗?

当然我可以创建一个新函数 f,并返回一些描述性函数名()。但这不是重点。

标签: phpscripting

解决方案


您将在某处存储字符串

$f = "somedescriptivefunctionName";

然后通过在大括号中指定其名称来调用该函数:

$this->{$f}('Yahoo!!');

编辑

根据评论部分,目的是用相同的名称调用另一个类的实例的方法。您可以扩展配置类以实现某种类似的行为,但我认为在这种情况下作为解决方案是不可接受的。您可以将您的类转换为装饰器,例如

class SomeClassDecorator
{
    protected $_instance;

    public function myMethod() {
        return strtoupper( $this->_instance->someMethod() );
    }

    public function __construct(SomeClass $instance) {
        $this->_instance = $instance;
    }

    public function __call($method, $args) {
        return call_user_func_array(array($this->_instance, $method), $args);
    }

    public function __get($key) {
        return $this->_instance->$key;
    }

    public function __set($key, $val) {
        return $this->_instance->$key = $val;
    }

    // can implement additional (magic) methods here ...
}

上面的代码是从 Gordon 的惊人答案复制而来的:如何在 PHP 中向现有类添加方法?

这个想法的演变可能是为您的配置类创建一个装饰器作为基类,并为您配置的类扩展该基类,因此您将实现单个装饰器并(重新)使用它。


推荐阅读