PHP:将类的所有函数包装在子类中

2024-03-09

使用 PHP 库类,我想将其所有公共函数包装在一个子类中......大致如下:

class BaseClass
{
   function do_something()
   {
        some;
        stuff;
   }

   function do_something_else()
   {
        other;
        stuff;
   }

   /*
    * 20-or-so other functions here!
    */
}

class SubClass extends BaseClass
{
   function magicalOverrideEveryone()
   {
        stuff-to-do-before;        // i.e. Display header
        call_original_function();  // i.e. Display otherwise-undecorated content
        stuff-to-do-after;         // i.e. Display footer
   }
}

归根结底,如果有一种[有点优雅/干净]的方法可以在一个地方完成这一切,我宁愿不必使用相同的包装器代码重写每个超类方法。

这可能吗?我怀疑我正处于元编程领域,甚至不知道 PHP 是否提供了这样的野兽,但我想我会问......


您可以使用以下命令轻松完成此操作__call http://www.php.net/manual/en/language.oop5.overloading.php#object.call 魔术方法 http://www.php.net/manual/en/language.oop5.magic.php以及一个不直接从基类继承的通用“代理”类。

这是代理类的(接近)完整实现,它包装了您传递给它的任何对象。它将在每个方法调用周围调用一些“之前”和“之后”代码。

class MyProxy {
  function __construct($object) {
    $this->object = $object;
  }

  function __call($method, $args) {
    // Run before code here

    // Invoke original method on our proxied object
    call_user_func_array(array($this->object, $method), $args);

    // Run after code here
  }
}


$base = new BaseClass();
$proxy = new MyProxy($base);

$proxy->doSomething(); // invoke $base->doSomething();

您当然想要添加一些错误处理,例如询问代理对象是否响应给定的方法__call如果没有,则引发错误。您甚至可以将 Proxy 类设计为其他代理的基类。子代理类可以实现before and after方法。

缺点是你的“子类”不再实现BaseClass,这意味着如果您正在使用类型提示 http://www.php.net/manual/en/language.oop5.typehinting.php并且想要要求只有类型的对象BaseClass被传递到一个函数中,这种方法将会失败。

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

