代码之家  ›  专栏  ›  技术社区  ›  Tom

PHP中的动态静态方法调用?

  •  57
  • Tom  · 技术社区  · 15 年前

    请有PHP方面的经验的人来帮助解决以下问题。在我的代码中的某个地方,我调用了一个非实例化类内的公共静态方法:

    $result = myClassName::myFunctionName();
    

    但是,我希望有许多这样的类,并根据用户的语言动态地确定正确的类名。换句话说,我有:

    $language = 'EN';
    

    …我需要做如下的事情:

    $result = myClassName_EN::myFunctionName();
    

    我知道我可以将语言作为参数传递给函数,并且只在一个公共类中处理它,但是出于各种原因,我希望使用不同的解决方案。

    这有什么意义吗,任何人?谢谢。

    9 回复  |  直到 9 年前
        1
  •  103
  •   Ben Everard    12 年前

    使用 call_user_func 功能:

    http://php.net/manual/en/function.call-user-func.php

    例子:

    call_user_func('myClassName_' . $language . '::myFunctionName');
    
        2
  •  18
  •   Adam Hopkinson    15 年前

    认为 你可以这样做:

    $classname = 'myClassName_' . $language;
    $result = $classname::myFunctionName();
    

    这叫做 Variable Functions

        3
  •  14
  •   Darryl Hein IrishChieftain    14 年前

    我将封装您在工厂中需要的类的创建。

    这样,当需要更改基名称或将语言映射到正确类的规则时,您将拥有一个入口点。

        class YourClassFactory {
    
            private $_language;
            private $_basename = 'yourclass';
    
            public YourClassFactory($language) {
                $this->_language = $language;
            }
    
            public function getYourClass() {
                return $this->_basename . '_' . $this->_language;
            }    
        } 
    

    然后,当你不得不使用它时:

    $yourClass = $yourClassFactoryInstance->getYourClass();
    $yourClass::myFunctionName();
    
        4
  •  6
  •   ahmetunal    15 年前

    虽然我认为你的交易方式是一个非常糟糕的主意,但我想我可能有一个解决办法

    $className = 'myClassName_'.$language;
    $result = $className::myFunctionName();
    

    我想这就是你想要的

        5
  •  6
  •   Dimcho    12 年前

    正如Temuri所说,在尝试“$classname::functionname”时会产生分析错误:

    分析错误:语法错误,意外的T paamayim u nekudotayim…

    在我的例子中(带有两个参数的静态方法),最好的解决方案是使用 call_user_func_array 使用2个阵列(如nick.org建议的那样):

    $result = call_user_func_array(array($className, $methodName), array($ard1, $arg2));
    

        6
  •  1
  •   Sarfraz    15 年前

    就我所能理解的你的问题而言,你需要得到类名,可以用 get_class 功能。另一方面, Reflection class 在这里可以帮助您,这对于OOP方式中的方法、参数等非常有用。

        7
  •  1
  •   KorbenDallas    9 年前

    您可以轻松地执行以下操作:

    <?php
    
    class B {
    
        public static $t = 5;
    
        public static function t($h) {
            return "Works!" . $h;
        }
    }
    
    $g = 't';
    $class = 'B';
    
    echo $class::$g('yes'); //Works! Yes
    

    在php 5.2>上测试,它会很好地工作。=

        8
  •  0
  •   Taryn Frank Pearson    11 年前

    类似的解决方案:

    $yourClass::myFunctionName();
    

    不会起作用。PHP将产生分析错误。

    不幸的是,唯一的方法是 非常慢 call_user_func() .

        9
  •  -1
  •   Beau    11 年前

    我知道这是一个旧线程,但是从php 5.3.0开始,您应该使用 forward_static_call

    $result = forward_static_call(array('myClassName_EN', 'myFunctionName'));
    

    使用$language变量,它可能看起来像:

    $result = forward_static_call(array('myClassName_' . $language, 'myFunctionName'));
    
    推荐文章