PHP从动态类名访问静态属性

时间:2014-07-22 17:13:35

标签: php class dynamic

我正在尝试从动态类中访问 static 属性。

class A {
    public static $myvar = 'A Class';
}

class B {
    public static $myvar = 'B Class';
}

其他地方:

public function getMyVar($classname) {
    return ??????::$myvar; // help here!!
}

$a = getMyVar('A'); // I want 'A Class'
$b = getMyVar('B'); // I want 'B Class'

我的问题:如何根据发送到getMyVar()的内容访问$ myvar?

编辑:该课程可以是众多课程之一(比如50-100),所以我正在寻找一个简短的方法

我唯一的选择是让$myvar不是静态的吗?

3 个答案:

答案 0 :(得分:2)

我解决了。

静态变量可以通过以下方式访问:

public function getMyVar($classname) {
    return $classname::$myvar;
}

这比预期的容易得多! :)

答案 1 :(得分:0)

这样的东西?

    function getMyVar($classname) {
            switch($classname) {
                    case 'A': return A::$myvar;
                    case 'B': return B::$myvar;
            }
    }

编辑:如果你有这么多课程,也许你可以试试这个?

    function getMyVar($classname) {
            eval('$var='.$classname.'::$myvar;');
            return $var;
    }

答案 2 :(得分:0)

这与之前的答案类似,但执行一些完整性检查以确保您尝试访问的内容存在,并且是有效的对象引用。

保存到 demo.php chmod +x demo.php&& ./demo.php


    #!/usr/bin/php
    <?php

    class A {
      public static $myvar = 'A Class';
      public static $test1 = 'TEST_VALUE_1';
      public static $test2 = 'TEST_VALUE_2';
    }

    class B {
      public static $myvar = 'B Class';
    }


    /**
     * Gets a static variable from the specified class. 
     * Returns FALSE if the property or class does not exist, otherwise returns the value of the property.
     * @param string|object $className Can be either the class name (string) or an object (i.e., "A" or A).
     * @param string $varName
     * @return mixed|boolean 
     */
    function getClassStaticVar($className, $varName) {
      if ((is_string($className) && class_exists($className) ) || is_object($className))
        if (property_exists($className, $varName)) {
          return $className::$$varName;
        }
      return FALSE;  //if your property value is potentially FALSE, you might want to return another value here, like NULL.
    }

    function getMyVar($className) {
      if (is_string($className) || is_object($className)) //is className a string or object reference? 
        return getClassStaticVar($className, 'myvar'); // --or--  return $className::$myvar;
      return FALSE;
    }


    $a = getMyVar('A'); // I want 'A Class'
    $b = getMyVar('B'); // I want 'B Class'

    //in real code, you'd check if $a/$b === FALSE here. (see comment in getClassStaticVar() above)
    echo ($a===FALSE ? 'Property/Class not found' : $a) . PHP_EOL;
    echo $b . PHP_EOL;
    echo getClassStaticVar("A", 'test1') . PHP_EOL;
    echo getClassStaticVar(new A(), 'test2') . PHP_EOL;