我使用一个自制的MVC系统,其中Views通过在方法的上下文中访问模型,因此能够访问$this
。
动态包含的视图示例:
...
<div>
Hello <?= $this->user->name ?>
</div>
...
现在,我有一些代码,我想将其分解为函数,以及一些额外的参数。 例如:
function colored_hello($color) {
?>
<div style="background-color:<?= $color ?>">
Hello <?= $this->user->name ?>
</div>
<?
}
问题是我无权访问$this
,因为该函数不是方法。
但我不想用演示文稿来破坏我的模型或控制器。
Hance,我希望能够动态调用此函数,作为一种方法。 像面向方面的编程一样:
# In the top view
magic_method_caller("colored_hello", $this, "blue")
有可能吗? 或者你看到了更好的方法吗?
答案 0 :(得分:3)
您必须稍微改变/调用您的函数,但您可以从对象内部访问$this
。
class test {
private $property = 'hello!';
}
$obj = new test;
$closure = function() {
print $this->property;
};
$closure = $closure->bindTo($obj, 'test');
$closure();
答案 1 :(得分:1)
将$this
作为属性传递,但严肃地说:你的视图文件中不应该有真正的函数。
答案 2 :(得分:0)
它有点像黑客,但您可以使用debug_backtrace()来获取调用者对象。但我认为你只能有公共价值观:
function colored_hello($color) {
$tmp=debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT);
$last=array_pop($tmp);
$caller = $last['object'];
print_r($tmp);
print_r($last);
print_r($caller);
?>
<div style="background-color:<?= $color ?>">
Hello <?= $caller->user->name ?>
</div>
<?
}
(代码不是testet,但它给你一个提示:-))
答案 3 :(得分:-1)
您也可以将其传递给函数:
function coloured_hello($object, $color) {
//Code
$object->user->name;
}