15

I'm trying to call a static method for a namespaced class from another class with the same namespace. But the other class' name is contained in a variable :

<?php 

namespace MyApp\Api;
use \Eloquent;

class Product extends Eloquent {

    public static function find($id)
    {
        //....
    }

    public static function details($id)
    {
        $product = self::find($id);
        if($product)
        {
            $type = $product->type; // 'Book'
            $product = $type::find($product->id);
            return $product;
        }
    }
}

Here is the Book class :

<?php

namespace MyApp\Api;
use \Eloquent;

class Book extends Eloquent {

    public static function find($id)
    {
        //....
    }

}

My type variable contains a valid class name here Book. This class is in the same folder, and uses the same namespace. This code returns the error Class 'Book' not found. I have tried several variations (from the SO questions I found) using backslashes, or the call_user_func function, but nothing worked. Anyone knows what's wrong ?

2 Answers 2

28

When using a variable to reference your class, you need to use a fully qualified name. Try this...

$type = __NAMESPACE__ . '\\' . $product->type;
$product = $type::find($product->id);
Sign up to request clarification or add additional context in comments.

Comments

3

@Phil pointed out the right solution.

For a more complete point of view, I clarify that the fully qualified name is necessary when accessing static methods or attributes, out of the global namespace.

When accessing dynamic methods or attributes (I mean properties of an instance) without qualifying the name, PHP automatically looks for the property inside the current namespace.

In my opinion this asymmetry is not useful, as the opportunity to invoke foreign namespace properties are equal either for static or dynamic properties.

(Valid on PHP 7.2.0 at the moment I am writing).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.