从string访问类常量和静态方法

时间:2012-02-21 15:49:11

标签: php string class methods static

我有一个包含类名的字符串,我希望得到一个常量并从该类中调用(静态)方法。

<?php
$myclass = 'b'; // My class I wish to use

$x = new x($myclass); // Create an instance of x
$response = $x->runMethod(); // Call "runMethod" which calls my desired method

// This is my class I use to access the other classes
class x {
    private $myclass = NULL;

    public function __construct ( $myclass ) {
        if(is_string($myclass)) {
            // Assuming the input has a valid class name
            $this->myclass = $myclass;
        }
    }

    public function runMethod() {
        // Get the selected constant here
        print $this->myclass::CONSTANT;

        // Call the selected method here
        return $this->myclass::method('input string');
    }
}


// These are my class(es) I want to access
abstract class a {
    const CONSTANT = 'this is my constant';

    public static function method ( $str ) {
        return $str;
    }
}

class b extends a {
    const CONSTANT = 'this is my new constant';

    public static function method ( $str ) {
        return 'this is my method, and this is my string: '. $str;
    }
}
?>

正如我预期的那样(或多或少),使用$variable::CONSTANT$variable::method();不起作用。

在问我尝试过之前;我已经尝试了很多我基本上忘记的事情。

这样做的最佳方法是什么?提前谢谢。

6 个答案:

答案 0 :(得分:26)

要访问常量,请使用constant()

constant( $this->myClass.'::CONSTANT' );

建议:如果您正在使用命名空间,即使从同一命名空间调用constant(),您也需要专门将命名空间添加到字符串中!

对于通话,您必须使用call_user_func()

call_user_func( array( $this->myclass, 'method' ) );

但是:这一切都不是很有效,所以您可能想要再看看对象层次结构设计。使用继承等可能有更好的方法来实现所需的结果。

答案 1 :(得分:2)

使用call_user_func调用静态方法:

call_user_func(array($className, $methodName), $parameter);

答案 2 :(得分:2)

在php 7中你可以使用这段代码

echo 'my class name'::$b;

答案 3 :(得分:1)

您可以通过设置临时变量来实现它。不是最优雅的方式,但它有效。

public function runMethod() {
    // Temporary variable
    $myclass = $this->myclass;
    // Get the selected constant here
    print $myclass::CONSTANT;

    // Call the selected method here
    return $myclass::method('input string');
}

我想这与::的含糊不清有关,至少是错误消息暗示的内容(PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM

答案 4 :(得分:1)

定义为abstract的类可能无法实例化,并且包含至少一个抽象方法的任何类也必须是抽象的。定义为抽象的方法只是声明方法的签名 - 它们无法定义实现。

从抽象类继承时,父类声明中标记为abstract的所有方法都必须由子类定义;此外,必须使用相同(或限制较少)的可见性来定义这些方法。例如,如果将抽象方法定义为protected,则必须将函数实现定义为protected或public,而不是private。此外,方法的签名必须匹配,即类型提示和所需参数的数量必须相同。这也适用于PHP 5.4的构造函数。在5.4构造函数签名可能不同之前。 请参阅http://php.net/manual/en/language.oop5.abstract.php

答案 5 :(得分:0)

这可能只是与主题相关的,但是在搜索我自己的问题时,我发现接受的答案将我指向了正确的方向,因此我想分享我的问题和解决方案,以防其他人陷入困境。类似的时尚。

我正在使用PDO类,并从ini配置文件中构建了一些错误选项。我需要以PDO::OPTION_KEY => PDO::OPTION_VALUE的形式在关联数组中使用它们,但是由于我试图仅用PDO::$key => PDO::$value来构建数组,所以它当然失败了。

解决方案(从接受的答案中得到启发):

$config['options'] += [constant('PDO::'.$key) => constant('PDO::'.$option)];

如果将类名和Scope Resolution Operator连接为带变量的字符串并通过常量函数(更多here)获得结果字符串的常量值,则一切正常。 谢谢,希望对您有所帮助!