简介
在php中,类型的继承使用extends关键字,而且最多只能继承一个父类,php不支持多继承。
class MyClass { public $dat = 0; public function __construct($dat) { $this->dat = $dat; } public function getDat() { return "$this->dat/n"; } } class MySubClass extends MyClass { public function getDat() { return "dat: $this->dat/n"; } } $a = new MyClass(3); $b = new MySubClass(4); echo $a->getDat(); // 3 echo $b->getDat(); // dat: 4
方法覆盖
包括构造函数在内,子类可以重新定义同名的类方法以覆盖父类方法。覆盖时遵循以下规则:
1.除构造函数之外,其他函数在覆盖时,函数的参数列表必须相同
2.包括构造函数在内,方法被覆盖后,调用子类方法时并不会自动调用父类方法
3.如果父类要禁止方法被子类覆盖,可以使用final来声明方法,这时如果子类仍要覆盖父类方法,将会出错
class MyClass { private $name = ""; public $num = 0; public $str = ""; public function __construct($name) { $this->name = $name; $this->num = 100; $this->str = "none"; } public function getName() { return $this->name; } } class MySubClass extends MyClass { public function __construct($name, $str) { parent::__construct($name); // 调用父类方法 $this->num = "0"; $this->str = $str; echo parent::getName()."/n"; // 调用父类方法 } public function getName() { return parent::getName()."$this->str/n"; // 调用父类方法 } } $b = new MySubClass("myName", true); // myName echo $b->getName(); // myName1 class MyClass { final public function getName() { } }
属性重定义
在子类中,可以访问父类中的public和protected属性成员,除非重定义了同名的自有属性,这时,父类中的属性将无法访问。
方法则不同,子类对方法进行覆盖后,仍然可以访问到父类方法。
class MyClass { public $a = 1; protected $b = 2; private $c = 3; public function f1() { echo "MyClass f1/n"; echo "/$a:$this->a; /$b:$this->b; /$c:$this->c;/n"; } protected function f2() { echo "MyClass f2/n"; echo "/$a:$this->a; /$b:$this->b; /$c:$this->c;/n"; } private function f3() { echo "MyClass f3/n"; } } class MySubClass extends MyClass { public $b = 22; public $c = 33; public function f1() { echo "MySubClass f1/n"; // 继承到父类中的$a属性,直接使用 echo "/$a:$this->a; /$b:$this->b; /$c:$this->c;/n"; // 调用父类中的同名方法 parent::f1(); // 继承到父类中的f2()方法,直接使用 $this->f2(); } // 父类的f3()是私有的,这里的定义与父类无关 public function f3() { echo "MySubClass f3/n"; } } $b = new MySubClass; $b->f1();echo "/n"; /* MySubClass f1 $a:1; $b:22; $c:33; MyClass f1 $a:1; $b:22; $c:3; MyClass f2 $a:1; $b:22; $c:3; */ $b->f3();echo "/n"; /* MySubClass f3 */
新闻热点
疑难解答