获取实例的静态属性

时间:2011-04-11 15:43:19

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

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

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

声音真的太过分了。我希望

$thing::property

$thing->property

8 个答案:

答案 0 :(得分:20)

您需要先查找类名:

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

$ property当然必须定义为staticpublic

答案 1 :(得分:7)

从类实例中,您只需使用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"

答案 2 :(得分:1)

classname::property;

我认为就是这样。

答案 3 :(得分:1)

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

来访问它们
class X {
    public static $var = 13;
}
echo X::$var;
此处也支持

Variable variables

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

答案 4 :(得分:1)

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

您可以通过

访问它们
Class_name::static_property_name

答案 5 :(得分:1)

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

static void Main(string[] args)
    {
        var value = "MyString";

        using (var sha256 = SHA256.Create())
        {
            var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(value));
            var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();

            Console.WriteLine(hash);
        }

        using (var sha256 = SHA256.Create())
        {
            var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(value));
            var hash = BitConverter.ToInt64(hashBytes.Take(8).ToArray(), 0);
            hash = IPAddress.HostToNetworkOrder(hash);

            Console.WriteLine(hash);
        }

        using (var md5 = MD5.Create())
        {
            var hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(value));
            var hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLower();

            Console.WriteLine(hash);
        }

        using (var md5 = MD5.Create())
        {
            var hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(value));
            var hash = BitConverter.ToInt64(hashBytes.Take(8).ToArray(), 0);
            hash = IPAddress.HostToNetworkOrder(hash);

            Console.WriteLine(hash);
        }

        Console.ReadLine();
    }

您也可以使用PHP 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

答案 6 :(得分:1)

如果你不想

$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;

这个允许你实例化访问任何静态变量,好像它是对象的局部变量,但它可能被认为是邪恶的憎恶。

答案 7 :(得分:0)

class testClass {
    public static $property = "property value";
    public static $property2 = "property value 2";
}
echo testClass::$property;
echo testClass::property2;