Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 628
Tim S. Avatar asked Feb 21 '12 15:02

Tim S.


People also ask

Can we access class variable in static method?

A static method doesn't have access to the class and instance variables because it does not receive an implicit first argument like self and cls . Therefore it cannot modify the state of the object or class. The class method can be called using ClassName.

What is the class of constant string?

class A { public: static constexpr const char* STRING = "some value"; }; void foo(const std::string& bar); int main() { foo(A::STRING); // a new std::string is constructed and destroyed. }

What is the difference between a class method and a static method?

Class method can access and modify the class state. Static Method cannot access or modify the class state. The class method takes the class as parameter to know about the state of that class. Static methods do not know about class state.

Can static methods Access Self Python?

They can't access the instance ( self ) but they have access to the class itself via cls . Static methods don't have access to cls or self . They work like regular functions but belong to the class's namespace.


2 Answers

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.

like image 72
Rijk Avatar answered Sep 21 '22 16:09

Rijk


You can achieve it by setting a temporary variable. Not the most elegant way but it works.

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');
}

I guess it's to do with the ambiguity of the ::, at least that what the error message is hinting at (PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM)

like image 41
fin1te Avatar answered Sep 20 '22 16:09

fin1te