【问题标题】:PHP check if method called from extened classPHP检查是否从扩展类调用方法
【发布时间】:2015-01-18 19:12:17
【问题描述】:

我有两个类的代码

class old{
    function query(){
        #do some actions ...
    }

    function advancedQuery(){
        #some actions and then
        $this->query();
    }
}

class awesome extends old{
   function query(){
        parent::query();

        $fromClassOld = false; # this variable must be changed if method is called from class 'OLD'
        if( $fromClassOld ){
            echo 'foo ';
        }else{
            echo 'bar ';
        }
   }
}

然后是这样的一些用法

$awesome = new awesome();
$awesome->query(); # should return 'bar'
$awesome->advancedQuery(); # should return 'foo'

您可以在这里查看代码http://goo.gl/Gq63Wk

如果从类“old”调用方法 query(),我希望更改该变量 $fromClassOld。

类旧不能修改。

我通过使用 debug_backtrace() 并检查变量 debug_backtrace()[0]['file'] 发现了 hack,但我很确定这可以通过更好的方式解决。

【问题讨论】:

  • 简单的答案 - 没办法。另一个问题 - 你需要这个做什么?
  • 您说您无法更改class old 的行为,但实际上您正在尝试在子类中更改它。您可以告诉它在子类的扩展方法中采取不同的操作,但根据定义,如果您在父类中使用类似的方法,则不能调用子类中的代码。
  • 哇,我很惊讶这无法完成。我正在替换项目中的旧数据库类。但我想保持旧功能。主要问题新旧类有方法 query() 但它的功能不同。

标签: php class-extensions


【解决方案1】:

你不能。如果你在子类上调用方法,那么你在子类上调用方法。如果您在父类上调用方法,则它无法访问子类的方法。所以你的advancedQuery()永远不会去awesome::query(),而只会去old::query()

您所能做的就是在awesome 类中创建另一个advancedQuery()

【讨论】:

    【解决方案2】:

    我能做的最好的事情:

    $bt = debug_backtrace();
    end($bt);
    var_dump($bt[key($bt)]['class']);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多