PHP桥接模式
2021/9/30 11:10:43
本文主要是介绍PHP桥接模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
阅读目录
- 项目目录结构
- 吃接口
- 用筷子吃实体
- 用叉子吃实体
- 人抽象类
- 男人实类
- 运行示例
- 知识点
- PHP interfase 对象接口
- 实现一个接口,使用 implements 操作符
- PHP接口和常量
- 演示
- PHP 5 支持抽象类和抽象方法
项目目录结构
目录: D:\bridge Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2021/9/16 10:19 276 EatByChopsticks.php -a---- 2021/9/16 10:19 270 EatByFork.php -a---- 2021/9/16 10:19 200 EatInterface.php -a---- 2021/9/16 10:19 654 PersonAbstract.php -a---- 2021/9/16 10:19 276 PersonMale.php -a---- 2021/9/16 10:19 962 test.php
吃接口
<?php namespace bridge; # 吃接口 interface EatInterface { # 吃 @param string $food 食物 public function eat($food=''); }
用筷子吃实体
<?php namespace bridge; # 用筷子吃实体 class EatByChopsticks implements EatInterface { # 吃 @param string $food 食物 public function eat($food='') { echo "用筷子吃{$food}~"; } }
用叉子吃实体
<?php namespace bridge; # 用叉子吃实体 class EatByFork implements EatInterface { # 吃 public function eat($food='') { echo "用叉子吃{$food}~"; } }
人抽象类
<?php namespace bridge; # 人抽象类 abstract class PersonAbstract { # 性别 protected $_gender = ''; # 使用的吃饭工具 protected $_tool = ''; # 构造函数 @param string $gender 性别 public function __construct($gender='',EatInterface $tool) { $this->_gender = $gender; $this->_tool = $tool; } # 吃的行为 @param string $food 实物 abstract public function eat($food=''); }
男人实类
<?php namespace bridge; # 男人实类 class PersonMale extends PersonAbstract { # 吃的具体方式 @param string $food 食物 public function eat($food='') { $this->_tool->eat($food); } }
运行示例
结构型模式
- php桥接模式
- 基础的结构型设计模式:将抽象和实现解耦,对抽象的实现是实体行为对接口的实现
- 例如:人 => 抽象为属性:性别 动作:吃 => 人吃的动作抽象为interface => 实现不同的吃法
运行 php test.php
// 注册自加载 spl_autoload_register('autoload'); function autoload($class) { require dirname($_SERVER['SCRIPT_FILENAME']).'//..//'.str_replace('\\','/',$class).'.php'; } /************************************* test *************************************/ use bridge\PersonMale; use bridge\EatByChopsticks; use bridge\EatByFork; try { // 初始化一个用筷子吃饭的男人的实例 $male = new PersonMale('male', new EatByChopsticks()); // 吃饭 $male->eat('大盘鸡'); } catch (\Exception $e) { echo $e->getMessage(); }
php test.php 用筷子吃大盘鸡~
try { // 初始化一个用筷子吃饭的男人的实例 $male = new PersonMale('male', new EatByFork()); // 吃饭 $male->eat('大盘鸡'); } catch (\Exception $e) { echo $e->getMessage(); }
用叉子吃大盘鸡~
知识点
PHP interfase 对象接口
1 、使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
2、接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
3、 接口中定义的所有方法都必须是公有,这是接口的特性。
需要注意的是:
在接口中定义一个构造方法是被允许的。在有些场景下这可能会很有用,例如用于工厂模式时。
实现一个接口,使用 implements 操作符
1、类中必须实现接口中定义的所有方法,否则会报一个致命错误。
2、类可以实现多个接口,用逗号来分隔多个接口的名称。
注意:
接口也可以继承,通过使用 extends
操作符。
类要实现接口,必须使用和接口中所有定义的方法完全一致的方式。否则会导致致命错误。
PHP接口和常量
接口中也可以定义常量。
接口中常量和类常量的使用完全相同,但是不能被子类或子接口所覆盖。
尽管不能再接口中包含变量,但是可以包含常量。要使用常量,需要用到 “作用域解析操作符” 即是双冒号::
。
示例:使用接口常量的一般格式
$someVariable = InterfaceName::SOME_CONSTANT;
演示
接口文件 IConnectInfo.php
<?php interface IConnectInfo { // 定义常量 const HOST = "localhost"; const UNAME = "root"; const DBNAME = "wqzbxh"; const PW = "root"; function testConnection(); }
使用接口文件 ConSQL.php
<?php //引入IConnectInfo接口 include_once('IConnectInfo.php'); Class ConSQL implements IConnectInfo { private $server = IConnectInfo::HOST; private $currenDB = IConnectInfo::DBNAME; private $user = IConnectInfo::UNAME; private $password = IConnectInfo::PW; public function testConnection() { // TODO: Implement testConnection() method. try{ $hookup = new mysqli($this->server,$this->user,$this->password,$this->currenDB); if(mysqli_connect_errno()){ die('connection fail!'); } echo "You are hooked Up Ace!<br/>".$hookup->host_info; $hookup->close(); }catch (Exception $e){ echo $e->getMessage(); } } } $useConstant = new ConSQL(); $useConstant->testConnection();
php .\ConSQL.php You are hooked Up Ace!<br/>localhost via TCP/IP
这里面接口文件只有一个testconnection
方法,但是如果愿意接口中也可以只包含变量不包含任何方法。
PHP 5 支持抽象类和抽象方法
定义为抽象的类不能被实例化。
任何一个类,如果里面有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;
另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。
例如某个抽象方法被声明为受保护的,
那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。
<?php abstract class AbstractClass { //强制要求子类定义这些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); //普通方法非抽象方法 public function printout(){ print $this->getValue()."\n"; } } class ChildAbstract extends AbstractClass{ protected function getValue(){ return "ChildAbstract"; } public function prefixValue($prefix){ return $prefix."ChildAbstract"; } } $class1 = new ChildAbstract; $class1->printout(); echo PHP_EOL.$class1->prefixValue('FOO_'); /*运行结果 ChildAbstract FOO_ChildAbstract */
这篇关于PHP桥接模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-28怎么把PHP程序打包?-icode9专业技术文章分享
- 2024-09-28怎么用Phar打包PHP程序?-icode9专业技术文章分享
- 2024-09-13手动在github上下载的mfpt包,怎么放到thinkphp5.0框架并正常使用-icode9专业技术文章分享
- 2024-09-05python的<class 'bytearray'>相当于php的哪个数据类型-icode9专业技术文章分享
- 2024-09-05php 导出银行卡号避免科学技术法的方法-icode9专业技术文章分享
- 2024-08-30什么样的php代码质量差被称为垃圾代码-icode9专业技术文章分享
- 2024-08-30用 PHP 调用拼多多的接口以获取订单状态消息的步骤方法和代码示例-icode9专业技术文章分享
- 2024-08-27phpunit单元测试框架的入门和使用方法介绍-icode9专业技术文章分享
- 2024-08-24PHP 中date("w") 周一是多少-icode9专业技术文章分享
- 2024-08-14thinkphp8.0获取域名或主机名方法-icode9专业技术文章分享