PHP面向对象程序设计之对象生成方法详解

2025-05-29 0 54

本文实例讲述了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
<?php

abstract class Employee { // 雇员

protected $name;

function __construct( $name ) {

$this->name = $name;

}

abstract function fire();

}

class Minion extends Employee { // 奴隶 继承 雇员

function fire() {

print "{$this->name}: I'll clear my desk\\n";

}

}

class NastyBoss { // 坏老板

private $employees = array();

function addEmployee( $employeeName ) { // 添加员工

$this->employees[] = new Minion( $employeeName ); // 代码灵活性受到限制

}

function projectFails() {

if ( count( $this->employees ) > 0 ) {

$emp = array_pop( $this->employees );

$emp->fire(); // 炒鱿鱼

}

}

}

$boss = new NastyBoss();

$boss->addEmployee( "harry" );

$boss->addEmployee( "bob" );

$boss->addEmployee( "mary" );

$boss->projectFails();

// output:

// mary: I'll clear my desk

?>

再看一个更具有灵活性的案例

?

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
<?php

abstract class Employee {

protected $name;

function __construct( $name ) {

$this->name = $name;

}

abstract function fire();

}

class Minion extends Employee {

function fire() {

print "{$this->name}: I'll clear my desk\\n";

}

}

class NastyBoss {

private $employees = array();

function addEmployee( Employee $employee ) { // 传入对象

$this->employees[] = $employee;

}

function projectFails() {

if ( count( $this->employees ) ) {

$emp = array_pop( $this->employees );

$emp->fire();

}

}

}

// new Employee class...

class CluedUp extends Employee {

function fire() {

print "{$this->name}: I'll call my lawyer\\n";

}

}

$boss = new NastyBoss();

$boss->addEmployee( new Minion( "harry" ) ); // 直接以对象作为参数,更具有灵活性

$boss->addEmployee( new CluedUp( "bob" ) );

$boss->addEmployee( new Minion( "mary" ) );

$boss->projectFails();

$boss->projectFails();

$boss->projectFails();

// output:

// mary: I'll clear my desk

// bob: I'll call my lawyer

// harry: I'll clear my desk

?>

单例

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24
<?php

class Preferences {

private $props = array();

private static $instance; // 私有的,静态属性

private function __construct() { } // 无法实例化,私有的构造函数

public static function getInstance() { // 返回对象 静态方法才可以被类访问,静态方法中要有静态属性

if ( empty( self::$instance ) ) {

self::$instance = new Preferences();

}

return self::$instance;

}

public function setProperty( $key, $val ) {

$this->props[$key] = $val;

}

public function getProperty( $key ) {

return $this->props[$key];

}

}

$pref = Preferences::getInstance();

$pref->setProperty( "name", "matt" );

unset( $pref ); // remove the reference

$pref2 = Preferences::getInstance();

print $pref2->getProperty( "name" ) ."\\n"; // demonstrate value is not lost

?>

点评:不能随意创建对象,只能通过Preferences::getInstance()来创建对象。

工厂模式

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23
<?php

abstract class ApptEncoder {

abstract function encode();

}

class BloggsApptEncoder extends ApptEncoder {

function encode() {

return "Appointment data encoded in BloggsCal format\\n";

}

}

class MegaApptEncoder extends ApptEncoder {

function encode() {

return "Appointment data encoded in MegaCal format\\n";

}

}

class CommsManager { // 负责生产Bloggs对象

function getApptEncoder() {

return new BloggsApptEncoder();

}

}

$obj = new CommsManager();

$bloggs = $obj->getApptEncoder(); // 获取对象

print $bloggs->encode();

?>

output:

Appointment data encoded in BloggsCal format

进一步增加灵活性设置

?

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
<?php

abstract class ApptEncoder {

abstract function encode();

}

class BloggsApptEncoder extends ApptEncoder {

function encode() {

return "Appointment data encoded in BloggsCal format\\n";

}

}

class MegaApptEncoder extends ApptEncoder {

function encode() {

return "Appointment data encoded in MegaCal format\\n";

}

}

class CommsManager {

const BLOGGS = 1;

const MEGA = 2;

private $mode ;

function __construct( $mode ) {

$this->mode = $mode;

}

function getHeaderText() {

switch ( $this->mode ) {

case ( self::MEGA ):

return "MegaCal header\\n";

default:

return "BloggsCal header\\n";

}

}

function getApptEncoder() {

switch ( $this->mode ) {

case ( self::MEGA ):

return new MegaApptEncoder();

default:

return new BloggsApptEncoder();

}

}

}

$man = new CommsManager( CommsManager::MEGA );

print ( get_class( $man->getApptEncoder() ) )."\\n";

