特殊常量:: class可以和变量一起使用吗?

时间:2019-06-28 07:33:28

标签: php class

常量:: class 可以用于变量吗? 例如$var::class,其中$var具有命名空间。

我尝试过:

  

$var::class-错误

     

${'$var::class'}-未定义变量:$ var :: class in

     

eval('$var::class')-解析错误:语法错误,意外结束   文件放在:eval()的代码上

我的php代码:-

<?php

namespace Engine\DataBase;


use Logs\Logger;
use Exception;

class DataBaseManager extends DataBaseRequester
{
    const CONTROLLERS = [
        "DataBaseUsersController"
    ];

    public function __construct()
    {
        parent::__construct();
    }

    public function complete(string $method, array $params)
    {
        foreach (self::CONTROLLERS as $CONTROLLER) {
            try {
                $class_name = 'Engine\DataBase\\' . $CONTROLLER;
                $method_availability = method_exists(eval('$class_name::class'), $method);
                if ($method_availability) {
                    if (!isset(${$CONTROLLER})) {
                        ${$CONTROLLER} = new $class_name($this);
                    }
                    return ${$CONTROLLER}->$method($params);
                } else throw new Exception("No class with " . $method . " method was found");
            } catch(Exception $e){
                Logger::Log($e->getMessage(), LOGGER::ERROR, "DataBaseManager");
                return false;
            }
        }
    }
}

我需要检查在没有初始化的情况下需要哪种动态(将来)类名称数组。 如果喜欢硬编码类,则当前代码有效

method_exists(DataBaseUsersController::class, $method);

1 个答案:

答案 0 :(得分:1)

所有::class所做的工作都是返回一个正确构造的,具有完全限定类名称的字符串,例如

namespace SomeNamespace {
    class SomeClass { }
}
namespace {
    $var = SomeNamespace\SomeClass::class;
    echo $var; // SomeNamespace\SomeClass
}

因此,您可以使用包含完全限定的类名的字符串,就像使用::class一样,因为结果相同。

使用::class的好处是它尊重您的use语句并根据它们解析完全限定的类名。