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.