当前位置: 首页 > 知识库问答 >
问题:

从继承的类调用私有方法

苍轶
2023-03-14

我想用PHP在我的简单ORM中实现一个钩子系统:

class Record {
  public function save() {
    if (method_exists($this,"before_save")) {
      $this->before_save();
    }
    //...Storing record etc.
  }
}

class Payment extends Record {
  private function before_save() {
    $this->payed_at = time();
  }
}

$payment = new Payment();
$payment->save();

这会导致一个致命错误:

致命错误:调用私人方法付款::before_save()从上下文'记录'中

有道理。

我可以将范围更改为public,但这似乎很难看:在保存()之前,除了支付之外,没有人与有任何关系。最好不要公开,伊姆霍。

如何使记录调用成为从记录继承的类上的私有方法?


共有3个答案

邬令
2023-03-14

检查错误消息

Call to private method Payment::before_save() from context 'Record'

这意味着您正试图在记录调用支付中定义的函数。类Record没有before\u save方法,因为它在继承链中的位置比定义函数的位置更高。

换句话说,由于父子关系是记录(是付款的父项)付款可以访问记录函数(通过从父项继承),但反之亦然(父项不能“继承”子类函数)。您可以使您的函数受到保护,这将使它能够在继承链上下访问,但您可能需要重新考虑体系结构,并决定是否需要这样做。。理想情况下,您应该在记录中定义该函数,并在支付中覆盖该函数

另外(我可能有错),但通常不需要显式检查方法\u是否存在,除非您正在创建一个运行时类可以重叠和/或生成的真正动态系统。如果您从头定义一个基于类的系统,并且您知道如何缝合各个部分,通常您不需要在运行时检查方法\u是否存在。。。只是一个想法。。

陆洛城
2023-03-14

获胜的答案不能回答问题。有关“公共”、“受保护”、“私人”和“最终”的信息应可在任何博客或书籍上获得。

这个问题询问如何使用继承类中的“private”函数。这里的用例是,您被迫使用设计糟糕的第三方代码,不分青红皂白地使用私有函数,并且面临着要么找到使用私有函数的方法,要么放弃整个回购协议

这是问题的答案。

class foo {

    protected $text = "foo";

    private function bar($text)
    {
        return $text.'->'.$this->text;
    }
}

class fooChild extends foo{

    protected $text = "bar";

    public function barChild()
    {
        $r = new \ReflectionMethod(parent::class, 'bar');
        $r->setAccessible(true);
        //return $r->invokeArgs(new foo(), ['output']); // output->foo
        return $r->invokeArgs($this, ['output']);//output->bar
    }
}

echo (new fooChild())->barChild();

使用反射方法类,您可以从继承类调用私有方法。您可以看到使用$this和父级的新实例的区别。不会从新实例的子实例中设置属性。

颛孙兴旺
2023-03-14
匿名用户

在将save函数添加到记录类之前,将其可访问设置为protected。现在,所有从Record继承的类都将具有这个函数,如果它们不覆盖它,它将不会起任何作用。如果他们覆盖它,它可以实现所需的功能。

class Record {
  public function save() {
    $this->before_save();
    //...Storing record etc.
  }

  protected function before_save() {
     return;
  }
}

class Payment extends Record {
  protected function before_save() {
    $this->payed_at = time();
  }
}

 类似资料:
  • 问题内容: 这是一个有趣的代码片段: 我知道子类不会继承其父级的私有成员,但是obj设法在其中调用它不应具有的访问权的方法。在编译时,obj是Superclass类型,在运行时是Subclass类型。 这可能与以下事实有关:对doSomething()的调用发生在驱动程序类内部,而该驱动程序类恰好是其自己的类(以及为什么可以首先调用doSomething()的原因)。 因此问题归结为,obj如何访

  • 问题内容: 我对在继承中使用私有方法感到困惑,例如: 基于上面的代码,我感到困惑的私有方法的继承,是继承了私有方法来?还是两个类中的say方法完全无关?由于代码在main()方法中运行时出错,因此似乎无法从中调用私有方法。 问题答案: 如果您想让子类访问需要保留的超类方法,那么您正在寻找的关键字。 只允许包含该成员的类访问该成员。 允许在类及其所有子类中访问成员。 允许任何人访问该成员。

  • FAQs in section [24]: [24.1] 如何表示“私有继承”? [24.2] 私有继承和组合(composition)有什么类似? [24.3] 我应该选谁:组合还是私有继承? [24.4] 从私有继承类到父类需要指针类型转换吗? [24.5] 保护继承和私有继承的关系是什么? [24.6] 私有继承和保护继承的访问规则是什么? 24.1 如何表示“私有继承”? 用 : priv

  • 问题内容: 假设我有以下两个课程 如果我启动一个beta类型的新对象,如何执行在alpha类而不是beta中找到的逻辑?我可以使用<-我想知道是否可行。 Eclipse IDE中的自动键入功能使我可以选择从class 或class中进行选择。 问题答案: 你可以做: 注意,这是对父级的引用,但是super()是它的构造函数。

  • 我有以下类(请注意,方法是静态的): 当我打电话的时候: 我想得到输出:

  • 本文向大家介绍C++ 中私有继承的作用,包括了C++ 中私有继承的作用的使用技巧和注意事项,需要的朋友参考一下 C++ 中私有继承的作用 私有继承的 第一个规则:和公有继承相反,如果两个类之间的继承关系为私有,编译器一般不会将派生类对象转换成基类对象。 第二个规则: 从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。 私有继承的含义:私有继承意味着 "用...来实