【问题标题】:Set a class dynamically from child class从子类动态设置类
【发布时间】:2020-02-07 16:32:59
【问题描述】:

我正在尝试使用一些希望可重用的代码在 PHP 中动态运行不同的类,但我无法找到正确的方法。

目前,我正在运行一个 POST 请求,数据流如下:

Route::post('/user/create', 'UserController@createItem');

到用户控制器:


namespace App\Http\Controllers;

use Illuminate\Cache\Repository;
use App\Models\User;

class UserController extends AbstractController{
    const className = 'User';
}

和抽象控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use GuzzleHttp\Exception\RequestException;
use App\Models\User;

class AbstractController extends Controller
{

    public function createItem() {
        $inputJSON = file_get_contents('php://input');
        $this->className::buildItem($inputJSON);
        return;
    }
}

理想情况下应该调用一个名为buildItem()的静态方法

当我通过将User 硬编码到 AbstractController 中进行测试时,它按预期工作,但是当我尝试这样做时,PostMan 中出现错误:

ErrorException: Undefined property: App\Http\Controllers\UserController::$className in file .../app/Http/Controllers/AbstractController.php on line 14

我尝试了几种不同的方式声明和引用className,但似乎无法使其正常工作。任何帮助表示赞赏!

【问题讨论】:

  • 这能回答你的问题吗? Dynamic static method call in PHP? 注意:更喜欢this solution(除非您使用的是非常旧的 PHP 版本,但希望您不是)。
  • 另外,这不是您访问类常量的方式。在这种情况下,self::$className 就是您要查找的内容。
  • 尝试双倍美元$$this-&gt;className::buildItem($inputJSON);
  • 我正在查看您发布的链接。我认为self 仅显式适用于其调用的类(在本例中为 AbstractController,忽略 UserController)?
  • @ccarlson 哦,确实,我认为底层是扩展类,而不是相反。 static::$className 就是这样。见late static binding

标签: php laravel


【解决方案1】:

由于在实现中定义了className,您可以使用late static bindingstatic::className 访问它。

您还需要预先添加模型类的命名空间。

这就变成了:

class AbstractController extends Controller
{
  private const MODELS_NAMESPACE = 'App\\Models';

  public function createItem()
  {
    $inputJSON = file_get_contents('php://input');
    $className = self::MODELS_NAMESPACE . '\\' . static::className;
    $className::buildItem($inputJSON);
  }
}

演示:https://3v4l.org/Ng6bl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2019-12-11
    • 1970-01-01
    相关资源
    最近更新 更多