为什么子级可以重写和访问其父私有方法?

原学程将引见为何子级不妨重写以及拜访其女公有办法?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

为什么子级可以重写和访问其父私有方法? 教程 第1张

成绩描写

我习气于将办法作为protected搁在我的PHP类中。但是玩private我开端疑惑了。

我晓得它能够是复成品,但是我从我读到的普通谜底中找没有到清楚的谜底。
已检讨documentation以及SO answers,但是我的尝试依然与那边所说的纷歧致(睹下文)。

在PHP高低文中,特别是在扩大雷同典型的类时,public以及private办法之间的"胶葛"没有常被说明。

比方:

<?php

class A
{
 private function ab() { echo 'test'.PHP_EOL; }
 public function test() { $this->ab(); }
 public function accessprivate($obj)  { $obj->ab(); }
}

class B extends A
{
  public function ab() { echo 'overridden-public'.PHP_EOL; }  // expect notice overriding private parent method
}

$a = new A;
$a二 = new A;
$b = new B;

$a->test(); // expect 'test'
$b->test(); // expect access to B::ab() and print 'overridden-public'
$b->ab();// expect access to B::ab() and print 'overridden-public'
$a二->accessprivate($a); // expect 'test' since is the same class
$b->accessprivate($a); // expect cannotaccess private of A from class B

运转时,成果以下:

test test overridden-public test test

要面是我估计private办法是继续的,但是子类不克不及拜访;是以:

    我应当没法将ab()的看来性变动为public

    经由过程重写B中的ab(),我愿望test()$this上浮用ab()作为B虚例,并挨印

    accessprivate()$a二开端$a不妨,由于它们是统一个类

    accessprivate()$b开端$a应当不可,由于它们是分歧的类(女子)

所以成绩是:

    为何我说错了?我误会了甚么?

    这类看来性模子在其余说话上是雷同的,照样PHP的操纵方法分歧?在这类情形下,我的希冀能否更相符其余说话的看来性模子?

推举谜底

我应当没法将ab()的看来性变动为public

重写完成必需具备雷同的看来性,才没有会违背LSP。笼罩完成没有地下女完成,是以这里出有基本的成绩。假如女对于象的完成长短大众的,这么不管出于何种目标,它皆没有存留。不管出于何种目标,儿童皆是在向类中添减1个新办法,这很佳。

经由过程重写B中的ab(),我愿望test()$this上浮用ab()作为B虚例,并输入"Overoverden-Public"

private办法被"硬绑定"到申明类。A::test将挪用privateA::ab。这特殊是为了使类外部不妨坚持。假如扩大类在没有知情的情形下完成了雷同的办法,A中的行动其实不奇异。

accessprivate()$b$a开端不该该很佳,由于它们是分歧的类(女子)

它仍在挪用A::accessprivate,由于B出有完成所有此类办法,其任务道理与test办法以及上1段中的说明雷同。

private的重要目标是包管没有受内部或者扩大代码的搅扰。假如将办法标志为private,则不妨异常肯定将挪用哪一个代码完成(一直是申明类),而不论办法能否在子级中被笼罩。假如您忘住这1面,这类行动是料想当中的,也是不问可知的。protected办法显式许可并希冀重写产生,并响应天履行操纵。

佳了闭于为何子级不妨重写以及拜访其女公有办法?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。