Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 找出方法是否是通过trait调用的?_Php_Traits - Fatal编程技术网

Php 找出方法是否是通过trait调用的?

Php 找出方法是否是通过trait调用的?,php,traits,Php,Traits,在PHP中,如何确定类方法是否是通过从trait继承的方法调用的 假设我有一个类myClass,它使用Psr\Log\LoggerTrait(请参阅:)。我需要能够找出方法myClass::log()是通过Psr\log\LoggerTrait中的方法调用的,例如LoggerTrait::debug(),还是直接从外部myClass调用的 所有的方法都是非静态的 这与调试包有关。我并没有试图根据呼叫者来改变行为,我只是需要能够将这些信息向前传递。更准确地说,我只需要一个入口,也就是说,我的包裹外

在PHP中,如何确定类方法是否是通过从trait继承的方法调用的

假设我有一个类
myClass
,它使用
Psr\Log\LoggerTrait
(请参阅:)。我需要能够找出方法
myClass::log()
是通过
Psr\log\LoggerTrait
中的方法调用的,例如
LoggerTrait::debug()
,还是直接从外部
myClass
调用的

所有的方法都是非静态的

这与调试包有关。我并没有试图根据呼叫者来改变行为,我只是需要能够将这些信息向前传递。更准确地说,我只需要一个入口,也就是说,我的包裹外的最后一个电话

我正在看
debug\u backtrace()
,但它似乎没有提供任何直接的解决方案。有什么合理的方法可以做到这一点吗

下面是一些代码:

<?php

class myClass
{
    use Psr\Log\LoggerTrait;

    public function log($level, $message, array $context = array())
    {
        if (called_via_trait) {
            ...
        } else {
            ...
        }
    }
}

$myObject = new myClass;

$myObject->log('debug', 'This is a direct call');
$myObject->debug('This is a call via a trait method');
您可以使用来确定调用它的类

trait Test {
   public function doTest() {
       echo get_called_class() . "\n";
   }
}

class Some {
    use Test;

    public function myFunc() {
        $this->doTest();
    }
}

$some = new Some();
$some->myFunc(); // Outputs "Some" since Some uses Test
在你的课堂上,你可以做一些

function test() {
    if(get_called_class() == 'myClass') {
        // You're in the myClass class
    } else {
        // You're not in the myClass class
    }
}

是的,您必须使用
debug_backtrace()请遵循我的示例:

namespace Psr\Log; 
class LoggerTrait{
     public static function debug(){
        return myClass::log();
    }
}
class myClass{

     public static function log(){
        $trace = debug_backtrace();
        if(isset($trace[1])){
            echo'<br />Called by  <b>'.$trace[1]['class'].'</b>. ';
        } else {
            echo'<br />Called by  <b>'.$trace[0]['class'].'</b>. ';
        }
        if(isset($trace[1]['class']) && $trace[1]['class']!=get_class()){
            echo'Called outside';
        } else {
            echo'Called inside';
        }
        //return get_class();
    }
}


trait ExampleTrait {
    public function doSay() {
        echo LoggerTrait::debug();
        echo myClass::log();
    }
}
echo LoggerTrait::debug();
echo myClass::log();
echo ExampleTrait::doSay();
名称空间Psr\Log;
类记录器特性{
公共静态函数debug(){
返回myClass::log();
}
}
类myClass{
公共静态函数日志(){
$trace=debug_backtrace();
if(isset($trace[1])){
echo'
由'$trace[1]['class']调用; }否则{ echo'
由'$trace[0]['class']调用; } if(isset($trace[1]['class'])&&&$trace[1]['class']!=get_class()){ 呼应“叫在外面”; }否则{ 回声“被称为内在”; } //返回get_class(); } } 特点,特征{ 公共职能部门{ echo LoggerTrait::debug(); echo myClass::log(); } } echo LoggerTrait::debug(); echo myClass::log(); echo ExampleTracit::doSay();
啊,很抱歉问题中的歧义,我忘了提到方法是非静态的。我把信息添加到问题中。我一直想知道为什么标准是在文档中使用可怕的“Paamayim-Nekudotayim”,即使是非静态方法。这就是发生的事情。。。不管怎样,谢谢你的回答,我正在投票,因为它回答了可能出现的情况。为什么你需要知道谁在给你的班级打电话?我会考虑寻找另一种方法。“约翰卡特赖特,我不需要知道是谁呼叫它,只是这个呼叫是从我的包裹里面或外面传来的。我在这里处理调试信息,所以它非常相关。要确定这一点,你需要确定谁给你打电话。我也不太清楚你说的包裹到底是什么意思。无论如何,为了确保我没有忽略某些东西,为什么不支持不同行为的多个接口?让包内的代码调用与外部使用者不同的接口。我有一种感觉,我不明白你想要完成什么。@JohnCartwright所说的包,我指的是一个可以作为一个包含在内的包被获取并在另一个项目中使用的包。由于我使用的是
LoggerTrait
,因此必须有一个public
log()
。我没有试图找到要改变行为的调用方,而是要使其保持静态:包处理调试,因此无论调用
log()
方法的方式如何,它都应该能够找到调用的来源。感谢您的回答,但这里的问题是
get_class()
始终是
myClass
,所以这行不通。