Php 为什么变量在类中可以是静态的,但不能是全局的

Php 为什么变量在类中可以是静态的,但不能是全局的,php,oop,Php,Oop,我想知道为什么不能在class中将变量定义为global。大概是这样的: class MyClass { global $var1 = 'anything'; // syntax error static $var2 = 'anything'; // but it is ok } function foo() { echo $globby; // Here we have no clue who globby is? $globby = 321; // Here we

我想知道为什么不能在
class
中将变量定义为
global
。大概是这样的:

class MyClass {
  global $var1 = 'anything'; // syntax error
  static $var2 = 'anything'; // but it is ok
}
function foo() {
    echo $globby; // Here we have no clue who globby is?
    $globby = 321; // Here we define globby, but then he's totally forgotten. :(
}
foo(); // => 'Notice: Undefined variable: globby'

echo $globby; // => '123' ... still the same old globby.
我知道如果我想在不创建类实例的情况下使用它,我应该使用
static
。正确的?只有这个,没有别的东西?
global
是相同的工作吗


事实上,我无法理解php中的
global
概念,也无法将其与
static
进行比较。我知道它们都保留了值,但我认为不同之处在于生存期(存储持续时间)或范围。因此,我应该何时使用
global
以及何时使用
static

static
global
用于不同的目的

  • 如果希望项目或代码的所有值都保持不变,则需要静态值

  • 但是,如果您希望从函数外部获取一些变量,并直接使用它们,而不将它们作为参数传递,那么您需要全局变量。它获取全局可用变量的值,并且可以更改或修改其值

    $suv = "uvre";
    
    function global_access_tes()
    {
        //want to use suv inside this function 
       global $suv;
       $suv = "changed";
    }
    global_access_tes();
    
    echo $suv;
    // output - changed
    

    • 属性中,您需要
      全局
      声明什么?我们这里不是在处理普通的
      函数
      $this->var1
      将从类内的任何
      方法或类外的实例化对象(其中变量为
      public
      )获取
      $var1
      。但是让我们彻底地

      说明“全球” 全局对类属性没有意义;尽管您可以在类方法内的变量中使用它,就像在常规函数中一样。(但有更优雅的方法可以做到这一点;最好避免在全局范围内出现大量潜在危险的混乱。)让我们首先定义一个变量:

      $globby = 123; // Globby is a friend living outside a function.
      
      不使用
      全局
      声明的函数既不能从其作用域之外访问变量,也不能更改该变量的值。故事是这样的:

      class MyClass {
        global $var1 = 'anything'; // syntax error
        static $var2 = 'anything'; // but it is ok
      }
      
      function foo() {
          echo $globby; // Here we have no clue who globby is?
          $globby = 321; // Here we define globby, but then he's totally forgotten. :(
      }
      foo(); // => 'Notice: Undefined variable: globby'
      
      echo $globby; // => '123' ... still the same old globby.
      
      但是,将变量声明为
      global
      的函数既可以访问变量,也可以在函数范围之外对其进行修改。此外,在函数内部新定义为全局的变量可以在函数外部访问

      function foot() {
          global $globby; // Hey globby, won't you come on in! *Globby UFO Lands*
          echo $globby; // - Who are you? - I'm globby that says 123.
          $globby = 321; // - But I'm gonna tell you to say 321 everywhere.
      }
      
      foot(); // => '123' ... this here is the good old globby from the start.
      echo $globby; // => '321' ... see, globby can change outside the function scope!
      
      在课堂上演示“静态” 请注意,类属性的
      static
      与函数变量的
      static
      不同。手动:“静态变量仅存在于局部函数作用域中,但当程序执行离开此作用域时,它不会丢失其值。”并且再次:“将类属性或方法声明为静态,无需实例化类即可访问它们。”(;和)在任何情况下,类属性都会在对象的生存期内保留其值

      现在,来说明静态和非静态方法(又名“类函数”)和属性(又名“类变量”)的用法(和非用法)。让我们来上一节课:

      class foo {
      
          static $one = 1; // This is a static variable aka. class property.
          var $two = 2; // But this is non-static.
      
          static function say_one() { // This is a static method.
              echo self::$one; // Uses self:: to statically access the property.
          }
      
          function say_two() { // This is a non-static method.
              echo $this->two; // Uses $this-> to dynamically access the property.
          }
      
      }
      
      然后让我们看看哪些有效,哪些无效。非有效选项被注释掉

      /* Static Variables and Methods */
      
      echo foo::$one; // => '1'
      echo foo::say_one(); // => '1'
      
      // echo foo::$two; 
      // => "Fatal error: Access to undeclared static property: foo::$two"
      
      // echo foo::say_two(); 
      // => "Strict: Non-static method foo::say_two() should not be called statically. 
      // & Fatal error: Using $this when not in object context."
      
      
      /* Non-Static Variables and Methods */
      
      $f = new foo(); // This here is a real effin' instantiated dynamite object. *BOOM*
      
      echo $f->two; // => '2' 
      echo $f->say_two(); // => '2'
      
      // echo $f->one; 
      // => "Strict: Accessing static property foo::$one as non static. 
      // & Notice: Undefined property: foo::$one."
      
      echo $f->say_one(); // => '1'
      
      希望这能澄清问题。注意,您可以通过实例化对象访问静态方法,并使用它访问静态变量;但是您不能在没有警告的情况下以非静态的方式直接访问静态变量


      让我补充一点关于良好做法的说明。如果您发现需要在函数中反复声明
      global
      变量,或者将配置参数等作为函数参数传递,那么这表明您可能应该将代码分解为类,将这些全局变量作为其属性访问。OOP的使用非常干净。你会更快乐<代码>$OOP->nirvana()

      全局变量与类无关。它将存在于全局名称空间中。因此,你可以用它的名字来称呼它“just”,它在任何地方都可以找到,因此命名为“global”。与静态成员仅在类的上下文中可用相反,您必须使用类限定符对其进行寻址。这使得事情更精确,更不容易出错,这就是为什么“globals”不受欢迎并且不应该被使用的一般原因。好吧,如果你问我,我看一下规范:-我没有看到任何关于在类中定义全局变量的提及,那么为什么要这样做呢?你总是混淆一些东西。我强烈建议您阅读这篇文章:但我认为
      static
      并没有改变。看看这个:
      函数foo(){static$i=1;echo$i;$i++;}foo();foo();foo(),输出将是:
      123
      @stack声明
      static
      在类和函数中有不同的用法。在函数中,它将在函数调用之间保留其值。在一个类中,所有的值都会在对象的持续时间内保留。在您上面给出的函数中,
      $i
      是递增的,因为
      static
      导致它只定义一次。@MarkusAO您的评论几乎是我的最佳答案,谢谢。就在我们在课堂上使用
      static
      时?无论类的任何实例是否存在,物质是否存在?就那样@stack,请看我在下面写的答案。我详细阐述了
      静态
      。感谢您的回答,您的解释几乎是全面的,请添加更多的
      全局
      应用程序示例。告诉我类和函数中的
      global
      有什么区别吗?@stack:好的,现在这是一个关于所有相关事物的快乐小童话。如果缺少重要的东西,请告诉我。你能告诉我当我创建myclass的
      对象时会发生什么吗?
      static
      的唯一用法是在不定义其
      类的
      对象的情况下为我们提供可用性变量。现在我想知道,当我创建mytable的实例时,过程非常复杂?否则公羊会吃饱的?还是怎么了?那个