如何访问" $ this"从一个功能

时间:2012-07-26 14:54:01

标签: php model-view-controller aop

我使用一个自制的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")

有可能吗? 或者你看到了更好的方法吗?

4 个答案:

答案 0 :(得分:3)

查看Closure::bindTo

您必须稍微改变/调用您的函数,但您可以从对象内部访问$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;
}