我需要静态类(对象)来存储全局变量值。我是PHP的新手,但我有其他语言的经验,有像Java一样的OOP概念。在Java中,我可以创建静态变量,并可以调用我想要的任何地方。但是如何在PHP中做同样的事情?
我使用CodeIgniter框架,在我尝试之前我尝试使用会话来存储,但我想使用上面的其他方式。有谁可以帮助我?
我可以这样做吗?
static class myClass{
public static myVar = "";
}
答案 0 :(得分:1)
因为您提到了框架Codeigniter和会话的使用我假设您需要在多个控制器和视图中使用它。 所以我还有另一种方法与类的属性有点不同但比会话更相似(除了改变的值不会影响另一页)。
因此请使用Constant
。
在
中定义它应用程序> config> 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 ?>
我希望这是你想要的,如果不为我的误解而抱歉。
答案 1 :(得分:0)
你可以在PHP中拥有类似静态的类。但是你在PHP中没有应用程序循环。这意味着您不会在整个应用程序中获得真正的静态(或单例)。
答案 2 :(得分:0)
如果您不能实例化一个类,那么它应该是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;
}
}
关于这样做的注意事项,使用抽象类/方法很容易导致紧密耦合的代码,这有很多原因。
例如,如果您编写一个直接通过除抽象类继承之外的任何方式调用抽象类的方法的类,那么就不可能单独对该类进行单元测试。它总是要求你的抽象类也成为测试套件的一部分,这意味着更难以确定测试失败是由于被测试类中的错误还是抽象类中的错误引起的。 ; s取决于。
更重要的是,如果您依赖的抽象类充当数据源的访问者,那么您也将无法在测试期间模拟该类。模拟是一种非常强大的验证类正确性的方法,而不必依赖于运行该类的环境。例如,您可以使用兼容对象模拟数据库访问类,该对象始终从数组返回相同的数据而不是打一个实际的数据库。这意味着您可以保证在运行测试时,它将以您完全控制的状态运行数据。如果您通过抽象类的方法访问数据库,那么您无法替换它进行测试,突然您可能最终得到一个可能成功或失败的测试套件,具体取决于当时数据库的状态你运行测试。更糟糕的是,如果您的测试涉及写入数据库,那么在运行测试时可能会损坏您的数据源。