在php中获取父级扩展类

发布于 2024-12-18 15:05:59 字数 438 浏览 0 评论 0原文

我有 oop php 代码:

class a {
    // with properties and functions
}

class b extends a {
    public function test() {
        echo __CLASS__; // this is b
        // parent::__CLASS__ // error
    }
}

$b = new b();
$b->test();

我有一些父类(普通和抽象)和许多子类。子类扩展父类。因此,当我在某个时刻实例化孩子时,我需要找出我调用的父母。

例如,函数 b::test() 将返回 a

我如何从我的类 b 中获取(从我的代码中)类 a

谢谢

i have the oop php code:

class a {
    // with properties and functions
}

class b extends a {
    public function test() {
        echo __CLASS__; // this is b
        // parent::__CLASS__ // error
    }
}

$b = new b();
$b->test();

I have a few parent class (normal and abstract) and many child classes. The child classes extend the parent classes. So when I instantiate the child at some point I need to find out what parent I called.

for example the function b::test() will return a

How can I get (from my code) the class a from my class b?

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

愿得七秒忆 2024-12-25 15:06:00

您的代码建议您使用 parent,这实际上是您所需要的。问题在于神奇的 __CLASS__ 变量。

文档指出:

从 PHP 5 开始,该常量返回声明时的类名。

这正是我们所需要的,但正如 php.net 上的此评论中所述:

claude 指出,__CLASS__ 始终包含调用它的类,如果您希望调用该方法的类使用 get_class($this) 代替。然而,这仅适用于实例,不适用于静态调用。

如果您只需要父类,也有一个函数。那个叫做 get_parent_class

Your code suggested you used parent, which in fact is what you need. The issue lies with the magic __CLASS__ variable.

The documentation states:

As of PHP 5 this constant returns the class name as it was declared.

Which is what we need, but as noted in this comment on php.net:

claude noted that __CLASS__ always contains the class that it is called in, if you would rather have the class that called the method use get_class($this) instead. However this only works with instances, not when called statically.

If you only are in need of the parent class, theres a function for that aswell. That one is called get_parent_class

愿得七秒忆 2024-12-25 15:06:00

您可以使用 get_parent_class

class A {}
class B extends A {
  public function test() {
    echo get_parent_class();
  }
}

$b = new B;
$b->test(); // A

如果 B::test 是静态的,这也将起作用。

注意:使用不带参数的 get_parent_class 与将 $this 作为参数传递之间存在细微差别。如果我们将上面的示例扩展为:

class C extends B {}

$c = new C;
$c->test(); // A

我们将 A 作为父类(调用该方法的 B 的父类)。如果您始终想要正在测试的对象最接近的父对象,则应该使用 get_parent_class($this) 代替。

You can use get_parent_class:

class A {}
class B extends A {
  public function test() {
    echo get_parent_class();
  }
}

$b = new B;
$b->test(); // A

This will also work if B::test is static.

NOTE: There is a small difference between using get_parent_class without arguments versus passing $this as an argument. If we extend the above example with:

class C extends B {}

$c = new C;
$c->test(); // A

We get A as the parent class (the parent class of B, where the method is called). If you always want the closest parent for the object you're testing you should use get_parent_class($this) instead.

峩卟喜欢 2024-12-25 15:06:00
class a {
  // with propertie and functions
}

class b extends a {

   public function test() {
      echo get_parent_class($this);
   }
}


$b = new b();
$b->test();
class a {
  // with propertie and functions
}

class b extends a {

   public function test() {
      echo get_parent_class($this);
   }
}


$b = new b();
$b->test();
勿忘心安 2024-12-25 15:06:00

您可以使用反射来做到这一点:

而不是

parent::__CLASS__;

使用

$ref = new ReflectionClass($this);
echo $ref->getParentClass()->getName();

You can use reflection to do that:

Instead of

parent::__CLASS__;

use

$ref = new ReflectionClass($this);
echo $ref->getParentClass()->getName();
蓝天白云 2024-12-25 15:06:00

请改用class_parents。它将给一系列的父母。

<?php
class A {}
class B extends A {
}
class C extends B {
    public function test() {
        echo implode(class_parents(__CLASS__),' -> ');
    }
}

$c = new C;
$c->test(); // B -> A

Use class_parents instead. It'll give an array of parents.

<?php
class A {}
class B extends A {
}
class C extends B {
    public function test() {
        echo implode(class_parents(__CLASS__),' -> ');
    }
}

$c = new C;
$c->test(); // B -> A
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文