在 PHP 中扩展静态类 - 避免在扩展类中共享多个类的变量

2024-03-24

我似乎无法在 PHP 中扩展静态类。

PHP代码:

<?php
    class InstanceModule {
        public static $className = 'None';
        public static function PrintClassName() {
            echo self::$className . ' (' . __CLASS__ . ')<br />';
        }
    }

    class A extends InstanceModule {
        public static function Construct() {
            self::$className = "A";
        }
    }

    class B extends InstanceModule {
        public static function Construct() {
            self::$className = "B";
        }
    }
?>

我的调用代码以及我的期望:

<?php
    //PHP Version 5.3.14

    A::PrintClassName(); //Expected 'None' - actual result: 'None'
    B::PrintClassName(); //Expected 'None' - actual result: 'None'

    A::Construct();

    A::PrintClassName(); //Expected 'A' - actual result: 'A'
    B::PrintClassName(); //Expected 'None' - actual result: 'A'

    B::Construct();

    A::PrintClassName(); //Expected 'A' - actual result: 'B'
    B::PrintClassName(); //Expected 'B' - actual result: 'B'

    A::Construct();

    A::PrintClassName(); //Expected 'A' - actual result: 'A'
    B::PrintClassName(); //Expected 'B' - actual result: 'A'
?>

实际完整输出:

None (InstanceModule)
None (InstanceModule)
A (InstanceModule)
A (InstanceModule)
B (InstanceModule)
B (InstanceModule)
A (InstanceModule)
A (InstanceModule)

所以这里发生的事情(看起来)是,一旦我设置self::$className在任何一个扩展类上,它都会覆盖另一个类中的变量。我认为这是因为我使用静态类,并且只能有一个InstanceModule类而不是简单地将其复制到两个类A and B,正如我之前的理解extends。我尝试过使用关键字static::$className相反,但这似乎没有什么区别。

如果有人能指导我正确的方向,了解我在这里做错了什么,以及如何解决这个问题,那就太好了。

Edit


由于 $className 是静态的并且在父类中,因此当您在 A 或 B 中设置 className 时,它​​会更改父类中的变量,并且在读取变量时也会执行相同的操作。除非您在扩展类中重写 className,否则您将从最初在 InstanceModule 中定义的同一内存位置存储和检索信息。

如果在A/B中重新定义className,则可以分别从InstanceModule或A/B中使用parent::或self::访问className。根据您想要做什么,抽象类也可能发挥重要作用。

See 静态关键字 http://php.net/manual/en/language.oop5.static.php or 类抽象 http://php.net/manual/en/language.oop5.abstract.php在 PHP5 手册上。

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

在 PHP 中扩展静态类 - 避免在扩展类中共享多个类的变量 的相关文章

  • 使用操作系统用户名/密码在 PHP 中进行身份验证?

    我想知道是否有一种方法可以使用 PHP 或者可能是其他一些 CGI 但最好是 PHP 来使用其操作系统 在本例中为 Linux Debian 5 用户名和密码来验证用户 可能的 难的 谢谢 一般来说 这种东西是特定于操作系统的 并与现有的身
  • 递归BBCode解析

    我正在尝试解析脚本中的 BBCode 现在 它可以无缝工作 直到我尝试缩进不仅仅是粗体或下划线的 BBCode 例如剧透 网址 字体大小等 然后它就会搞砸 这是我的代码 function parse bbcode text global d
  • 如何在 PHP 中进行静态代码分析? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有PHP源文件的静态分析工具 二进制文件本身可以检查语法错误 但我正在寻找功能更多的东西 例如 未使用的变量赋值 未先初始化就分配到的
  • php 验证整数[重复]

    这个问题在这里已经有答案了 我想知道为什么这不起作用 echo gettype GET id returns string if is int GET id echo Integer 如何验证从 GET POST 传递的数据是否为整数 Ca
  • OOP 中的静态和动态变量/方法是什么?

    我试图更好地理解 OOP 中的基本概念 面向对象编程中的静态和动态变量和方法是什么 例如 使用 this 与使用双冒号 之间有什么区别 this this gt a method 优点 缺点 这个 不是自我记录的 如下所示 this gt
  • Zend 框架 PDF 问题

    又是我 伙计们 我有一个小问题 Create new PDF pdf new Zend Pdf Add new page to the document page pdf gt newPage Zend Pdf Page SIZE A4 p
  • laravel 5:找不到类“输入”

    In my routes php我有的文件 Route get function return view login Route get index function return view index Route get register
  • 通过另一个二维数组中的行过滤二维数组的行

    我有两个数组 我正在使用array diff assoc 以获得差异 但它总是返回common set结果中的行 它应该返回new q sets排 我的方法有什么问题吗 样本数据 array1 12 gt new q sets 11 gt
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • PHP 对象创建和内存使用

    一个基本的虚拟类 class foo var bar 0 function foo function boo echo memory get usage echo n foo new foo echo memory get usage ec
  • JQuery 验证不起作用

    我有一种表单 其中一个输入类型的值为 名字 但这可以在 onfocus 函数上更改我想验证此输入字段 如果它为空白或 名字 我有两个 jQuery 文件jquery 1 4 2 min js jquery validate pack js
  • 下载表格 - 选择文件合并到 Zip 中

    我希望创建一个表单 用户可以从手册列表中进行选择 总共10个 他们可能只想下载 3 份小册子 或 6 份 或 1 份 或 9 份小册子 但想法是他们选择所需的小册子 然后用脚本组合一个包含所需小册子的 zip 文件 任何人都可以提出任何建议
  • 为 foreach() 提供的参数无效..Wordpress

    突然开始出现以下代码的错误 img src title 有时分类 贷款俱乐部 是空的 这可能是问题所在吗 如果是这样 有人可以指出我正确的代码吗 Add if之前的情况foreach
  • PHP filesize() 适用于除一个文件之外的所有文件,给出 stat failed 错误

    我正在编写一个 PHP 页面 该页面通过抓取现有 HTML 页面来生成播客提要 一切正常 但我的 mp3 文件之一出现 filesize stat failed 错误 据我所知 该文件没有损坏 并且播放得很好 我还将文件重新上传到服务器 它
  • 在 PHP 中创建关联数组

    我有一个多维数组 shop array array appn1 pub1 pub2 pub3 array appn2 pub1 array appn3 pub1 pub2 每个数组中的第一项是申请编号每个数组中的其余部分是出版号 我得到每个
  • 创建具有动态更新变量的数组

    我有一些 PHP 变量 它们的名称直接链接到它们包含的函数 是否有办法自动创建这些变量 以便我可以使用所有变量 00 200 这就是我现在正在做的事情 regdays00 is user reg matured 00 regdays02 i
  • 在php中获取真实IP的问题

    我用它来获取真实IP 但我从 SERVER HTTP CLIENT IP 我仅从 SERVER REMOTE ADDR 但是我不需要代理的IP 我需要使用某些内网的计算机的真实IP 我能得到它吗 什么时候 SERVER HTTP CLIEN
  • PHP + FTP删除文件夹中的文件

    我刚刚编写了一个 PHP 脚本 它应该连接到 FTP 并删除特殊文件夹中的所有文件 它看起来像这样 但我不知道需要什么命令来删除文件夹日志中的所有文件 任何想法
  • PHP 启动:运行单元测试时无法加载动态库

    当我尝试运行单元测试时 出现此错误 PHP 警告 PHP 启动 无法加载动态库 bz2 尝试过 xampp php ext bz2 找不到指定的模块 xampp php ext php bz2 dll 找不到指定的模块 在未知的第 0 行
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们

随机推荐