本文实例讲述了PHP面向对象继承用法。分享给大家供大家参考,具体如下:
继承
先看两个类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
<?php
class CdProduct {
public $playLength ; // 播放时间
public $title ;
public $producerMainName ;
public $producerFirstName ;
public $price ;
function __construct( $title , $firstName ,
$mainName , $price ,
$playLength ) {
$this ->title = $title ;
$this ->producerFirstName = $firstName ;
$this ->producerMainName = $mainName ;
$this ->price = $price ;
$this ->playLength = $playLength ;
}
function getPlayLength() {
return $this ->playLength;
}
function getSummaryLine() {
$base = "{$this->title} ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
$base .= ": playing time - {$this->playLength}" ;
return $base ;
}
function getProducer() {
return "{$this->producerFirstName}" .
" {$this->producerMainName}" ;
}
}
class BookProduct {
public $numPages ; // 看的页数
public $title ;
public $producerMainName ;
public $producerFirstName ;
public $price ;
function __construct( $title , $firstName ,
$mainName , $price ,
$numPages ) {
$this ->title = $title ;
$this ->producerFirstName = $firstName ;
$this ->producerMainName = $mainName ;
$this ->price = $price ;
$this ->numPages = $numPages ;
}
function getNumberOfPages() {
return $this ->numPages;
}
function getSummaryLine() {
$base = "{$this->title} ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
$base .= ": page count - {$this->numPages}" ;
return $base ;
}
function getProducer() {
return "{$this->producerFirstName}" .
" {$this->producerMainName}" ;
}
}
$product1 = new CdProduct( "cd1" , "bob" , "bobbleson" , 4, 50 );
print $product1 ->getSummaryLine();
print "\n" ;
$product2 = new BookProduct( "book1" , "harry" , "harrelson" , 4, 30 );
print $product2 ->getSummaryLine();
print "\n" ;
?>
|
输出:
cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30
点评:这两个类,代码重复性太高,有相同性,也有差异性。不如用继承来简化处理。
采用继承来处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
<?php
class ShopProduct {
public $numPages ;
public $playLength ;
public $title ;
public $producerMainName ;
public $producerFirstName ;
public $price ;
function __construct( $title , $firstName ,
$mainName , $price ,
$numPages =0, $playLength =0 ) {
$this ->title = $title ;
$this ->producerFirstName = $firstName ;
$this ->producerMainName = $mainName ;
$this ->price = $price ;
$this ->numPages = $numPages ;
$this ->playLength = $playLength ;
}
function getProducer() {
return "{$this->producerFirstName}" .
" {$this->producerMainName}" ;
}
function getSummaryLine() {
$base = "$this->title ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
return $base ;
}
}
class CdProduct extends ShopProduct {
function getPlayLength() { // 增加属于自己的方法
return $this ->playLength;
}
function getSummaryLine() { // 改造了父类的方法
$base = "{$this->title} ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
$base .= ": playing time - {$this->playLength}" ;
return $base ;
}
}
class BookProduct extends ShopProduct {
function getNumberOfPages() {
return $this ->numPages;
}
function getSummaryLine() {
$base = "{$this->title} ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
$base .= ": page count - {$this->numPages}" ;
return $base ;
}
}
$product1 = new CdProduct( "cd1" , "bob" , "bobbleson" , 4, null, 50 );
print $product1 ->getSummaryLine();
print "\n" ;
$product2 = new BookProduct( "book1" , "harry" , "harrelson" , 4, 30 );
print $product2 ->getSummaryLine();
print "\n" ;
?>
|
输出:
cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30
点评:继承处理很好的解决了差异性,相通性问题。
进一步优化处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
<?php
class ShopProduct {
// 抽离出共有属性
public $title ;
public $producerMainName ;
public $producerFirstName ;
public $price ;
function __construct( $title , $firstName ,
$mainName , $price ) {
$this ->title = $title ;
$this ->producerFirstName = $firstName ;
$this ->producerMainName = $mainName ;
$this ->price = $price ;
}
function getProducer() {
return "{$this->producerFirstName}" .
" {$this->producerMainName}" ;
}
function getSummaryLine() {
$base = "{$this->title} ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
return $base ;
}
}
class CdProduct extends ShopProduct {
// 抽离出属于自己特有的属性
public $playLength ;
function __construct( $title , $firstName ,
$mainName , $price , $playLength ) {
parent::__construct( $title , $firstName ,
$mainName , $price ); // 继承父类的构造函数
$this ->playLength = $playLength ; // 处理自己专有的属性
}
function getPlayLength() {
return $this ->playLength;
}
function getSummaryLine() {
$base = "{$this->title} ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
$base .= ": playing time - {$this->playLength}" ;
return $base ;
}
}
class BookProduct extends ShopProduct {
public $numPages ;
function __construct( $title , $firstName ,
$mainName , $price , $numPages ) {
parent::__construct( $title , $firstName ,
$mainName , $price );
$this ->numPages = $numPages ;
}
function getNumberOfPages() {
return $this ->numPages;
}
function getSummaryLine() {
$base = "$this->title ( $this->producerMainName, " ;
$base .= "$this->producerFirstName )" ;
$base .= ": page count - $this->numPages" ;
return $base ;
}
}
$product1 = new CdProduct( "cd1" , "bob" , "bobbleson" , 4, 50 );
print $product1 ->getSummaryLine();
print "\n" ;
$product2 = new BookProduct( "book1" , "harry" , "harrelson" , 4, 30 );
print $product2 ->getSummaryLine();
print "\n" ;
?>
|
输出:
cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30
点评:这里把共有属性在父类中,其他个性属性放在自己的类中处理。并设置自己的构造方法,继承父类的构造方法。
进一步继承父类的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
<?php
class ShopProduct {
public $title ;
public $producerMainName ;
public $producerFirstName ;
public $price ;
function __construct( $title , $firstName ,
$mainName , $price ) {
$this ->title = $title ;
$this ->producerFirstName = $firstName ;
$this ->producerMainName = $mainName ;
$this ->price = $price ;
}
function getProducer() {
return "{$this->producerFirstName}" .
" {$this->producerMainName}" ;
}
function getSummaryLine() {
$base = "{$this->title} ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
return $base ;
}
}
class CdProduct extends ShopProduct {
public $playLength ;
function __construct( $title , $firstName ,
$mainName , $price , $playLength ) {
parent::__construct( $title , $firstName ,
$mainName , $price );
$this ->playLength = $playLength ;
}
function getPlayLength() {
return $this ->playLength;
}
function getSummaryLine() {
$base = parent::getSummaryLine();
$base .= ": playing time - {$this->playLength}" ;
return $base ;
}
}
class BookProduct extends ShopProduct {
public $numPages ;
function __construct( $title , $firstName ,
$mainName , $price , $numPages ) {
parent::__construct( $title , $firstName ,
$mainName , $price );
$this ->numPages = $numPages ;
}
function getNumberOfPages() {
return $this ->numPages;
}
function getSummaryLine() {
$base = parent::getSummaryLine();
$base .= ": page count - {$this->numPages}" ;
return $base ;
}
}
$product1 = new CdProduct( "cd1" , "bob" , "bobbleson" , 4, 50 );
print $product1 ->getSummaryLine();
print "\n" ;
$product2 = new BookProduct( "book1" , "harry" , "harrelson" , 4, 30 );
print $product2 ->getSummaryLine();
print "\n" ;
?>
|
输出:
cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30
点评:同样的结果,可以优化优化再优化。这里继承父类的方法。parent::getSummaryLine()。不过这个用的比较少。
继续添加一些有意思的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
<?php
class ShopProduct {
private $title ;
private $discount = 0;
private $producerMainName ;
private $producerFirstName ;
protected $price ;
function __construct( $title , $firstName ,
$mainName , $price ) {
$this ->title = $title ;
$this ->producerFirstName = $firstName ;
$this ->producerMainName = $mainName ;
$this ->price = $price ;
}
function setDiscount( $num ) {
$this ->discount= $num ;
}
function getPrice() {
return ( $this ->price - $this ->discount);
}
function getProducer() {
return "{$this->producerFirstName}" .
" {$this->producerMainName}" ;
}
function getSummaryLine() {
$base = "{$this->title} ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
return $base ;
}
}
class CdProduct extends ShopProduct {
public $playLength ;
function __construct( $title , $firstName ,
$mainName , $price , $playLength ) {
parent::__construct( $title , $firstName ,
$mainName , $price );
$this ->playLength = $playLength ;
}
function getPlayLength() {
return $this ->playLength;
}
function getSummaryLine() {
$base = parent::getSummaryLine();
$base .= ": playing time - {$this->playLength}" ;
return $base ;
}
}
class BookProduct extends ShopProduct {
public $numPages ;
function __construct( $title , $firstName ,
$mainName , $price , $numPages ) {
parent::__construct( $title , $firstName ,
$mainName , $price );
$this ->numPages = $numPages ;
}
function getPrice() {
return $this ->price;
}
function getNumberOfPages() {
return $this ->numPages;
}
function getSummaryLine() {
$base = parent::getSummaryLine();
$base .= ": page count - {$this->numPages}" ;
return $base ;
}
}
$product1 = new CdProduct( "cd1" , "bob" , "bobbleson" , 4, 50 );
$product1 ->setDiscount( 3 );
print $product1 ->getSummaryLine();
print "\n" ;
print "price: {$product1->getPrice()}\n" ;
$product2 = new BookProduct( "book1" , "harry" , "harrelson" , 4, 30 );
$product2 ->setDiscount( 3 ); // 折扣对book无效
print $product2 ->getSummaryLine();
print "\n" ;
print "price: {$product2->getPrice()}\n" ;
?>
|
输出:
cd1 ( bobbleson, bob ): playing time - 50
price: 1
book1 ( harrelson, harry ): page count - 30
price: 4
点评:父类添加了折扣,book继承之后,修改了getPrice方法,所以折扣对book无效。
私有化属性,通过方法来设置与获取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
<?php
class ShopProduct {
// 私有化属性,通过方法来设置与获取
private $title ;
private $producerMainName ;
private $producerFirstName ;
protected $price ;
private $discount = 0;
public function __construct( $title , $firstName ,
$mainName , $price ) {
$this ->title = $title ;
$this ->producerFirstName = $firstName ;
$this ->producerMainName = $mainName ;
$this ->price = $price ;
}
public function getProducerFirstName() {
return $this ->producerFirstName;
}
public function getProducerMainName() {
return $this ->producerMainName;
}
public function setDiscount( $num ) {
$this ->discount= $num ;
}
public function getDiscount() {
return $this ->discount;
}
public function getTitle() {
return $this ->title;
}
public function getPrice() {
return ( $this ->price - $this ->discount);
}
public function getProducer() {
return "{$this->producerFirstName}" .
" {$this->producerMainName}" ;
}
public function getSummaryLine() {
$base = "{$this->title} ( {$this->producerMainName}, " ;
$base .= "{$this->producerFirstName} )" ;
return $base ;
}
}
class CdProduct extends ShopProduct {
private $playLength = 0;
public function __construct( $title , $firstName ,
$mainName , $price , $playLength ) {
parent::__construct( $title , $firstName ,
$mainName , $price );
$this ->playLength = $playLength ;
}
public function getPlayLength() {
return $this ->playLength;
}
public function getSummaryLine() {
$base = parent::getSummaryLine();
$base .= ": playing time - {$this->playLength}" ;
return $base ;
}
}
class BookProduct extends ShopProduct {
private $numPages = 0;
public function __construct( $title , $firstName ,
$mainName , $price , $numPages ) {
parent::__construct( $title , $firstName ,
$mainName , $price );
$this ->numPages = $numPages ;
}
public function getNumberOfPages() {
return $this ->numPages;
}
public function getSummaryLine() {
$base = parent::getSummaryLine();
$base .= ": page count - {$this->numPages}" ;
return $base ;
}
public function getPrice() {
return $this ->price;
}
}
$product1 = new CdProduct( "cd1" , "bob" , "bobbleson" , 4, 50 );
print $product1 ->getSummaryLine(). "\n" ;
$product2 = new BookProduct( "book1" , "harry" , "harrelson" , 4, 30 );
print $product2 ->getSummaryLine(). "\n" ;
?>
|
输出:
cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30
点评:这里进一步私有化了属性,要想获取只能通过方法。这样就确保了安全性。
希望本文所述对大家PHP程序设计有所帮助。