PHP:将类的所有函数包装在子类中 的相关文章

  • 无法打开输入文件应用程序/控制台

    我安装了 wamp 服务器和 Symfony2 框架的副本 我正在尝试使用以下命令创建一个捆绑包 php app console generate bundle nampespace IDP IDP Bundle format yml 我的
  • 检测 JPEG 图像质量

    我允许用户上传图像 但是 我希望保持 JPEG 质量不超过 90 我打算做的是检测当前的质量 如果低于 90 什么都不做 如果超过90 则使用Image Magick将图像重新压缩到90 可以这样做吗 我更喜欢 PHP 但任何语言都会有帮助
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • 在 C# 中向下转换对象列表

    如何向下转换对象列表 以便列表中的每个对象都向下转换为派生类的对象 这就是场景 我有一个基类List基本项 以及从它继承的两个类 public class BaseClass public List
  • C# 中隐式/显式转换方法是否继承?

    我不确定我在这里做错了什么 我有一个通用类 它基本上是一个美化的整数 具有一些用于某些字符串格式设置的方法 以及字符串和 int 之间的转换 public class Base protected int m value From int
  • mongodb从不同数据库中选择

    我有大约 200 个 mongodb 数据库 每个数据库都有一个名为 Group 的集合 在该集合中有一个名为 meldingId 的字段 是否可以进行一个 mongodb 查询来查找不同数据库中的所有值 我设法通过 selectDB da
  • 在 Windows 中使用 PHP 创建受密码保护的 Zip 文件

    我正在 PHP 中创建给定文件的 zip 文件 下面是函数 function create zip file file name zip new ZipArchive zip name file name zip Zip name zip
  • 在 PHP 中重新定义常量

    是否可以在 php 中重新定义由define功能 我有一个包含多个常量的类 其中包含用户数据 我正在尝试为多个用户使用该类 define ALLEGRO ID id define ALLEGRO LOGIN login define ALL
  • 简单搜索:使用 CodeIgniter 将表单变量传递到 URI

    我的每个页面上都有一个搜索表单 如果我使用表单助手 它默认为 POST 我希望搜索词显示在 URI 中 http example com search KEYWORD 我已经在谷歌上搜索了大约一个小时 但没有结果 我只找到了有关如何进行的文
  • php - 未知:第 0 行需要打开失败。laravel 5.6

    我刚刚安装了 laracast flash 并通过 Composer 更新了 nesbot carbon 下载碳时命令发疯了 Cmd界面显示了一会界面上散落的文字和方框 下载完成 做过php artisan serve at localho
  • 使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃

    好吧 这可能不太可能 但还是这样吧 在Java JRE 1 6 0 26 b03 中我有两个类 SuperControl及其子类SubControl 它们都需要是持久对象 我正在使用 Hibernate Annotations 来实现这一点
  • 在我的 php 网络服务器内副本中启用 mysqli

    正如这里所讨论的 mysqli 直接运行时有效 但通过 js ajax 运行时无效 https stackoverflow com questions 31523601 mysqli works when run directly but
  • 支持通过 OAuth 进行 Facebook/Twitter 身份验证的 CAS 服务器

    我正在寻找一个支持 Facebook Twitter 通过 OAuth 进行单点登录身份验证的 CAS 服务器 我检查过 JASIG CAS 服务器 但它看起来不支持它们 我的 java web 应用程序基于 Spring Security
  • Laravel nova diffForHumans 日期时间

    我对用户有字段last active 我想用 diffForHumans 或显示时间time from now来自 Moment js 我怎样才能做到呢 现在我只使用 DateTime make Activiy last active gt
  • 获取特定月份/年份的第一天

    有没有比以下更好的方法返回特定月份 年份的第一天的日期 month date m year date Y from date Y m d mktime 0 0 0 month 1 year 这在计算上并不完全优雅 但我喜欢它 因为它非常可读
  • 如何使用 jQuery 通过 Ajax 发送复选框数组的值?

    我有一个包含很多表单字段的表单 12 x n 行 每行中的第一个字段 代表产品 是一个类似于以下内容的复选框
  • 自动生成PHP代码的策略?

    我正在开发一个框架 在后端创建 ER 图后 该框架可以动态地对自身的各个部分进行编程 作为一名 PHP 新手 我想知道是否还有比打开一个纯 xyz php 文本文件然后将动态生成的代码添加到该文件更奇特的事情 是的 尝试一下Zend Cod
  • 通过 jQuery 从输入类型=“文件”多个中删除文件

    我在使用 PHP 和 jQuery 上传文件时遇到问题 表单可以一次上传多个图像 这些图像可以在滑块中预览 表单还包含两个字段标题和描述 滑块通过 jQuery 工作 当用户通过单击选择文件来选择多个图像时
  • Paypal IPN 发送“待处理”并以“多币种”为理由?

    我正在使用 Paypal IPN 从我的网站收款 该网站目前仅处于开发阶段 因此我建立了一个沙盒网站进行测试 并且我已经通过在英国注册的测试帐户非常成功地以英镑货币 我的居住国货币 进行付款 但是 我希望该网站能够检测访问者的原籍国并允许他
  • PHP 如何判断用户是否按下了 Enter 键或 Submit 按钮?

    我遇到的问题是我在一个表单中有多个提交输入 每个提交输入都有不同的值 我更愿意将它们保留为提交 Whenever the user presses Enter it is as though the topmost submit input

