PHP继承带参构造父类后实例化子类调用方法报参数不足错误如何解决
错误触发原因
你的Child_Site子类没有定义自身的构造方法,因此会默认继承父类Site的构造方法,该构造方法要求传入2个必填参数。
你代码中共有两处Child_Site实例化操作:
- 第一处
$D = new Child_Site("ddd","gggg");传入了符合要求的2个参数,因此运行正常 - 第二处
$s = new Child_Site;没有传入任何参数,直接触发了父类构造方法的参数不足报错,该错误在实例化阶段就已经产生,和你后续调用子类还是父类方法无关。
解决方案
可根据业务需求选择任意一种方案:
方案1:实例化子类时传入父类要求的2个参数
直接修改实例化代码即可,适合需要用到父类url、title属性的场景:
// 传入2个参数符合父类构造规则 $s = new Child_Site("自定义url","自定义标题"); $s->setCate("xx"); $s->getCate();
方案2:在子类中重写构造方法,重载父类构造逻辑
适合子类不需要父类构造参数、或者需要自定义初始化逻辑的场景,PHP中子类重写构造方法后不会自动调用父类构造,如有需要可以手动触发:
class Child_Site extends Site{ var $category; // 重写构造方法,自定义参数规则 function __construct() { // 如果需要调用父类构造逻辑可以加下面这行,不需要可省略 // parent::__construct('默认url','默认标题'); } function setCate($par){ $this->category=$par; } function getCate(){ echo $this->category.PHP_EOL; } }
修改后你原来的$s = new Child_Site;代码即可正常运行。
方案3:给父类构造方法的参数添加默认值
适合允许父类属性为空的场景,只需修改父类构造方法定义即可:
class Site { var $url; var $title; // 给参数添加默认值,不传参数也不会触发参数不足错误 function __construct( $par1 = '', $par2 = '' ) { $this->url = $par1; $this->title = $par2; } // 剩余原有代码保持不变 }
内容的提问来源于stack exchange,提问作者zzzbei
相关产品推荐
相关产品推荐

