获取父类中子类的函数名称

时间:2010-12-22 16:21:41

标签: php oop php-5.3

我想拥有一个具有基本属性和功能的基类,所以我不必在所有子类中定义它们。
我使用的是php 5.3.3。

这不可能吗?

class A {
  private $debug;
  private $var;
  protected function setVar($str) {
    $this->debug = 'Set by function `'. MAGIC_HERE .'` in class `'. get_called_class() .'`.';
    $this->var = $str;
    return true;
  }
  protected function getVar() {
    return $this->var;
  }
  protected function getDebug() {
    return $this->debug;
  }
}
class B extends A {
  public function __construct() {
    $this->doSomething();
  }
  public function doSomething() {
    $this->setVar('my string');
  }
}
$myobj = new B();
$myobj->getDebug();
// expected output "Set by function `doSomething` in class `B`."

3 个答案:

答案 0 :(得分:0)

<?php
class A {
  private $debug;
  private $var;
  protected function setVar($str) {
    $this->debug = 'Set by function `'. MAGIC_HERE .'` in class `'. get_called_class() .'`.';
    $this->var = $str;
    return true;
  }
  protected function getVar() {
    return $this->var;
  }

  // Notice the public here, instead of protected //
  public function getDebug() {
    return $this->debug;
  }
}
class B extends A {
  public function __construct() {
    $this->doSomething();
  }
  public function doSomething() {
    $this->setVar('my string');
  }
}
$myobj = new B();
echo $myobj->getDebug();
// expected output "Set by function `doSomething` in class `B`."

你只有两个小问题。 A::getDebug需要公开才能从外部访问,而您忘记输出A::getDebug的返回值。

答案 1 :(得分:0)

请参阅debug_backtrace功能。请注意,此功能很昂贵,因此您应该在生产中禁用这些调试功能。

答案 2 :(得分:0)

这对你没有好处吗?

我没有在本地运行5.3,所以我不得不切换出get_called_class(),但你仍然可以使用它。应该说清楚,抱歉。

class A {
  private $debug;
  private $var;
  protected function setVar($str, $class) {
    $this->debug = 'Set by function `` in class `'. $class .'`.';
    $this->var = $str;
    return true;
  }
  protected function getVar() {
    return $this->var;
  }
  public function getDebug() {
    return $this->debug;
  }
}
class B extends A {
  public function __construct() {
    $this->doSomething();
  }
  public function doSomething() {
    $this->setVar('my string', __CLASS__);
  }
}
$myobj = new B();
echo $myobj->getDebug();