如何使用类中的常量作为 php 函数中的参数定义?

2024-05-08

我有一堂课:

class FetchMode 
{
 const FetchAll = 0;
 const FetchOne = 1;
 const FetchRow = 2;}

和一个函数:

function getRecordSet(FetchMode $FetchMode){ some switch cases }

我想使用 $FetchMode 作为 switch case 标准,但收到错误:可捕获的致命错误:传递给 getRecordSet() 的参数必须是 FetchMode 的实例,给定整数

这就是我调用函数的方式:

getRecordSet(FetchMode::FetchOne);

我想提供调用函数时可能选择的列表。 在php中可以吗?


You've hinted http://php.net/manual/en/language.oop5.typehinting.phpPHP 需要一个实例FetchMode(就像错误消息中所说的那样),但是FetchMode::FETCH*传递常数value。你必须使用某种 Enum 实例(我们在 PHP 中本身没有这种实例。(哦,好吧,有SplEnum但谁使用它?))或更改方法签名以排除类型提示。

但是,您可以代替开关/外壳通过多态性更容易解决这个问题 http://sourcemaking.com/refactoring/replace-conditional-with-polymorphism and a 策略模式 http://sourcemaking.com/design_patterns/strategy,例如而不是做类似的事情

public function getRecordSet($mode)
{
    switch ($mode) {
        case FetchMode::ALL:
            // code to do a fetchAll
            break;
        case FetchMode::ONE:
            // code to do a fetchOne
            break;
        default:
    }
}

这将增加圈复杂度 https://en.wikipedia.org/wiki/Cyclomatic_complexity您的班级并强制更改该班级以及FetchMode每当你需要添加额外的 FetchModes 时,你可以这样做:

public function getRecordSet(FetchMode $fetchModeStrategy)
{
    return $fetchModeStrategy->fetch();
}

然后有一个界面 http://php.net/manual/en/language.oop5.interfaces.php to 保护变异 http://martinfowler.com/ieeeSoftware/protectedVariation.pdf

interface FetchMode
{
    public function fetch();
}

并添加混凝土FetchMode每个受支持的 FetchMode 的类

class FetchOne implements FetchMode
{
    public function fetch()
    {
        // code to fetchOne
    }
}
class FetchAll …
class FetchRow …