$man = new CommsManager( CommsManager::BLOGGS );

print ( get_class( $man->getApptEncoder() ) )."\\n";

?>

output:

MegaApptEncoder
BloggsApptEncoder

工厂方法模式要把创建者类与要生产的产品类分离开来。

抽象工厂

通过抽象来来约束,成为一定的规矩。

?

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
<?php

abstract class ApptEncoder {

abstract function encode();

}

class BloggsApptEncoder extends ApptEncoder {

function encode() {

return "Appointment data encoded in BloggsCal format\\n";

}

}

class MegaApptEncoder extends ApptEncoder {

function encode() {

return "Appointment data encoded in MegaCal format\\n";

}

}

abstract class CommsManager { // 预约

abstract function getHeaderText();

abstract function getApptEncoder();

abstract function getTtdEncoder();

abstract function getContactEncoder();

abstract function getFooterText();

}

class BloggsCommsManager extends CommsManager {

function getHeaderText() {

return "BloggsCal header\\n";

}

function getApptEncoder() {

return new BloggsApptEncoder();

}

function getTtdEncoder() {

return new BloggsTtdEncoder();

}

function getContactEncoder() {

return new BloggsContactEncoder();

}

function getFooterText() {

return "BloggsCal footer\\n";

}

}

class MegaCommsManager extends CommsManager {

function getHeaderText() {

return "MegaCal header\\n";

}

function getApptEncoder() {

return new MegaApptEncoder();

}

function getTtdEncoder() {

return new MegaTtdEncoder();

}

function getContactEncoder() {

return new MegaContactEncoder();

}

function getFooterText() {

return "MegaCal footer\\n";

}

}

$mgr = new MegaCommsManager();

print $mgr->getHeaderText();

print $mgr->getApptEncoder()->encode(); // 对象调用方法,返回对象,继续调用方法。

print $mgr->getFooterText();

?>

output:

MegaCal header
Appointment data encoded in MegaCal format
MegaCal footer

更加牛逼的实现

?

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
<?php

// 根据类图,规划类的代码。从大局入手。

abstract class ApptEncoder {

abstract function encode();

}

class BloggsApptEncoder extends ApptEncoder {

function encode() {

return "Appointment data encoded in BloggsCal format\\n";

}

}

class MegaApptEncoder extends ApptEncoder {

function encode() {

return "Appointment data encoded in MegaCal format\\n";

}

}

abstract class CommsManager {

const APPT = 1;

const TTD = 2;

const CONTACT = 3;

abstract function getHeaderText();

abstract function make( $flag_int ); // int标记

abstract function getFooterText();

}

class BloggsCommsManager extends CommsManager {

function getHeaderText() {

return "BloggsCal header\\n";

}

function make( $flag_int ) {

switch ( $flag_int ) {

case self::APPT: // self直接控制常量

return new BloggsApptEncoder();

case self::CONTACT:

return new BloggsContactEncoder();

case self::TTD:

return new BloggsTtdEncoder();

}

}

function getFooterText() {

return "BloggsCal footer\\n";

}

}

$mgr = new BloggsCommsManager();

print $mgr->getHeaderText();

print $mgr->make( CommsManager::APPT )->encode();

print $mgr->getFooterText();

?>

output:

BloggsCal header
Appointment data encoded in BloggsCal format
BloggsCal footer

原型模式

改造成一个保存具体产品的工厂类。

?

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
<?php

class Sea {} // 大海

class EarthSea extends Sea {}

class MarsSea extends Sea {}

class Plains {} // 平原

class EarthPlains extends Plains {}

class MarsPlains extends Plains {}

class Forest {} // 森林

class EarthForest extends Forest {}

class MarsForest extends Forest {}

class TerrainFactory { // 地域工厂

private $sea;

private $forest;

private $plains;

function __construct( Sea $sea, Plains $plains, Forest $forest ) { // 定义变量为类对象

$this->sea = $sea;

$this->plains = $plains;

$this->forest = $forest;

}

function getSea( ) {

return clone $this->sea; // 克隆

}

function getPlains( ) {

return clone $this->plains;

}

function getForest( ) {

return clone $this->forest;

}

}

$factory = new TerrainFactory( new EarthSea(),

new EarthPlains(),

new EarthForest() );

print_r( $factory->getSea() );

print_r( $factory->getPlains() );

print_r( $factory->getForest() );

?>

output:

?

1

2

3

4

5

6

7

8

9
EarthSea Object

(

)

EarthPlains Object

(

)

EarthForest Object

(

)

希望本文所述对大家PHP程序设计有所帮助。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP面向对象程序设计之对象生成方法详解 https://www.kuaiidc.com/95869.html

相关文章

发表评论
暂无评论