重写 PHP 中的静态方法

2024-04-25

我有一个抽象页面类,如下所示:

abstract class Page {
    public static function display() {
        self::displayHeader();
        self::displayContent();
        self::displayFooter();
    }

    public static function displayContent() {
        print "<p>some content</p>";
    }

    public static function displayHeader() {
        include_once(kContent . "HeaderContent.class.php");
        HeaderContent::display();
    }

    public static function displayFooter() {
        include_once(kContent . "FooterContent.class.php");
        FooterContent::display();
    }
};

我想从此继承,并且只重写 displayContent 方法,因此页眉和页脚会自动显示,但仍然可以选择重写显示方法,例如对于 .js 文件。

现在我有另一个课程,如下所示:

class FooPage extends Page {
    public static function displayContent() {
        print "<p>Foo page</p>";    
};

现在,不再调用 FooPage 的displayContent方法,它只是调用超类中的方法。

为什么?我能做些什么?

EDIT

我正在运行 PHP 5.2.17


Ilija,PHP 后期静态绑定“这就是为什么您可能会遇到FooPage::displayContent不被调用。如果您运行的是 PHP 5.2,那么没有什么可做的(除了使用 debug_backtrace() 的一些技巧 http://www.php.net/manual/en/language.oop5.late-static-bindings.php#101077,老实说我不会推荐这种情况)。

现在,真正引起我注意的是你的方法都是静态的;是否有一个原因?为什么它们不是实例方法?我期望类似的东西:

include_once(kContent . "HeaderContent.class.php");
include_once(kContent . "HeaderContent.class.php");

abstract class Page 
{
    protected $header;
    protected $footer;

    public function __construct()
    {
        $this->header = new HeaderContent();
        $this->footer = new FooterContent();
    }

    public function display() 
    {
        $this->displayHeader();
        $this->displayContent();
        $this->displayFooter();
    }

    public function displayContent() 
    {
        print "<p>some content</p>";
    }

    public function displayHeader() 
    {
        $this->header->display();
    }

    public function displayFooter() 
    {
        $this->footer->display();
    }
};

class FooPage extends Page 
{
    public function displayContent() 
    {
        print "<p>Foo page</p>";
    }
}

然后在你看来你会写这样的东西:

$page = new FooPage();
$page->display();

需要考虑的一些事项:

  • 生成视图内容时通常最好不要使用 print/echo。相反,尝试创建字符串并执行打印/回显作为最后一步。这使得以后编写测试变得更容易。

Example:

public function display() 
{
    return 
           $this->displayHeader() . 
           $this->displayContent() . 
           $this->displayFooter();
}

public function displayContent() 
{
    return "<p>some content</p>";
}

public function displayHeader() 
{
    return $this->header->display();
}
....
$page = new FooPage();
echo $page->display();
  • 如果您需要随着应用程序的增长而执行此操作,则可以将页眉和页脚作为 Page 构造函数参数传递。只要它们是理解 display() 消息的对象(即多态性 http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming)事情应该没问题。

HTH

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

重写 PHP 中的静态方法 的相关文章

  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 简单的 PHP 条件帮助: if($Var1 = in list($List) and $Cond2) - 这可能吗?

    这是一个可能的功能吗 我需要检查一个变量是否存在于我需要检查的变量列表中 并且 cond2 是否为 true 例如 if row name 1 2 3 Cond2 doThis 它对我不起作用 我在复制粘贴中更改的只是我的列表和变量名称 i
  • 通过 Ajax 加载内容时,WORDPRESS 音频播放器未加载,MediaElement.js 未应用

    我正在创建一个 WordPress 主题 当我使用 ajax 加载内容时 它不会将 MediaElements js 应用于我的音频播放器 因此不会显示音频 我认为这是因为 MediaElement js 加载了 wp footer 并且此
  • 当数据验证失败时保留表单字段中的值

    我在弄清楚验证失败时如何保留用户数据时遇到问题 我对 PHP 有点陌生 所以我的逻辑可能会犯一些巨大的错误 目前 如果验证失败 所有字段都会被清除 并且 Post 数据也会消失 这是一些代码 假设用户输入无效电子邮件 我希望保留 名称 字段
  • 重定向而不改变url

    我总是不喜欢 htaccess 我正在尝试建立一个所有请求都通过index php 的网站 但我希望URL 类似于www sample com home 该网址实际上会加载 www sample com index php page hom
  • 在 php 中为类自动生成 getter 和 setter 的最佳方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我经常创建一个包含一些私有变量的类 当设置此类的实例时 应该可以使用 getter 和 setter 填充该类的所有变量 有没有一种简单的方法可
  • 生成大随机数 php [重复]

    这个问题在这里已经有答案了 我想使用 PHP 生成一个包含 75 个字符的数字 我到处寻找 但一无所获 除了这个 http dailycoding com tools RandomNumber aspx http dailycoding c
  • 如何在响应ajax codeigniter后停止执行其他控制器

    我想知道如何在响应输出 json 数据后停止执行函数和涉及的其他控制器 就我这里的情况而言 我只是打电话test 函数于dashboard控制器 In dashboard构造函数将执行MY Login library In MY Login
  • 如何使用 php 下载/打印页面的特定部分

    我有一个 HTML 页面如下 Lorem Ipsum is simply dummy text of the printing and typesetting industry Lorem Ipsum has been the indust
  • 是否可以使用 PHP 重定向发送 POST 数据?

    更新 这不是重复的如何使用 PHP 发送 POST 请求 https stackoverflow com questions 5647461 how do i send a post request with php 那里的解决方案对我不起
  • 从 smarty 访问 PHP 文件的变量(本地或全局)

    我有一个 php 文件 其中包含一些本地和全局变量 例如 foo 从此文件中调用 smarty 对象 如何在不更改 PHP 文件的情况下从 smarty 脚本访问 foo Thanks 如果你有一个名为 BASE 的常量变量 并且定义如下
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • PHP 在输入流中使用 fwrite 和 fread

    我正在寻找将 PHP 输入流的内容写入磁盘的最有效方法 而不使用授予 PHP 脚本的大量内存 例如 如果可以上传的最大文件大小为 1 GB 但 PHP 只有 32 MB 内存 define MAX FILE LEN 1073741824 1
  • 在 PHP 中使用 phpseclib 时出现 RSA 问题

    我正在尝试在 phpseclib 中使用 RSA 实现 我认为在函数中执行一次代码并重新使用该函数会更容易 当我尝试向代码发送短信时 我收到一条错误消息 提示 解密错误 测试还让我意识到每次代码运行时密文都是不同的 所以我显然在那里做错了什
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • PHP preg_filter 返回意外的长值

    尝试在 Woocommerce 中删除标签并过滤值 但无法以正确的格式获取它 有东西有腥味 我正在使用WC gt cart gt get cart subtotal 来检索该值 在此示例中 我的值是 2 429kr 原始返回值是 span
  • 在 apache docker 容器中运行虚拟主机

    我在同一个 apache 容器中有两个 php 应用程序 我试图在端口上运行其中一个应用程序 因为它需要通过根域而不是子文件夹进行访问 我想在端口 8060 上运行应用程序 我尝试使用 apache 虚拟主机执行此操作 但它不会加载页面 h
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • 简单的 PHP 表单:电子邮件附件(代码 Golf)

    想象一下 一个用户想要在其网站上放置一个表单 该表单将允许网站访问者上传一个文件和一条简单的消息 该消息将立即通过电子邮件发送 即 该文件未存储在服务器上 或者如果该文件存储在服务器上 仅暂时 作为文件附件 并在邮件正文中添加注释 查看更多

随机推荐

  • 单个 CMakeLists.txt 足以满足我的项目需求吗?

    我正在尝试将旧的 CMake 移植到现代 CMake CMake 3 0 2 或更高版本 在旧的设计中 我有多个 CMakelists txt 每个目录都包含一个 CMakeLists txt 文件 我当前项目的目录结构如下所示 VizSi
  • 如何在describe()的before()块中动态生成Mocha测试?

    我正在创建一个 mocha 测试套件 该套件正在测试我们的 nwjs 应用程序正在调用的命令行实用程序 该实用程序获取文件并生成输出 json 文件 我有数千种输入文件组合和我想要生成的测试 it s 具体取决于 cmdline 实用程序的
  • 如何在 x 轴上显示每个元素的标签?

    我有包含文件名和编号的元组序列 我想绘制柱形图 其中 X 轴上有文件名 我的问题是现在 X 轴下仅显示 3 个标签 文件名 这可能是因为屏幕无法容纳更多内容 还是X轴间隔错误 如何让图表显示所有文件名 也许有办法将这些标签逆时针旋转 90
  • CSS 中具有透明背景的锯齿状边缘

    使 div 的顶部和底部边框具有锯齿状边缘 https stackoverflow com questions 18972888 make a divs top and bottom border have a jagged edge 根据
  • 如何将嵌套数据结构作为 LitElement 中的属性传递?

    在父组件中我有类似的内容 render gt const data a 1 b 1 2 3 of course this is a simplified version of the code return html
  • 为什么 Nginx 以相反的顺序提供客户端 SSL DN?

    我很好奇为什么某些 Web 服务器 例如 Nginx 以相反的顺序提供客户端 SSL DN Web 应用程序将 DN 发布到 Java Web 服务 该服务尝试创建 Javajavax naming ldap LdapName http d
  • 获取 UITableView 滚动到选定的 UITextField 并避免被键盘隐藏

    我有一个UITextField在表视图中UIViewController not a UITableViewController 如果表视图位于UITableViewController 表格会自动滚动到textField被编辑以防止它被键
  • 使用 Django 表单集保存具有唯一属性的多个对象

    TL DR 如何使用表单集保存 验证具有唯一属性的多个对象 假设我有一个Machine其中有多个Settings 参见下面的型号 这些设置在机器内应具有唯一的顺序 这可以通过定义一个来完成unique together属性中的Meta的类别
  • 创建通用 Json 序列化函数

    是否可以使用 Play Framework 2 2 在 Scala 中创建一个通用函数 将任意对象序列化为 JSON 而无需提供编写器或格式化程序 例如 此非通用代码将创建给定客户的 JSON 响应 import play api libs
  • this.props.history.push("/") 没有将我重定向到主页

    我正在尝试将此登录页面重定向到主页 但出于某种原因this props history push 没有重定向它 我有一个handleSubmit它应该在我按下登录按钮后运行 我不太确定发生了什么事 按登录按钮运行handleSubmit但是
  • 使用 casperjs 测试损坏的 html

    我试图在运行一些 CasperJs 浏览器测试之前运行一些设置例程 有一次我无法填写表单数据 因为有一些错误的 HTML 表单标签在表格中错误放置 table table
  • 内部接口?

    我对 Java 很陌生 我不明白这个结构是什么 我知道什么是接口以及如何定义 但在这种情况下 我真的不知道 你能说说是关于什么的吗 public interface WebConstants public interface Framewo
  • 在 Java 中实现常量的最佳方式是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动
  • 如何列出我在 Team Foundation Server 中签入的所有文件?

    我怎样才能列出最后一个x我签入到 TFS 的文件 Using the TFS PS Snapin included with the TFS PowerToys1 Get TfsItemHistory recurse stop 50 use
  • 在 mysql 中搜索带变音符号的阿拉伯语

    所以我有一个巨大的带有变音符号的阿拉伯语书面文本数据库 变音符号是阿拉伯语中附加到其他字符的小字符 例如 带变音符号 不带变音符号 我正在使用 mysql 和 laravel 在文本中搜索没有变音符号的特定单词 如何忽略搜索中的变音符号 看
  • Django:时区问题

    注意 我删除了之前存在的问题 并在此处仅提供相关信息 我们的数据库服务器 RH 指定了 TIME ZONE Europe London 并且 在 Django settings py 中 我们指定 TIME ZONE America New
  • MySQLi PHP:使用 MySQLi 检查 SQL INSERT 查询是否完全成功

    我有一个大函数 可以获取大量不同的数据并将其插入到多个表中 并非所有数据始终可用 因此并非所有 SQL INSERT 查询都会成功 我需要检查哪个 SQL INSERT 查询完全成功 哪个 SQL INSERT 查询没有对这些数据执行某些操
  • 从打字稿和 Angular 中的 Observable 获取字符串值

    我想从 Observable 获取字符串值并将该值从函数返回给调用者函数 例如 我有一组键 想一一获取所有键的值 字符串 并将其显示在具有菜单栏的 html 组件中 这是 ts 文件 key list component ts public
  • 优选的标签云可视化格式

    出于好奇 我很想知道什么标签云格式最适合发现越来越多 相关 内容的目的 我知道 3 种格式 但不知道哪一种最好 1 好吃的一个 http delicious com tag 颜色渐晕 2 The 标准一 http stephenslight
  • 重写 PHP 中的静态方法

    我有一个抽象页面类 如下所示 abstract class Page public static function display self displayHeader self displayContent self displayFoo