Php 我可以更改子类中任何父函数的访问修饰符吗?

Php 我可以更改子类中任何父函数的访问修饰符吗?,php,c++,Php,C++,我可以更改子类中任何父函数的访问修饰符吗 不,这是不可能的。而且不仅在PHP中。子类可能只会“放松”可见性,例如 class ParentClass { protected function foo() {} } 可能是 class ChildClass extends ParentClass { public function foo() {} } 但不是 class ChildClass extends ParentClass { private

我可以更改子类中任何父函数的访问修饰符吗

不,这是不可能的。而且不仅在PHP中。

子类可能只会“放松”可见性,例如

class ParentClass
{
    protected function foo() {} 
}
可能是

class ChildClass extends ParentClass 
{  
    public function foo() {} 
}
但不是

class ChildClass extends ParentClass 
{  
    private function foo() {} 
}

除此之外,您还可以使用反射API在运行时更改可见性:


尽管你应该问问自己为什么要这么做。通常,对其子类隐藏方法或属性的父类这样做是有原因的。

我自己的测试表明,子类可以增加可见性,但不会降低可见性

例如,假设父类的成员变量声明为
private
。然后子类可以将相同的成员变量定义为
private
protected或
public`

类似地,如果父成员声明为
受保护
,则子成员可以将该成员声明为
受保护
公共


最后,如果父级声明成员为
public
,那么所有子级中的成员都必须是
public

您能给我一些原因吗,为什么是这样吗?在PHP中,接受的答案是正确的。如果将访问修饰符更改为更宽松的:protected=>public,则可以更改访问修饰符?出于好奇,我想知道答案。@Gaurav我不确定我是否得到了你想要的。你能澄清一下吗?子类继承了父类的类型。这意味着,子类必须提供与父类相同的接口,并可能向其添加新方法,但不能使用减法。这就是为什么你可以“放松”修饰语,但不能“收紧”修饰语的原因。@Gordon比我强。对不起,我的回答是错误的。;-)