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


Posted in PHP onDecember 02, 2016

本文实例讲述了PHP面向对象程序设计之对象生成方法。分享给大家供大家参考,具体如下:

对象

看个例子

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

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

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

单例

<?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()来创建对象。

工厂模式

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

进一步增加灵活性设置

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

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

抽象工厂

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

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

更加牛逼的实现

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

原型模式

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

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

EarthSea Object
(
)
EarthPlains Object
(
)
EarthForest Object
(
)

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

PHP 相关文章推荐
关于shopex同步ucenter的redirect问题,导致script不运行
Apr 10 PHP
php 根据url自动生成缩略图并处理高并发问题
Jan 23 PHP
destoon实现底部添加你是第几位访问者的方法
Jul 15 PHP
php+MySQL判断update语句是否执行成功的方法
Aug 28 PHP
两千行代码的PHP学习笔记汇总
Oct 05 PHP
php日期操作技巧小结
Jun 25 PHP
laravel自定义分页效果
Jul 23 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
PHP获取当前系统时间的方法小结
Oct 03 PHP
Yii2框架中一些折磨人的坑
Dec 15 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 PHP
PHP const定义常量及global定义全局常量实例解析
May 28 PHP
PHP面向对象程序设计组合模式与装饰模式详解
Dec 02 #PHP
PHP与jquery实时显示网站在线人数实例详解
Dec 02 #PHP
谈谈php对接芝麻信用踩的坑
Dec 01 #PHP
PHP自定义函数获取汉字首字母的方法
Dec 01 #PHP
phpmailer绑定邮箱的实现方法
Dec 01 #PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 #PHP
thinkPHP商城公告功能开发问题分析
Dec 01 #PHP
You might like
十天学会php之第三天
2006/10/09 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
IE和Firefox在JavaScript应用中的兼容性探讨
2008/04/01 Javascript
document.compatMode介绍
2009/05/21 Javascript
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
windows下python连接oracle数据库
2017/06/07 Python
你真的了解Python的random模块吗?
2017/12/12 Python
Python之web模板应用
2017/12/26 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
python中关于数据类型的学习笔记
2020/07/19 Python
学生如何注册Pycharm专业版以及pycharm的安装
2020/09/24 Python
小学生秋游活动方案
2014/02/23 职场文书
二年级学生评语大全
2014/04/23 职场文书
节约用水标语
2014/06/11 职场文书
品质标语大全
2014/06/21 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang
Python Pygame实战之塔防游戏的实现
2022/03/17 Python