【问题标题】:PHP : instantiate a Class and using methods of another ClassPHP:实例化一个类并使用另一个类的方法
【发布时间】:2012-04-11 10:44:51
【问题描述】:

我有一个名为 A 的类。我还有一个扩展 A 的名为 B 的类。 我必须实例化 A,而不是 B,但我也需要使用 B 中的方法。我该怎么做?

Class A
{
    public function foo() { }
}

Class B extends A
{
    public function bar() { }
}

$a = new A();
$a->bar();

我知道这是不可能的,但我需要一个解决方案。

PS:我希望这个问题的标题是正确的。

【问题讨论】:

  • 为什么不能实例化B?我认为这是你的实际问题。
  • 我的印象是设计问题而不是语法问题。
  • 想详细说明为什么不能实例化 B?

标签: php class methods instantiation


【解决方案1】:
$a = new A();
$a->bar();

会给你致命的错误。因为bar() 不是A 类的方法。 所以你不能使用A类的对象来调用它。

这样可以正常工作:

Class A
{
   public function foo() { }
}

Class B extends A
{
   public static function bar() {  }
}

$a = new A();
B::bar();

【讨论】:

    【解决方案2】:

    我想,你只是误解了 PHP 的语法(Which can be rather confusing sometimes

    extends 关键字不会扩展父类 (A),但会创建一个新类 B,它是 A 的子类。 B 继承 A 的方法,但 A 本身并没有改变。

    【讨论】:

      【解决方案3】:

      B中的方法可以变成静态的吗?

      Class A
      {
          public function foo() { }
      }
      
      Class B extends A
      {
          public static function bar2() { }
      }
      
      $a = new A();
      $a->bar();
      B::bar2();
      

      显然,将它命名为不同的名称是有意义的,因为 B::bar() 正在覆盖 A::bar() 实现。

      我认为您的结构可能略有偏差。尝试将您想要的内容抽象为可重用的代码 sn-p 到它自己的例程中。

      【讨论】:

        猜你喜欢
        • 2014-11-05
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 2014-10-27
        • 2015-06-10
        相关资源
        最近更新 更多