PHP静态方法调用变量类名和命名空间

时间:2014-01-12 15:34:05

标签: php namespaces static-methods

我正在尝试从具有相同名称空间的另一个类调用名称空间类的静态方法。但另一个类的名称包含在变量中:

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

以下是Book类:

<?php

namespace MyApp\Api;
use \Eloquent;

class Book extends Eloquent {

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

}

我的类型变量在此处包含有效的类名Book。此类位于同一文件夹中,并使用相同的命名空间。 此代码返回错误Class 'Book' not found。 我尝试了几种变体(来自我发现的SO问题)使用反斜杠或call_user_func函数,但没有任何效果。 谁知道什么是错的?

2 个答案:

答案 0 :(得分:15)

使用变量引用您的类时,您需要使用完全限定名称。试试这个......

$type = __NAMESPACE__ . '\\' . $product->type;
$product = $type::find($product->id);

答案 1 :(得分:1)

@Phil指出了正确的解决方案。

为了更完整的观点,我澄清了在全局命名空间中访问静态方法或属性时,完全限定名称是必需的。

当访问动态方法或属性(我的意思是实例的属性)没有限定名称时,PHP会自动在当前命名空间中查找属性。

在我看来,这种不对称性没有用,因为调用外部命名空间属性的机会对于静态或动态属性都是相同的。

(在我写作的那一刻,在PHP 7.2.0上有效)。