Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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获取类的名称_Php_Oop - Fatal编程技术网

php获取类的名称

php获取类的名称,php,oop,Php,Oop,有没有办法让一个在另一个内部调用的类知道外部类的名称 例如: class A{ // need to get the name of B // some stuff } class B{ $var = new A; } 因为B不是a的孩子,所以不能做这项工作 有什么建议吗 编辑:对不起,各位,我不得不改变问题。我想问的是,类A能否知道调用它的类的名称。再次为愚蠢的第一个问题感到抱歉。你想要什么 get_class-返回对象类的名称 编辑 正如戈登所说,这是不可能的。您可能能够解析

有没有办法让一个在另一个内部调用的类知道外部类的名称

例如:

class A{
  // need to get the name of B
  // some stuff
}

class B{
  $var = new A;
}
因为B不是a的孩子,所以不能做这项工作

有什么建议吗

编辑:对不起,各位,我不得不改变问题。我想问的是,类A能否知道调用它的类的名称。再次为愚蠢的第一个问题感到抱歉。

你想要什么

get_class-返回对象类的名称

编辑 正如戈登所说,这是不可能的。您可能能够解析调用堆栈以查看您所在的类调用了哪个类,但我不会这样做。

不,这是不可能的

嗯,差不多了。您可以从或黑客攻击到调用类,但这是相当低效和缓慢的。有许多函数可以帮助您实现这一点,但所有这些都不是您想要的生产代码

最简单的方法是将B的实例传递给A,例如

class A {
    protected $callerInstance;
    protected $callerClassName
    public function __construct($caller) {
        $this->callerInstance = $caller;
        $this->callerClassName = get_class($caller);
    }
}

如果您将类B的名称传递给类A构造函数,这是可能的。这需要在类a和所有需要它的类中进行修改。老练,但做你需要的

class A{
  function __construct($caller){
     echo $caller; // will echo B, C and D respectively
  }
}

class B{
   $var = new A(get_class($this));
}

class C{
   $var = new A(get_class($this));
}

class D{
   $var = new A(get_class($this));
}

我完全同意你的看法。不明白为什么人们会投反对票。+1感谢正确阅读问题并获得正确答案。再次感谢您指出问题中的错误我应该为此得到一枚徽章:因为对你试图做什么似乎有些困惑,请改进这个问题。
class A{
  function __construct($caller){
     echo $caller; // will echo B, C and D respectively
  }
}

class B{
   $var = new A(get_class($this));
}

class C{
   $var = new A(get_class($this));
}

class D{
   $var = new A(get_class($this));
}