PHP isset($this) 并在静态和对象上下文中使用相同的对象方法

2024-03-08

我正在开发一个需要通过静态函数调用和对象方法访问的类。我发现的一件事是我在多个函数之间重复逻辑。

简化示例:

class Configurable{

    protected $configurations = array();

    protected static $static_configurations = array();

    public function configure($name, $value){

        // ...lots of validation logic...

        $this->configurations[$name] = $value;

        }

     public static function static_configure($name, $value){

        // ...lots of validation logic (repeated)...

        self::$static_configurations[$name] = $value;

        }

    }

我已经找到了解决方案,但感觉很脏:

class Configurable{

    protected $configurations = array();

    protected static $static_configurations = array();

    public function configure($name, $value){

        // ...lots of validation logic...

        if (isset($this)){
            $this->configurations[$name] = $value;
            }
        else{
            self::$static_configurations[$name] = $value;
            }

        }

    }

我还需要静态函数,以便我可以在整个应用程序中设置配置。另外,这种技术的好处是我可以在两个作用域中使用相同的方法名称。

这样的测试范围有问题吗?性能问题、向前兼容性问题等。这一切都适用于 PHP 5.2,而且我不需要支持


第二种方法的问题是,当错误报告设置为E_STRICT。例如:

严格标准:非静态方法 Foo::bar() 不应在 /home/yacoby/dev/php/test.php 第 10 行静态调用

PHP6 的一个要点是 E_STRICT 错误已移至 E_ALL。换句话说,E_ALL 将覆盖所有错误,包括不允许您静态调用非静态方法。

另一种方法可能是将验证逻辑移至静态函数。这样非静态函数和静态函数就可以调用验证逻辑。

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

PHP isset($this) 并在静态和对象上下文中使用相同的对象方法 的相关文章

随机推荐

  • 将文本字段添加到 SKScene

    我正在使用 Sprite Kit 创建一个游戏 我想添加一个文本字段供玩家输入他们的名字 如何使用 Sprite Kit 创建文本字段 我将创建一个玩家对象 我已经设置了 并使用他们输入的名称和默认分数 0 混合 UITextfields
  • 来自 GET/POST 的 Rails 参数

    我对 Rails 相当陌生 正在编写一个登录表单 我使用 form tag 将用户的提交传递给帐户控制器 现在 我不希望用户能够通过 GET 请求输入其登录详细信息 那么如何检查某个参数是 GET 还是 POST 参数 提前致谢 在 Rai
  • Google API 将请求从 Android 应用发送到 google plus

    我正在开发一款安卓应用程序 众所周知 Facebook SDK 提供了使用请求对话框向其他用户发送请求的功能 https developers facebook com docs android send requests https de
  • Spring Boot - 自定义 JSON 序列化 [重复]

    这个问题在这里已经有答案了 在使用 Jackson 库时 我通常使用 mixin 来执行自定义序列化和反序列化 Spring Boot 应用程序中的 RestController 具有类似于下面列出的方法 我猜 Spring Boot 使用
  • app.post() 不适用于 Express

    我遇到 Express 问题 我尝试使用 app post 函数 但它不起作用 我不知道为什么 虽然我包括了 bodyParser 问题 页面加载没有响应 没有错误消息 我没有看到 console log app js var expres
  • 升级TortoiseSVN 1.8问题

    我升级了乌龟SVN http en wikipedia org wiki TortoiseSVNWindows XP 上从 1 7 12 升级到 1 8 之后它要求升级SVN格式 我尝试升级 但它一直询问并且命令没有产生错误 我尝试从服务器
  • 对于定义为 0 的宏,#ifdef 和 #if 之间的细微差别

    给定以下 C 文件 cat macros c ifdef MACRO error MACRO is defined else error MACRO is undefined endif if MACRO error MACRO is no
  • 私有内部类综合了意想不到的匿名类

    当您编译带有私有 内部类的 Java 类时 由于某种原因 似乎会自动合成一个匿名类 这个类足以重现它 public class SynthesizeAnonymous public static void method new InnerC
  • 具有最佳实践的示例 N 层 ASP.NET MVC3 应用程序(使用 EF 4.1)

    我正在寻找一个演示最佳实践的示例 ASP NET MVC3 N 层应用程序 首先使用域驱动设计和实体框架 4 1 代码 我发现了以下内容 您推荐其中哪一个 或此列表中没有的其他任何一个 http efmvc codeplex com htt
  • 链接 jQuery 动画

    我已经编写了将动画链接在一起的代码 即向左移动 然后向右移动 我有20个 li 标签排列在网格中 我正在为主要动画 ul 移动所需的 li 进入视野 Code x 和 y 是坐标 多快设置为 1200 easeItIn 设置为 easeOu
  • WPF DataGrid 加载时间不合理

    我的 WPF DataGrids 加载时间总是很长 而且我在网上找不到任何类似的报告 所以我怀疑我做错了什么 现在我确信这一点 因为增加布局复杂性会大大减慢执行速度 在非常简单的布局中 DataGrid 会立即填充 而下面的代码大约需要 3
  • python ImageTk.PhotoImage - 段错误

    我尝试在 Mac 10 6 8 上运行以下命令 Python 2 7 2 EPD 7 1 2 64 bit default Jul 27 2011 14 50 45 GCC 4 0 1 Apple Inc build 5493 on dar
  • 在 Julia 中读写 RData 文件

    我用 google 搜索 但在 Julia 中找不到任何可以读写 R 的 RData RDa 文件的函数 有没有任何库 函数 包可以让我做到这一点 DataFrames 的 src 目录中似乎有一个 RDA jl 文件 但我在 DataFr
  • 如何获取 Django 中 TextField 的长度?

    我知道对于常规字符串 您可以执行 x len 来获取它的长度 但 Django 模型 TextField 似乎不需要这样做 我找到并查看了模型字段参考 https docs djangoproject com en dev ref mode
  • 将 Web 服务器与数据库和 J2ME 连接

    我做了一个移动应用程序 用户可以使用它获取所需地点的号码 用户必须选择适当的城市和类别才能获取该地点的信息 所有信息都存储在数据库中 我想知道的是 1 网络服务有什么好处 2 如何连接Web服务和MySQl数据库 3 如何连接Web服务和移
  • 如何在非托管 C++ 中设置区域性信息?

    我有一个用非托管 C 编写的程序 我需要从系统获取文化信息并将该信息设置为我的 C 应用程序中的当前执行线程 Thanks 在 Windows 上的非托管 C 中 您需要的是 Locale 文化是 NET 中定义的术语 作为该术语的替代品
  • PHP会话变量从子域到主域

    我在亚马逊 Web 服务器 EC2 实例上的 ISPConfig 中设置了 2 个域 站点 我有一个名为app example com http www app example com另一个是https www example com ht
  • 在 Android 中设计国际象棋

    我通过使用表格布局中的按钮为国际象棋游戏设计了一个用户界面 对于棋子 我采用 ASCII 值并将其作为字符串值打印在按钮上 但我不知道单击按钮时如何获取该值 这是我第一次为Android 编程
  • 如何使 find() 能够处理一组结构?

    我正在使用一个set保存包含多个字符串的结构 我希望能够使用find 集的功能 但是 由于该集合保存结构 因此它不起作用 我想find 仅查看结构中的字符串之一 如何才能做到这一点 这是我尝试使用的代码 除了以下部分之外 它工作正常find
  • PHP isset($this) 并在静态和对象上下文中使用相同的对象方法

    我正在开发一个需要通过静态函数调用和对象方法访问的类 我发现的一件事是我在多个函数之间重复逻辑 简化示例 class Configurable protected configurations array protected static