【问题标题】:Disallow variable overwrite in PHP禁止 PHP 中的变量覆盖
【发布时间】:2012-07-25 10:43:12
【问题描述】:

是否可以防止变量在 PHP 中被覆盖?我正在制作一个具有一些保留变量的系统,并且我不希望在某个点之后将它们替换为其他变量。有可能的?如果没有,我该怎么做才能接近这个?

其中一些变量是实例化的类,所以我不能将它们定义为常量。

【问题讨论】:

  • namespaces怎么样
  • 什么是替换?您是否从不受信任的用户内容中导入变量?或者这只是保护自己免受未来自我伤害的一般概念?
  • 是的,从技术上讲,我是在保护自己毁掉一切,但不仅仅是我,因为我不是唯一一个编写脚本的人,所以主变量有时可能会发生冲突。
  • 我不想为此输入完整的答案,所以我只想说:避免使用全局变量!使用类和适当的封装技术。

标签: php variables overwrite


【解决方案1】:

看看this的问题。此外,PHP 手册中有关 constants 的信息可能会有所帮助。

【讨论】:

  • 他说他不能使用常量,尽管关于静态保护的链接可能会有所帮助。
  • 我知道,这就是为什么我首先链接到另一个问题。不过,阅读常量可能仍然有帮助。 (尤其是手册页上的一些示例代码)
  • 它完美地满足了我的需求。谢谢!
【解决方案2】:

在这种情况下(我知道)你能做的最好的事情就是在类中将它们设为私有变量。然后,您必须使用 getter 和 setter 来分配值或构造。这样,其他人的代码就不太可能与您的代码发生冲突。

【讨论】:

  • 静态也是一个选项,。但所有对象的值必须相同。
【解决方案3】:

不可能找出在您的情况下最简单的方法,因为根本没有可用的代码,但更好的选择可能是

  1. 将它们作为私有成员变量隐藏在一个类中。
  2. 通过 getter 暴露它们。

如果需要,将它们设为静态

【讨论】:

    【解决方案4】:

    是的,他们叫 constants

    如果你不能使用它们,假设你运行的是最新的 PHP 版本,你可以使用 namespaces,使用命名空间,你可以有 2 个同名的变量,在不同的命名空间。以免发生碰撞。

    【讨论】:

    • 他说他不能使用常量
    • 谢谢,我查看了文档,命名空间对我未来有很大帮助,但不幸的是,我必须在许多服务器上处理不同的 PHP 版本,我不能假设他们都可以升级到最新版本,所以我将采取其他选项之一
    【解决方案5】:

    也许你可以实现冻结状态之类的东西,如果类被冻结,则无法修改:

    class Test
    {
        private $variable;
        private $frozen = false;
    
        public function freeze() {
            $this->frozen = true;
        }
    
        public function setVariable($value) {
            if ($this->frozen)
                throw new Exception("...");
    
            $this->variable = $value;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-22
      • 2020-11-26
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多