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

14

我正在尝试从另一个具有相同命名空间的类中使用变量来调用一个命名空间类的静态方法:

<?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个回答

27

在使用变量引用类时,您需要使用完全限定名称。尝试这样做...

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

2

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

为了更全面地了解,我澄清一下,在访问静态方法或属性时,如果不在全局命名空间中,则需要使用完全限定名称

当访问动态方法或属性(即实例的属性)时,如果没有限定名称,则PHP会自动查找当前命名空间内的属性。

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

(在我撰写本文时,适用于PHP 7.2.0)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接