随机推荐

  • Chrome -> 检查元素 -> 网络 (XHR) -> 预览选项卡 (HTML) 问题

    我在网络部分的预览选项卡上遇到问题 返回 HTML 时 我在预览和响应中看到原始 HTML 有时 但极少数情况下 HTML 会在 预览 选项卡中正确呈现 是我做错了什么还是只是 Chrome 的一些错误 Thanks 我也在测试这个 对我来
  • 如何找到AVPlayer当前比特率

    我正在尝试获取 AVPlayer 播放视频流的比特率 我尝试过observed bit rate的财产AVPlayerItemAccessLogEvent 但它具有非常高的价值 经过进一步探索Observed bit rate财产 我了解该
  • 如何将 OpenCV Mat 划分为矩形子区域?

    我想划分一个简单的Mat 200x200 位于不同区域 10x10 我做了两个循环 然后创建了一个Rect我在其中指出每次迭代中我想要的变量 x y width height 最后 我将图像的该区域保存在vector of Mats 但我的
  • 如何每天自动备份Firestore数据库

    我想每天备份 Firestore 数据库 我的数据结构是这样的 usersCollection uid defaultCurrency USD name something dreamsCollection name image 我看过fi
  • 压倒一切!重要的风格

    标题几乎概括了这一点 外部样式表有以下代码 td EvenRow a display none important 我尝试过使用 element style display inline and element style display
  • NetworkStream 正在读取不应该存在的数据

    我在 NetworkStream 从套接字缓冲区读取不应该存在的数据时遇到问题 顺便说一句 我正在发送非常大的缓冲区 现在我刚刚在本地主机上进行测试 这是我读取数据的方式 前 4 个字节包含消息的长度 然后我只读取 4096 个块 直到达到
  • 如何配置 husky pre-push hook 来运行测试

    我正在尝试配置 husky 预推送挂钩以在推送之前运行测试 一切看起来都很好 跑完后git push origin钩子被触发并且测试正在运行 问题是 当测试完成后 即使操作成功 推送也会被冻结 并且没有其他事情发生 包 json scrip
  • SQL Server - 列顺序重要吗?

    在性能和优化方面 在 SQL Server 中构建表时 列的排列顺序重要吗 我的主键是第一列有什么关系吗 构建多字段索引时 列是否相邻有关系吗 Using ALTER TABLE syntax is it possible to speci
  • 正则表达式匹配 img 标签中的任何 url

    我需要一个可以匹配 img src 标签中任何 url 的正则表达式 URL 可以是 images temp jpg 或 temp1 jpg 甚至 http www example com temp jpg i 123 或其他任何内容 我写
  • 使用带参数的资源文件

    我的问题是关于 c 中的资源文件 resx 字符串 部分 我用它来存储我的消息 我想知道如何使用带参数的资源条目的 值 例子 名称 显示单元格值 值 单元格上的值 和行 是 我想填写 具有不同值的参数 谢谢你 您可以对资源文件中存储的字符串
  • 确保 Spring Quartz 作业执行不重叠

    我有一个 Java 程序 每 20 秒从 Spring Qquartz 执行一次 有时只需要几秒钟即可执行 但随着数据变大 我确信它会运行 20 秒或更长时间 当一个实例仍在执行时 如何防止 Quartz 触发 触发作业 解雇两个在数据库上
  • 在两个视图控制器之间进行 Segue

    在我的故事板 如上所示 上 我有一个 ViewController 它包含一个带注释的 MKMapView 这些注释包含一个公开图标 点击该图标时 应该将用户导航到另一个 ViewController 为此 我在视图控制器之间创建了一个推送
  • 有没有办法评估带有液体标签的字符串

    我需要提供页面内容参考列表 它应该包含页面上各部分的参考 我能看到的唯一方法是使用page content并解析它 但我偶然发现了数据评估的问题 例如我可以从page content site data sdk language SDK但没
  • Java 中比较版本字符串的有效方法[重复]

    这个问题在这里已经有答案了 可能的重复 如何比较 Java 中的两个版本字符串 https stackoverflow com questions 198431 how do you compare two version strings
  • Delphi解析xml文件

    首先 我对编码和 Delphi 很陌生 已经断断续续使用了几个月了 下面是一个示例 xml 文件 我想要实现的是解析 xml 文件的每个 名称 部分中的所有数据 我以前从未这样做过 一些指导将不胜感激 我在这里看过与此类似的其他问题 但我无
  • 在 Google Apps 脚本中异步运行函数

    我正在制作一个调用 GAS 函数的 Slack 机器人 一切正常 只是 Slack 显示错误消息 因为它在调用 API 时只等待 3 秒响应 任何人都可以帮助我弄清楚如何异步运行 everyDay2 以便我可以在完成之前返回响应 我尝试过
  • Vue/nuxt - 如何从子组件访问父级引用

    我有一个全局确认模式组件 已在我的默认布局文件中注册 然后 我会尝试从 page index vue 访问它 但调用 this refs 只会返回一个空对象 将模式组件放在我的pages index vue 中会起作用 但它会破坏我的全局确
  • 如何通过全客户端实施来保护 Firebase?

    我有一个非常简单的 Firebase 应用程序 所有操作都在客户端通过 JavaScript 进行读取和写入 我这边没有用户帐户或服务器端应用程序 现在 任何查看我的 JavaScript 的人都可以复制我的 Firebase URL 并拥
  • 计算相对于某个根的路径 - Path.Combine 的逆

    有没有可靠的方法来计算 Path Combine 的逆 Path Combine c folder subdirectory something txt 可能会返回类似 c folder subdirectory something tex
  • PHP:将类的所有函数包装在子类中

    使用 PHP 库类 我想将其所有公共函数包装在一个子类中 大致如下 class BaseClass function do something some stuff function do something else other stuf