【发布时间】: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->className::buildItem($inputJSON); -
我正在查看您发布的链接。我认为
self仅显式适用于其调用的类(在本例中为 AbstractController,忽略 UserController)? -
@ccarlson 哦,确实,我认为底层是扩展类,而不是相反。
static::$className就是这样。见late static binding。