欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php子类重载父类私有方法的疑问

程序员文章站 2022-03-22 19:54:28
...
test(10);?>

上述代码中:
子类B虽然继承了A,但是A中的test()是私有方法,原则上应该是不会被继承的,为什么在B中定义一个同名但是参数不同的test()会报错呢,这也算是重载的错误吗?


回复讨论(解决方案)

test($a);		}	}		$var1=new B;	$var1->test1(10);?>

而将B中的public该为private就不会报错

你看看错误信息不就知道怎么回事了吗?

你看看错误信息不就知道怎么回事了吗?


我知道错误的原因是重写,但是有两个疑问:
1.父类的private方法不是不会被继承吗,为什么会导致重写?
2.为什么子类中public和protected会报错,而private不会报错?
class B extends A{        public function test($a){            echo "testB".$a;        }}

能麻烦解释一下吗?

不是重写,是覆盖
覆盖的条件是保护方式和参数一致
这种从 java 硬拽过来的玩意,违背了 php 的初衷,并最终导致 php 的死亡

连 C# 都在推出“动态语言”了,php 还逐步静态化,这不是倒退吗?

不是重写,是覆盖
覆盖的条件是保护方式和参数一致
这种从 java 硬拽过来的玩意,违背了 php 的初衷,并最终导致 php 的死亡

连 C# 都在推出“动态语言”了,php 还逐步静态化,这不是倒退吗?


重写和覆盖不是一个意思吗?
可能我没表达清楚,我的意思是父类中的private test()方法不是不可以继承吗,那么在子类中理论上我可以起一个名为test()的函数,并且参数列表也是任意的,可是这段代码会报错。 所以是不是不能继承的方法也存在重写?
test(10);?>

而下面这段代码在子类中,如果是重写,那么为什么参数列表不一致正确呢?
test($a);		}	}		$var1=new B;	$var1->test1(10);?>

B::test 是重新定义,或是说是重写(覆盖)
重载,在 php 中是不支持的

至于说那些所谓的语法检查,那都是胡扯的,硬拽进来拖慢 php 速度用的

B::test 是重新定义,或是说是重写(覆盖)
重载,在 php 中是不支持的

至于说那些所谓的语法检查,那都是胡扯的,硬拽进来拖慢 php 速度用的


就是说B::test()跟父类没有半毛钱关系对吧,谢谢了。

对的,对的,对的

B::test 是重新定义,或是说是重写(覆盖)
重载,在 php 中是不支持的

至于说那些所谓的语法检查,那都是胡扯的,硬拽进来拖慢 php 速度用的


或者说此处不存在重写,只是在B类中定义了一个新的函数test()而已。

但形式上是重写了