gpt4 book ai didi

php - 是否可以存储对对象方法的引用?

转载 作者:行者123 更新时间:2023-12-04 20:25:25 24 4
gpt4 key购买 nike

假设这个类代码:

class Foo {
function method() {
echo 'works';
}
}

有没有办法存储对 method 的引用? Foo的方法实例?

我只是在试验和摆弄,我的目标是检查 PHP 是否允许调用 $FooInstance->method()不写 $FooInstance->每次。我知道我可以为此编写一个函数包装器,但我对获取对实例方法的引用更感兴趣。

例如,这个伪代码理论上会存储 $foo->method$method多变的:
$foo = new Foo();
$method = $foo->method; //Undefined property: Foo::$method
$method();

显然,如 method是一种方法,我不会用 () 调用它口译员认为我正在寻找房产,因此这不起作用。

我已通读 Returning References但这些示例只展示了如何返回对变量的引用,而不是方法。

因此,我修改了代码以将匿名函数存储在变量中并返回:
class Foo {
function &method() {
$fn = function() {
echo 'works';
};
return $fn;
}
}

$foo = new Foo();
$method = &$foo->method();
$method();

这有效,但相当丑陋。此外,没有简单的方法可以一次性调用它,因为这似乎需要在调用之前将返回的函数存储在变量中: $foo->method()();($foo->method())();是语法错误。

此外,我尝试直接返回匿名函数而不将其存储在变量中,但随后我收到以下通知:

Notice: Only variable references should be returned by reference



这是否意味着返回/存储对类实例方法的引用是不可能的/不鼓励的,或者我忽略了什么?

更新:我不介意在必要时添加一个 getter,目标只是获得对该方法的引用。我什至试过:
class Foo {
var $fn = function() {
echo 'works';
};
function &method() {
return $this->fn;
}
}

但是来自 unexpected 'function' (T_FUNCTION)错误 我相信 PHP 明智地不允许属性存储函数。

我开始相信,如果不使用丑陋的黑客技术,我的目标是不容易实现的,如 eval() .

最佳答案

这是。您必须使用具有两个值的数组:类实例(或类名称的字符串,如果您正在调用静态方法)和作为字符串的方法名称。这记录在 Callbacks Man page 上:

A method of an instantiated object is passed as an array containing an object at index 0 and the method name at index 1.



演示 ( Codepad ):
<?php
class Something {
public function abc() {
echo 'called';
}
}

$some = new Something;

$meth = array($some, 'abc');

$meth(); // 'called'

请注意,这也适用于需要回调的内置函数 ( Codepad ):
class Filter {
public function doFilter($value) {
return $value !== 3;
}
}

$filter = new Filter;
$test = array(1,2,3,4,5);
var_dump(array_filter($test, array($filter, 'doFilter'))); // 'array(1,2,4,5)'

对于静态方法——请注意 'Filter'而不是类的实例作为数组中的第一个元素( Codepad ):
class Filter {
public static function doFilter($value) {
return $value !== 3;
}
}

$test = array(1,2,3,4,5);

var_dump(array_filter($test, array('Filter', 'doFilter'))); // 'array(1,2,4,5)'
// -------- or -----------
var_dump(array_filter($test, 'Filter::doFilter')); // As of PHP 5.2.3

关于php - 是否可以存储对对象方法的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16380745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com