Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候在php中使用静态变量/函数?_Php_Oop_Static - Fatal编程技术网

什么时候在php中使用静态变量/函数?

什么时候在php中使用静态变量/函数?,php,oop,static,Php,Oop,Static,我正在用PHP刷新OOP,我看到了一个将函数和/或变量设置为静态的示例。何时以及为什么要将变量/函数设置为static?我曾经使用过其他语言,但我不记得使用过静态语言,我从来没有发现它的真正用途。我知道它做什么,但为什么不使用变量呢?静态函数和变量用于访问全局范围内的变量/函数,如下所示: echo myClass::myVariable; echo myClass::myFunction(); 当某个东西是静态的时,它可以在任何地方访问,并且非常类似于过程类型函数,只是它可以使用self并且

我正在用PHP刷新OOP,我看到了一个将函数和/或变量设置为静态的示例。何时以及为什么要将变量/函数设置为static?我曾经使用过其他语言,但我不记得使用过静态语言,我从来没有发现它的真正用途。我知道它做什么,但为什么不使用变量呢?

静态函数和变量用于访问全局范围内的变量/函数,如下所示:

echo myClass::myVariable;
echo myClass::myFunction();
当某个东西是静态的时,它可以在任何地方访问,并且非常类似于过程类型函数,只是它可以使用self并且包含在类范围内

class myClass{
    static $myVariable = "myVar";
    static function myFunction()
    {
       return "myFunc";
    }
}
使用这种方法的一种方法是只保留一个类实例或一个单例方法

class myClass
   {
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        else
        {
            return self::$class;
        }
    }
    private function __construct()
    {
         // my constructor
    }
    // Then create regular class functions.
   }
因为它有一个私有构造函数,所以不能用
new
操作符实例化它,所以您必须调用
myClass::get\u connection()
来获取一个类。该函数可以生成新类(因为它是该类的成员)。然后它将类存储在一个静态变量中,如果您再次调用该函数,它将简单地返回创建的类

最后,static关键字被用来保持事物的静态,比如范围。这意味着您不希望由于当前范围而发生任何“更改”。虽然Singleton方法稍微扩展了这一点,但它保持了一个相同的想法,即无论您在什么范围内,您总是拥有“相同”的类

PHP文档

堆栈溢出知识




不过,这里有一个随机的例子

从职位:

实例方法是实例方法,因为它们依赖于状态 特定对象实例的。实例方法与 特定实例,因为该方法调用的行为 依赖于该特定实例的状态

当您将一个方法声明为静态时,您将该方法定义为 类方法。类方法应用于类,而不是任何 具体实例。类方法引发的行为不会 不依赖于特定实例的状态。事实上,一个静态的 方法不能依赖实例的状态,因为静态方法缺少 访问此参考。相反,类方法的行为 或者取决于所有对象在类级别共享的状态, 或者完全独立于任何国家

如果方法依赖于对象实例的状态,那么它应该是 实例方法。如果一个方法对所有实例都是通用的,或者没有实例 类,并且不依赖于对象状态,它应该是静态的 方法。实例方法是最常用的。无论多么静态 方法对于实用程序类和工厂类非常有用 其他用途

当您希望使用未绑定到实例的方法/变量时,可以使用static。当:

  • 这与您的目的和实例无关(对于那些不允许像Java这样的OOP的语言中的工具箱很有用,但在PHP中不有用)

  • 您希望控制对实例的访问。通常,您想要处理的实例在编写代码时没有定义,而是在执行时定义。这是最好的例子。您可以使用静态方法作为工厂,根据上下文或与其他实例共享资源来创建对象。例如:静态成员可以授予对数据库层的访问权限,因此应用程序的一部分可以从任何地方访问同一个数据库层,并且该应用程序的打开/关闭没有冲突

  • 性能很重要,该方法将被执行很多次。在这种情况下,您将节省一些CPU时间,防止解释器在每次调用时查找实例的成员。但是,如果perfs成为这样一个问题,您需要使用这个解决方案,那么可能需要重新考虑您的体系结构,或者在代码的关键部分使用与更快语言的绑定

  • 您有一个与某个类型相关但将应用于另一个类型的方法。将方法写入第一种类型的声明中是有意义的,但将其设置为静态,因为它需要另一种类型的实例

最好的例子是字符串解析器:

class MyObject 
{
 static function parse($str)
 {
    $obj = new MyObject();
    // some parsing/setting happens here
    return $obj;
 }
}

// you create an object "MyObject" from a string, so it's more obvious
// to read it this way :
$new_obj = MyObject::parse("This a description of a super cool object");

此外,如果经常调用某个方法并执行相同的操作,则它对于缓存非常有用,例如:

/**
 * Returns true if the user is logged in through shibboleth
 *
 * @return boolean true on success, else false
 */
protected function is_logged_in() {

    //Check shibboleth headers
    if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
        if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
            return true;
        }
    }
    return false;
}
此方法将在我的框架内经常调用,在那里它将为每次调用执行数据库查找,以查找我的配置$\u服务器密钥

因此,在处理页面时,我在一次页面加载中调用了10次,它将有10次数据库调用,但我将其更改为:

/**
 * Returns true if the user is logged in through shibboleth
 *
 * @return boolean true on success, else false
 */
protected function is_logged_in() {
    static $logged_in = null;
    if($logged_in != null) {
        return $logged_in;
    }

    //Check shibboleth headers
    if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
        if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
            $logged_in = true;
            return true;
        }
    }
    $logged_in = false;
    return false;
}
因此,如果我登录并缓存结果,它只需检查一次每个页面加载的正常行为。下次它将只返回缓存的值。 我经常使用此功能来提高性能

希望这能有所帮助。

访问:

静态方法只不过是名称空间的全局函数。名称空间,我认为我们都可以同意,是伟大的。至于全局函数:我们一直在使用它们。PHP中的本机函数构成了我们的基本构建块


通常,使用静态功能,您可以优化速度和内存,方法的范围不应更改,其性质应是静态的,您可以访问对象的静态属性、方法,而无需启动它们,从而节省内存。

如果您想与所有实例共享数据,类似于当前执行时创建的实例数计数器。

静态元素具有许多有用的特征

  • 首先,它们可以从脚本中的任何位置获得(假设您可以访问该类)。这意味着您可以访问功能,而无需将类的实例从一个对象传递到另一个对象,更糟糕的是,无需将实例存储在全局变量中

  • 第二,静态属性是可用的