如何在PHP中创建静态类

如何在PHP中创建静态类,php,codeigniter,Php,Codeigniter,我需要静态类(对象)来存储全局变量值。我是PHP新手,但我在其他语言方面有过类似Java的OOP概念。在Java中,我可以创建静态变量,并可以在任何地方调用。但在PHP中如何做到这一点呢 我使用CodeIgniter框架,在尝试之前,我尝试使用session来存储,但我想使用上面提到的另一种方式。有人能帮我吗 我可以这样做吗 static class myClass{ public static myVar = ""; } 在PHP中可以有一个类似于静态的类。但在PHP中没有应用程序周期。这意

我需要静态类(对象)来存储全局变量值。我是PHP新手,但我在其他语言方面有过类似Java的OOP概念。在Java中,我可以创建静态变量,并可以在任何地方调用。但在PHP中如何做到这一点呢

我使用CodeIgniter框架,在尝试之前,我尝试使用session来存储,但我想使用上面提到的另一种方式。有人能帮我吗

我可以这样做吗

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

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

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

因此,请使用
常量

在中定义它

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

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

就像在constant.php中将
SITE\u NAME
constant定义为
defined('SITE_NAME')或define('SITE_NAME',“我的示例站点”)

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

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


如果不为我的误解感到抱歉的话,我希望它是您想要的。

如果您不能实例化一个类,那么它应该是
抽象的
,并将其方法定义为
静态的
。然而,有人可以将该类子类化,使其非抽象。如果您也不希望出现这种情况,那么类应该是
抽象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;
    }
}
但要注意的是,使用抽象类/方法很容易导致紧密耦合的代码,这是不好的,原因有很多

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


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

为什么您编写了静态类myClass,我从来没有听说过它是任何面向对象的语言?如果你想要一个静态属性,它和java是一样的。可能的重复:但是有没有其他方法可以像在CodeIgniter中那样做呢?我没有使用CodeIgniter的经验,但我建议使用singleton模式。我总是喜欢singleton,即使在Java中也是如此。