Php 如何指向另一个函数?这可能吗?

Php 如何指向另一个函数?这可能吗?,php,scripting,Php,Scripting,目的是缩短函数的名称 我有一个名为somedescriptivefunctionName的函数 function somedescriptivefunctionName($a) { echo $a; } 我想把它分配给$this->f,这样我就不会在代码中乱丢长名字了 $this->f('Yahoo!!'); // will echo 'Yahoo!!' e、 g.我想象这样的情况: $this->f = $this->somedescriptivefunctionN

目的是缩短函数的名称

我有一个名为
somedescriptivefunctionName
的函数

function somedescriptivefunctionName($a) {
   echo $a;
}
我想把它分配给
$this->f
,这样我就不会在代码中乱丢长名字了

$this->f('Yahoo!!'); // will echo 'Yahoo!!'
e、 g.我想象这样的情况:

$this->f = $this->somedescriptivefunctionName; // wrong way
这可能吗


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

您可以将属性绑定到闭包,并将属性作为方法调用:

T类{
私人$f;
函数abcdefghijklmnopqrstuvwxyz($param){
echo$param;
}
函数_u构造(){
$this->f=fn();
}
函数doWork(){
($this->f)('hello');
$g=$this->f;
$g(“世界”);
}
}
(新T())->doWork();
在这段代码中,类
f
属性通过一个箭头函数绑定到一个闭包,该函数从PHP7.4开始可用,我们可以通过
func\u get\u args
动态获取传递的参数。如果您使用的是低于7.4的版本,也可以使用常规匿名函数

不幸的是,如果不使用一组额外的括号(这意味着您必须执行
($this->f)('hello')
),则无法将do-to属性作为方法调用。如果您想跳过这一步,可以进一步将class属性分配给一个局部变量,然后在执行
$g
时可以正常调用该局部变量

编辑

这是一个不使用箭头函数的构造函数版本,它以相同的方式调用

函数uuu构造()
{
$this->f=函数(){
返回$this->abcdefghijklmnopqrstuvxyz(…func_get_args());
};
}

您将把字符串存储在某个地方

$f = "somedescriptivefunctionName";
然后通过在花括号中指定函数名来调用该函数:

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

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

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的惊人答案复制过来的:


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

这里的f是函数还是变量?f应该是我想给我的函数起的新名称(somedescriptivefunctionName)它已经存在。但你是对的,它也是一个变量。如果你想,你可以选择$f而不是$this->他们在同一个类中,继承或任何其他场景?@Chilarai让我们现在保持简单。假设他们在同一个类中,这是非常好的。如果不是因为它是php7.4+和以下内容:$this->f=fn()=>$this->plcfg->errorTitle(…func_get_args());$this->errorTitle=$this->f;echo($this->errorTitle)('fatal','hello');我们不需要括号就可以进入这个阶段了,例如:echo$this->errorTitle('fatal','hello');如果我们能够做到这一点,那么两个类中的调用将完全相同(当前类,以及住在$this->plcfg中的远程类)谢谢!!!我可以确认这有点有用,但我需要更好的东西。使用您的方法,我这样做了,它工作:$ref=new ReflectionClass($this->config_类);$this->plcfg=$ref->newInstanceWithoutConstructor();$errorTitle='errorTitle';echo$this->plcfg->>${errorTitle}('fatal','asdf');我的目标是真正能够做到这一点:echo$this->errorTitle('fatal','asdf');如果我们能够做到这一点,那么在两个类中的调用将完全相同(当前类和位于$this->plcfg中的远程类),谢谢!!!