【问题标题】:How to make static class in PHP如何在 PHP 中创建静态类
【发布时间】:2017-06-14 09:50:05
【问题描述】:

我需要静态类(对象)来存储全局变量值。我是 PHP 新手,但我有其他语言的经验,这些语言有 Java 等 OOP 概念。在 Java 中,我可以制作静态变量,并且可以在我想要的任何地方调用。但是如何在 PHP 中做同样的事情呢?

我使用 CodeIgniter 框架,在我尝试这个之前,我尝试使用 session 来存储,但我想使用像上面这样的另一种方式。谁能帮帮我?

我可以这样做吗?

static class myClass{
public static myVar = "";
}

【问题讨论】:

  • 为什么你写了静态类myClass,我从来没有给它任何面向对象的语言?如果你想要一个静态属性,它与 java 相同。

标签: php codeigniter


【解决方案1】:

因为您提到了框架 Codeigniter 和会话的使用,我假设您需要在多个控制器和视图中使用它。 所以我还有另一种方式,它与类的属性有点不同,但比会话更相似(除了更改的值不会影响另一个页面)。

所以使用Constant

中定义

应用程序>配置>常量.php

页面。该页面中定义了许多常量,使用完全相同的语法您可以定义您的值,并且您可以在任何地方非常轻松地使用它。

就像你在 constant.php 中定义 SITE_NAME 常量一样 defined('SITE_NAME') OR define('SITE_NAME', "My Example Site");

之后,您可以在 Codeigniter 的任何控制器、视图或模型中的任何位置使用它,您需要做的就是回显它

<?php echo SITE_NAME;  //only SITE_NAME not $SITE_NAME ?>

如果不是对不起我的误解,我希望这是你想要的。

【讨论】:

    【解决方案2】:

    您可以在 PHP 中创建一个类静态类。但是您在 PHP 中没有应用程序周期。这意味着您不会在整个应用程序中获得真正的静态(或单例)。

    【讨论】:

    • 但是在 CodeIgniter 中还有其他方法可以做到这一点吗?
    • 我没有使用 CodeIgniter 的经验,但我建议使用单例模式。我总是更喜欢单例,即使在 Java 中也是如此。
    【解决方案3】:

    如果您不能实例化一个类,那么它应该是abstract,并将其方法定义为static。但是,有人可以只是子类化该类并使其非抽象。如果您也不希望出现这种情况,那么该类应该是abstract final

    如果您这样做,您可以使用ClassName::methodName() 语法直接在相关类上调用方法。请记住,像这样编写的类不能使用$this,因为它仅对对象实例有效。如果您需要类来维护状态,那么您将必须定义一个静态变量并将其与self::static:: 语法一起使用。

    abstract final class SomeClass
    {
        private static $var = "";
    
        public static function setVar($newVal)
        {
            self::$var = (string) $newVal;
        }
    
        public static function getVar()
        {
            return self::$var;
        }
    }
    

    但请注意,使用抽象类/方法很容易导致紧密耦合的代码,这出于多种原因是不好的。

    例如,如果您编写的类直接调用抽象类的方法,而不是从抽象类继承,那么就不可能单独对该类进行单元测试。它总是要求您的抽象类也成为测试套件的一部分,这意味着更难以确定测试失败是由被测类中的错误还是它所依赖的抽象类中的错误引起的。

    此外,如果您所依赖的抽象类用作数据源的访问器,那么您也将无法在测试期间模拟该类。模拟是验证类正确性的一种非常强大的方法,而不必依赖于类运行的环境。例如,您可以使用兼容的对象模拟数据库访问类,该对象总是从数组中返回相同的数据而不是打一个实际的数据库。这意味着您可以保证,当您运行测试时,它将以您可以完全控制的状态运行数据。如果您通过抽象类的方法访问数据库,那么您无法替换它进行测试,并且突然间您可能会得到一个测试套件,该套件可能成功或失败,具体取决于您运行测试时数据库的状态。更糟糕的是,如果您的测试涉及写入数据库,那么您在运行测试时可能会损坏您的数据源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 2014-05-18
      • 2020-01-15
      相关资源
      最近更新 更多