视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
php继承用引入父类吗
2020-11-27 15:20:13 责编:小采
文档


PHP中类与继承

在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() { 
 } 
}

属性重定义

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 
*/

重定义父类(同名)属性时,属性的可访问性可以变得更开放,但不能更严格,也就是说,父类中的public属性,不能在子类中修改为

private属性。

如果通过子类对象调用父类方法,那么该父类方法在访问属性时,对于重定义了的同名属性,public和protected的属性将访问到子类版

本,private属性将访问到父类版本。也可以理解为,public和protected属性可以被重定义(父类的版本被重定义,从而不存在了),而

private并未被重定义(父类中的属性仍然存在,通过父类方法进行访问,与子类中是否有同名属性毫不相干)。

final关键字

声明为final的方法不能被子类覆盖,如果类声明为final,则此类不能被继承。

// 声明为final的类不能被继承 
final class MyClass 
{ 
 private $dat; 
 public function __construct($dat) { 
 $this->dat = $dat; 
 } 
 // final方法不能被覆盖,不过此类已经是final类,方法无必要在声明为final了 
 final public function getDat() { 
 return $this->dat; 
 } 
}

推荐教程:PHP视频教程

下载本文
显示全文
专题