【发布时间】:2019-11-14 18:04:36
【问题描述】:
这是一个奇怪的情况,我认为答案是“你不能那样做,你在想什么?”但希望有人能证明我错了。
我的目标是将全局范围的函数存储在变量中,然后将其注入到类对象中执行。
- 我想避免使用 call_user_func(),因为它会在全局命名空间中搜索函数,效果与我只是从类对象中执行全局函数相同。我希望我的类执行该对象,就好像它是一个内部类方法,而不是一个外部函数。 This 接近但不完全。
- 我无法修改函数或将其包装在一个类中。
- (为什么我要跳过这些圈子?)需要在这个类中使用以遵循规范。
我知道我可以在类中复制该函数并完成它,但你知道这样做的问题(加上它在 SRP 上蔓延。)反射可以完美地工作,但这个函数不在一个类中,它就在一个包含中。我尝试将其包装为匿名函数,而闭包对象不执行该函数。
有希望做到这一点吗?该函数很简单,接受一个标量参数,对其执行一些操作,返回一个值(并且与其他代码紧密耦合,无法移动或更改。)
function someFunction($param)
{
// do some stuff
return $someScalarValue;
}
我希望是这样的
$func = someFunction([some value]); // doesn't work of course, this would store result in $func
$cls = new SomeClass($func);
然后类中的方法可以运行函数对象,很像 call_user_func 但不必搜索全局命名空间。
protected function someThing()
{
$this->injected_function([some class value]); // also doesn't work of course
}
【问题讨论】:
-
您的方法是正确的。实际上,您可以传递存储在变量中的函数。看我的回答。
-
尚不清楚为什么链接的答案对您不起作用。
call_user_func接受callable,因此不需要“搜索全局空间”。 -
对不起。我没有测试就从头开始写答案。我已经修复了我的代码。希望现在对您有所帮助。
-
@yivi 谢谢,但是函数本身在全局命名空间中——它实际上没有调用 someFunction() 吗?我到处搜索 call_user_func() 是如何执行的,但不清楚它实际上是从全局命名空间还是在类本身中运行。谢谢你们的回复,现在正在修修补补。也感谢其他人的反对。 :-\
-
直接传递一个方法怎么样?我想我没有详细理解你的问题。已针对其他建议更新答案。
标签: php function oop dependency-injection