【问题标题】:PHP Sibling Class InheritancePHP 兄弟类继承
【发布时间】:2015-08-28 15:11:57
【问题描述】:

我对这是否可能有点困惑。我在这里查看了一些关于 SO 的帖子,但它们并没有真正解释我在寻找什么。

我有 3 节课。一个主类和两个扩展该主类的类。 (见下面的代码)。是否可以在其兄弟(另一个扩展类)的两个扩展类之一中运行方法?

如果不可能,我该如何更改我的代码以完成我在下面的示例中所做的事情?

声明

class A {

  public function __construct() {
     //do stuff
  }

}

class B extends A {

  private $classb = array();

  public function __construct() {
     parent::__construct();
     //do stuff
  }

  public function get($i) {
                return $this->classb[$i];
  }

  public function set($i, $v) {
    $this->classb[$i] = $v;
  }

}

class C extends A {

  public function __construct() {
    parent::__construct();
    //do stuff
  }

  public function display_stuff($i) {
    echo $this->get($i);  //doesn't work
    echo parent::get($i);  //doesn't work
  }
}

用法

$b = new B();
$c = new C();

$b->set('stuff', 'somestufftodisplay');
$c->display_stuff('stuff');   //   <----- Displays nothing.

【问题讨论】:

    标签: php extension-methods multiple-inheritance


    【解决方案1】:

    您的代码显示了除主要问题之外的另一个问题,因此实际上有两个答案:

    1. 不,您不能从另一个同级类中的同级类运行方法。如果需要,该方法应该在父类中。这同样适用于属性。
    2. 您不能在另一个对象中使用一个对象的属性值,即使它们都属于同一类。在一个对象中设置属性值仅在此处设置其值,因为不同的对象可以具有具有完全不同值的相同属性。如果您需要在对象之间共享某个属性的值并且还可以修改它,您应该使用static property。在这种情况下,您必须在父类中定义它,请参阅我之前的观点。

    所以要让它工作,你需要类似的东西

    class A {
    
      private static $var = array();
    
      public function get($i) {
         return self::$var[$i];
      }
    
      public function set($i, $v) {
         self::$var[$i] = $v;
      }
    }
    
    class B extends A {
    
    }
    
    class C extends A {
    
      public function display_stuff($i) {
        echo $this->get($i); // works!
      }
    }
    
    $b = new B();
    $c = new C();
    
    $b->set('stuff', 'somestufftodisplay');
    $c->display_stuff('stuff');
    

    An example.

    【讨论】:

    • 抱歉,我的代码与您的意思不匹配。我不明白。
    • C 类中的 display_stuff() 正在尝试运行 B 类的“get”方法。这怎么不符合我的问题?
    • @BestProgrammer 是的,这是我的第一点。但是您还试图从您的$c 对象访问您为$b 对象设置的属性。请注意,即使所有内容都在 A 类中,它仍然无法工作,因为 $b 对象中的属性值不适用于 $c 对象,即使它们具有完全相同的类。
    • @BestProgrammer 编辑了介绍以使其更加清晰。所以要让它工作,你需要两个:将所有东西(属性和方法)移动到父类和使属性静态。
    • 我错过了自我:: 部分我正在扯掉我的头发哈哈。我终于让它工作了。正如您所说,不能仅作为受保护的静态工作。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2016-03-16
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    相关资源
    最近更新 更多