Получить имя функции дочернего класса в родительском классе - PullRequest
0 голосов
/ 22 декабря 2010

Я хотел бы иметь базовый класс с базовыми свойствами и функциями, поэтому мне не нужно определять их во всех дочерних классах.
Я использую 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 голосов
/ 22 декабря 2010

См. Функцию debug_backtrace.Обратите внимание, что эта функция дорогая, поэтому вы должны отключить эти функции отладки в рабочей среде.

0 голосов
/ 22 декабря 2010

Разве это не хорошо для вас?

Я не использую 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();
0 голосов
/ 22 декабря 2010
<?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.

...