这样,您就永远不必用它来接触班级getRecordSet再次方法,因为它适用于任何实现该方法的类FetchMode界面。因此,每当您有新的 FetchModes 时,您只需添加一个新类,从长远来看,它更易于维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用类中的常量作为 php 函数中的参数定义? 的相关文章

  • 无法访问 WordPress 中声明的全局变量

    我有以下代码 g value something print g value function get value global g value print g value print get value 当我在独立的 PHP 脚本中运行它
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中
  • Python函数重载

    我知道 Python 不支持方法重载 但我遇到了一个问题 我似乎无法以一种很好的 Pythonic 方式解决它 我正在制作一个游戏 其中一个角色需要射击各种子弹 但是如何编写不同的函数来创建这些子弹 例如 假设我有一个函数 可以创建一颗以给
  • 获取php中两个日期之间的天数[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我试图获取两个日期之间的天数 但返回的结果不正确 这是我的尝试 t time get the time Y m d g
  • 信息隐藏和封装有什么区别?

    两者有什么区别信息隐藏 and 封装 我读到封装意味着将数据和对它们进行操作的过程捆绑在一起 如果是这样 下面的类是否实现了封装 class IsThisEncapsulation public int age public int get
  • 如何在 Laravel 中正确返回 JSON 响应?

    return response gt json message gt No new orders 不幸的是 这个回应不起作用 理想情况下 我想返回一个 JSON 响应 其中包含 消息 gt 没有新订单 状态代码为 204 无内容 我在控制器
  • 如何在javascript中获取基本url

    我正在建立一个网站代码点火器 http ellislab com codeigniter 我有各种资源 我用base url http ellislab com codeigniter user guide helpers url help
  • 为什么需要将nginx中的$args重定向到index.php?

    许多 PHP 框架建议将其添加到 nginx location try files uri index php is args args 执行index php在所有 HTTP 请求上 为什么我需要 is args args 我觉得 arg
  • Laravel Blade 中的动态行数

    我想要像这样的表中有动态的行数 number name 1 Devy 这是我的 Blade 模板 thead th number th th name th thead tbody foreach aaa as value tr td td
  • 如何使用 PHP 从 MSSQL 读取图像字段

    我正在创建一个网站 需要同步从离线 MSSQL 服务器读取的在线 MySQL 数据库 除图像字段外 所有通信和从 MSSQL 读取所有字段均工作正常 我已经使用 PHP 和 Mysql 一段时间了 知道如何向 MySQL 数据库插入 检索图
  • 在 PHP 中比较字符串的方式与 MySQL 相同

    我将 varchar 存储在 utf8 MySQL 表中并使用 utf8 general ci 排序规则 我在 varchar 上有一个唯一索引 我想在 PHP 中进行字符串比较 这相当于 MySQL 对索引所做的操作 一个具体的例子是 我
  • 将 Google 转换代码添加到 WordPress 联系表单 7

    我找到了一个将 Google Conversion 代码添加到 WordPress Contact Form 7 插件的教程 可以找到here http contactform7 com tracking form submissions
  • 使用 PHP 和 MySQL 的服务器端事件

    我正在使用 PHP 和 MySQL 构建一个 非常基本的 应用程序 该应用程序的目的是在网页上显示 实时 数据交易 这些交易来自于transactionsMySQL 数据库中的表 到目前为止 我可以在网页上检索并显示数据 不过我期待看到数据
  • PHP:我是否将事件驱动编程与信号感知接口(信号和槽/观察者模式)混淆了?

    我看到很多人说 Symfony2 Zend Framework 2 等都是事件驱动的 在桌面世界中 通过事件驱动编程 我了解到应用程序每当其状态发生变化时都会通知其观察者 由于 PHP 应用程序是无状态的 因此无法执行此类操作 IE 让观察
  • 正确显示mySQL一对多查询结果

    我有两张桌子 TRIPS tripID clientID and LEGS legID depart arrive tripID TRIPS 与 LEGS 具有一对多关系 因为有多个legID s per tripID 我需要以以下格式显示
  • Mysqli get_result替代方案

    我刚刚将所有 sql 查询更改为使用 mysqli 准备好的语句 为了加快这个过程 我创建了一个函数 称为performQuery 取代mysql query 它需要传入查询 绑定 如 sdss 和变量 然后执行所有准备好的语句 这意味着更
  • PHP 中消息队列和工作系统的有效架构?

    我正在尝试了解我想要在 PHP 应用程序中实现的消息队列模型和作业 我的目标是卸载需要发送到多个第三方 API 的消息 数据 因此访问它们不会减慢客户端的速度 所以将数据发送到消息队列是理想的 我考虑过仅使用 Gearman 来保存 MQ
  • 我可以将特定警告视为错误吗?

    以下是我有时在学生代码中看到的模式的简化版本 bool foobar int a int b if a lt b return true 当然 真正的代码要复杂得多 Visual Studio 报告警告 C4715 并非所有控制路径都会返回
  • 如何在 PHP 中制作简短的随机唯一密钥,例如 YouTube 视频 ID? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有没有办法创建像 YouTube 视频网址中使用的唯一密钥 例如 https www youtube com watch v nWCh
  • 如何将 JSON 文本转换为 PHP 关联数组

    我将以下 JSON 对象存储在文本文件 data txt 中 player black time 0 from 2c to 3d 我使用 php 阅读 问题 有没有简单的方法可以转换 data到 PHP 关联数组 我尝试过使用json de

随机推荐