【问题标题】:Get a static property of an instance获取实例的静态属性
【发布时间】:2011-08-03 04:33:42
【问题描述】:

如果我在 PHP 中有一个实例,那么获取该实例的静态属性(“类变量”)的最简单方法是什么?

这个

$classvars=get_class_vars(get_class($thing));
$property=$classvars['property'];

听起来确实有些过头了。我会期待

$thing::property

$thing->property

编辑:这是一个老问题。在较新的版本中有更明显的方法可以做到这一点 PHP,在下面搜索。

【问题讨论】:

    标签: php oop static late-binding class-variables


    【解决方案1】:

    你需要先查找类名:

    $class = get_class($thing);
    $class::$property
    

    $property 当然必须定义为staticpublic

    【讨论】:

    • 确认,这行得通,php 5.3.0> ...仍然有点过头了,但我想这是最短的。谢谢!
    • 否,“从 PHP 5.3.0 开始,可以使用变量引用类”。
    【解决方案2】:

    在类实例中,您可以简单地使用self::...

    class Person {
      public static $name = 'Joe';
      public function iam() {
        echo 'My name is ' . self::$name;
      }
    }
    
    $me = new Person();
    $me->iam(); // displays "My name is Joe"
    

    【讨论】:

      【解决方案3】:

      如果你不想

      $class = get_class($instance);
      $var = $class::$staticvar;
      

      因为你发现它的两行太长了,你还有其他选择:

      1。写一个getter

      <?php
      class C {
        static $staticvar = "STATIC";
        function getTheStaticVar() {
          return self::$staticvar;
        }
      }
      $instance = new C();
      echo $instance->getTheStaticVar();
      

      简单而优雅,但您必须为要访问的每个静态变量编写一个 getter。

      2。写一个通用的静态getter

      <?php
      class C {
        static $staticvar = "STATIC";
        function getStatic($staticname) {
          return self::$$staticname;
        }
      }
      $instance = new C();
      echo $instance->getStatic('staticvar');
      

      这将允许您访问任何静态,尽管它仍然有点冗长。

      3。写一个魔术方法

      class C {
        static $staticvar = "STATIC";
        function __get($staticname) {
          return self::$$staticname;
        }
      }
      $instance = new C();
      echo $instance->staticvar;
      

      这允许您对任何静态变量进行实例化访问,就好像它是对象的局部变量一样,但它可能被视为邪恶的可憎之物。

      【讨论】:

      • 哦,如果你扩展这个类并想使用子类的静态变量,而不是父类的静态变量,记得使用static::$$staticname
      【解决方案4】:
      classname::property;
      

      我想就是这样。

      【讨论】:

        【解决方案5】:

        您可以使用双冒号(或T_PAAMAYIM_NEKUDOTAYIM token,如果您愿意)访问它们

        class X {
            public static $var = 13;
        }
        echo X::$var;
        

        这里也支持Variable variables

        $class = 'X';
        echo $class::$var;
        

        【讨论】:

          【解决方案6】:

          您应该了解静态属性的含义。静态属性或方法不适用于对象。它们被类直接使用。

          您可以通过

          访问它们
          Class_name::static_property_name
          

          【讨论】:

          • 静态属性是类的属性,因此对于所有实例来说都是有意义的信息......除了 php 之外的所有语言 :-)
          • @pike:没错,但它们不受任何特定实例的限制
          【解决方案7】:

          如今,有一种非常简单、干净的方法可以做到这一点。

          <?php
          namespace Foo;
          class Bar
          {
              public static $baz=1;
              //...
          
              public function __toString()
              {
                  return self::class;
              }
          
          }
          
          echo Bar::$baz; // returns 1
          $bar = new Bar();
          echo $bar::$baz; // returns 1
          

          您也可以使用 PHP 7 中的属性来做到这一点。

          <?php
          namespace Foo;
          class Bar
          {
              public static $baz=1;
              public $class=self::class;
              //...
          
          }
          
          $bar = new Bar();
          echo $bar->class::$baz; // returns 1
          

          【讨论】:

            【解决方案8】:
            class testClass {
                public static $property = "property value";
                public static $property2 = "property value 2";
            }
            echo testClass::$property;
            echo testClass::property2;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-04-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多