在课堂上获取父功能

时间:2011-05-15 15:45:36

标签: php

以某种方式可能吗?如果是这样的话怎么样?! 我知道我可以通过一个参数,但我希望它是动态的!

<?php

class my_class {

  protected $parent = NULL;

  public function __construct() {

    // now i'd like to get the name of the function where this class has been called
    $this->parent = get_parent_function();

  }

  public function parent() {
    return $this->parent;
  }

}

function some_random_function() {
  // Do something
  $object = new my_class();

  print $object->parent(); // returns: some_random_function
}

?>

提前致谢!

3 个答案:

答案 0 :(得分:5)

坦率地说,这似乎是一个非常糟糕的设计选择,但是可以使用PHP内置debug_backtrace函数使用调用堆栈内省来做到这一点。以下示例来自php documentation for debug_backtrace

<?php
// filename: /tmp/a.php

function a_test($str)
{
    echo "\nHi: $str";
    var_dump(debug_backtrace());
}

a_test('friend');
?>

<?php
// filename: /tmp/b.php
include_once '/tmp/a.php';
?>

如果执行b.php,输出可能如下所示:

Hi: friend
array(2) {
[0]=>
array(4) {
    ["file"] => string(10) "/tmp/a.php"
    ["line"] => int(10)
    ["function"] => string(6) "a_test"
    ["args"]=>
    array(1) {
      [0] => &string(6) "friend"
    }
}
[1]=>
array(4) {
    ["file"] => string(10) "/tmp/b.php"
    ["line"] => int(2)
    ["args"] =>
    array(1) {
      [0] => string(10) "/tmp/a.php"
    }
    ["function"] => string(12) "include_once"
  }
}

如果你很聪明,你可以使用回溯中函数的函数名称来调用它,例如debug_backtrace()[1]['function'](),但只有在您当前正在执行的范围内定义函数时才会起作用。有关通过字符串中的名称调用函数的详细信息,请参阅php documentation on variable functions

在我看来,你应该没有理由在精心设计的程序中这样做。也许您应该考虑使用对象和对象的引用。

答案 1 :(得分:1)

您也可以使用(即使可能有更好的设计):

public function __construct($functionname = NULL) {
    $this->parent = $functionname; 
}

然后只是:

function some_random_function() {
  // Do something
  $object = new my_class('some_random_function');

  print $object->parent(); // returns: some_random_function
}

答案 2 :(得分:0)

如果要获取调用my_class构造函数的函数的名称,可以使用PHP的debug_backtrace,如下所述:

How to get name of calling function/method in PHP?