这里有新鲜出炉的 PHP 教程,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 Web 开发领域。PHP 的文件后缀名为 php。
这篇文章主要介绍了 PHP 面向对象程序设计之对象生成方法, 简单介绍了 php 常见对象生成模式并结合实例形式分析了 php 对象生成的单例模式、工厂模式、原形模式等概念与实现技巧, 需要的朋友可以参考下
本文实例讲述了 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 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0815/340960.html