任何想法如何不干这个?我们的想法是使用两个前提条件(= sessions)运行多次函数两次。我不想为这两个函数(= doSomething和doAnything)编写前置条件(= session var change)
class Foo {
// run doSomething() 2x with different precondition (=Session var)
function bla() {
Session::put('year', 2016);
doSomething('hello');
Session::put('year', 2015);
doSomething('hello');
}
function yoo() {
// run doAnything() 2x with different precondition (=Session var)
Session::put('year', 2016);
doAnything('world');
Session::put('year', 2015);
doAnything('world');
}
}
有这样的事情会很棒:
runWithYears(&doAnything('world'));
function runWithYears(func) {
Session::put('year', 2016);
// func should be called here
exec(func)
Session::put('year', 2015);
// func should be called here and will return a different result
exec(func)
}
由于
答案 0 :(得分:1)
您要找的是匿名函数。
匿名函数允许您将其声明为变量,允许您将其传递给其他函数,就像它是任何其他变量一样。
示例 - 将匿名函数作为参数&执行它
$myFunction = function (){
echo "I'm anonymous";
}
function runWithYears(func){
$func(); // Calling the anonymous function
}
runWithYears(myFunction);
输出:我是匿名的
答案 1 :(得分:0)
你的问题必须多于此,但事实上,你可以在设置变量后一起运行你的功能
Session::put('year', 2016);
doSomething('hello');
doAnything('world');
Session::put('year', 2015);
doSomething('hello');
doAnything('world');
答案 2 :(得分:0)
编写代码如下:
// run doSomething() and doAnything() 2x with different precondition (=Session var)
Session::put('year', 2016);
doSomething('hello');
doAnything('world');
Session::put('year', 2015);
doSomething('hello');
doAnything('world');
答案 3 :(得分:0)
http://php.net/manual/en/function.call-user-func.php
将exec
的来电替换为call-user-func
应该具有入侵效果。
虽然我个人更喜欢这两种方法。
代码将是
runWithYears('doAnything' , 'world');
function runWithYears(func, arg) {
Session::put('year', 2016);
// func should be called here
call_user_func(func, arg);
Session::put('year', 2015);
// func should be called here and will return a different result
call_user_func(func, arg);
}
虽然如果提取到2种方法,它将更易于维护和使用
答案 4 :(得分:0)
感谢@Ante Gulin的帮助。
这是我使用闭包的概念验证。
new Sandbox();
class Sandbox {
private $message;
function __construct() {
$this->first_method();
$this->second_method();
}
private function first_method() {
$test = function() {
echo($this->message." peter");
};
$this->shout($test);
}
private function second_method() {
$test = function() {
echo($this->message." spiderman");
};
$this->shout($test);
}
private function shout($func) {
$this->message = "hello";
$func();
$this->message = "cheerio";
$func();
}
}