Skip to content
Advertisement

Access class constant and static method from string

I have a string containing the class name and I wish to get a constant and call a (static) method from that class.

<?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;
    }
}
?>

As I expected (more or less), using $variable::CONSTANT or $variable::method(); doesn’t work.

Before asking what I have tried; I’ve tried so many things I basically forgot.

What’s the best approach to do this? Thanks in advance.

Advertisement

Answer

To access the constant, use constant():

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

Be advised: If you are working with namespaces, you need to specifically add your namespace to the string even if you call constant() from the same namespace!

For the call, you’ll have to use call_user_func():

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

However: this is all not very efficient, so you might want to take another look at your object hierarchy design. There might be a better way to achieve the desired result, using inheritance etc.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement