PHP中为何用作用域解析符调用父类方法?父类实例疑问
关于PHP中
parent::与继承实例的疑问解答 咱们一步一步拆解你的问题,先从你最困惑的点说起:
为什么用::访问父类方法?
你说得没错,平时咱们确实常看到::用来调用静态成员,但它的本质是访问某个类作用域内的成员,不管这个成员是静态的还是非静态的——只要上下文允许。
当子类OtherClass重写了父类MyClass的myFunc()方法后,如果你在子类方法里直接写myFunc(),PHP会优先调用子类自己的版本,这就会陷入递归调用(自己调用自己)。而parent::myFunc()的作用就是明确告诉PHP:“我要调用的是父类里定义的那个myFunc(),不是我自己重写的这个”。这是子类中调用父类被重写方法的标准写法,和方法是不是静态没有直接关系。
创建子类实例时,父类会生成单独的实例吗?
答案是不会。当你执行$class = new OtherClass();时,只会生成一个OtherClass的实例,但这个实例包含了父类MyClass的所有非私有成员(属性和方法)——这些成员是子类实例的一部分,并不是一个独立的父类对象。
你可以把它理解成:子类就像父类的“升级版”,创建子类实例时,这个对象天生就带着父类的所有可继承“基因”,不需要额外再生成一个父类对象来依附。
该把父类理解成静态类还是对象副本?
都不是,更准确的理解应该是这样:
- 父类是一个模板,子类基于这个模板扩展出自己的新模板;
- 当你创建子类实例时,这个实例是一个单一的对象,它同时拥有子类和父类的所有可访问成员;
parent::并没有把父类当作静态类来调用——你可以做个小测试:在父类的myFunc()里加入echo get_class($this);,运行后会输出OtherClass,这说明parent::myFunc()是在当前OtherClass实例的上下文中执行的,$this指向的就是子类实例本身,完全不是静态调用的逻辑。
举个修改后的代码例子更直观:
class MyClass { protected function myFunc() { echo "MyClass::myFunc(),当前实例类:" . get_class($this) . "\n"; } } class OtherClass extends MyClass { public function myFunc() { parent::myFunc(); echo "OtherClass::myFunc()\n"; } } $class = new OtherClass(); $class->myFunc();
运行结果会是:
MyClass::myFunc(),当前实例类:OtherClass OtherClass::myFunc()
这个结果能直接证明,parent::调用的父类方法是在子类实例的上下文中运行的,没有独立的父类实例存在。
总结一下
::不是静态成员的专属操作符,它的核心作用是访问指定类作用域内的成员;parent::是子类中调用父类被重写成员的唯一正确方式;- 子类实例包含父类的可继承成员,但不会生成独立的父类实例;
- 父类是子类继承的模板,子类实例是一个单一的、整合了父类和子类所有可访问成员的对象。
内容的提问来源于stack exchange,提问作者john81
相关产品推荐
相关产品推荐

