为什么子级可以重写和访问其父私有方法?
原学程将引见为何子级不妨重写以及拜访其女公有办法?的处置办法,这篇学程是从其余处所瞅到的,而后减了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
将挪用private
A::ab
。这特殊是为了使类外部不妨坚持。假如扩大类在没有知情的情形下完成了雷同的办法,A
中的行动其实不奇异。
accessprivate()
从$b
在$a
开端不该该很佳,由于它们是分歧的类(女子)
它仍在挪用A::accessprivate
,由于B
出有完成所有此类办法,其任务道理与test
办法以及上1段中的说明雷同。
private
的重要目标是包管没有受内部或者扩大代码的搅扰。假如将办法标志为private
,则不妨异常肯定将挪用哪一个代码完成(一直是申明类),而不论办法能否在子级中被笼罩。假如您忘住这1面,这类行动是料想当中的,也是不问可知的。protected
办法显式许可并希冀重写产生,并响应天履行操纵。
佳了闭于为何子级不妨重写以及拜访其女公有办法?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。