Php 派生属性未从父构造函数初始化

Php 派生属性未从父构造函数初始化,php,laravel,oop,laravel-5,derived-class,Php,Laravel,Oop,Laravel 5,Derived Class,在我的通用控制器GeneralController中: use App\Http\Controllers\Controller; class GeneralController extends Controller { protected $onLine = null; public function __construct(Request $request) { $this->onLine = OnLine::domain($request-&g

在我的通用控制器GeneralController中:

use App\Http\Controllers\Controller;
class GeneralController extends Controller
{
    protected $onLine = null;

    public function __construct(Request $request)
    {
        $this->onLine = OnLine::domain($request->domain)->first();
    }
}
use App\Http\Controllers\OnLine\ItemController;
class ItemController extends GeneralController
{
    public function getItem(Request $request)
    {
        dd($this->onLine); // but returns null :(
    }
}
在我的另一个控制器中,扩展了GeneralController:

use App\Http\Controllers\Controller;
class GeneralController extends Controller
{
    protected $onLine = null;

    public function __construct(Request $request)
    {
        $this->onLine = OnLine::domain($request->domain)->first();
    }
}
use App\Http\Controllers\OnLine\ItemController;
class ItemController extends GeneralController
{
    public function getItem(Request $request)
    {
        dd($this->onLine); // but returns null :(
    }
}

我已经检查过了,
OnLine::domain($request->domain)->first()返回数据,它会这样做。

父构造函数将帮助您

class ItemController extends GeneralController
{
    public function __construct()
    {
         parent::__construct();
         ....
    }
}

我不知道你对
请求->域
有什么期望。这是一个输入还是您希望当前域

如果这是一个输入,那是正确的。如果您想要当前域,您应该使用
parse\u url($request->url(),PHP\u url\u HOST)


使用
->first()
(或
find()
)方法时,如果查询返回0结果,“first”的值将为null

class GeneralController extends Controller
{
    protected $onLine;

    public function __construct(Request $request)
    {
        $this->onLine = OnLine::domain($request->domain)->first();
    }
}
你的代码没有问题。我猜你忘了发送“域名”

为了便于调试,只需使用硬编码的值更改构造函数(而不是发送$request->domain,使用“OnLine”表中已有的任何值)

之后,检查$request中是否有任何值<代码>dd($request->all())
;如果这是一个空数组,则表示您忘记发送域


并确保使用
use-lighted\Http\Request

这是您的ItemController中的输入错误吗

use App\Http\Controllers\OnLine\ItemController;

它应该是GeneralController,对吗?

因为`OnLine::domain($request->domain)->first();`ItemController文件中是否为Null不应该使用App\Http\Controllers\OnLine\GeneralController而不是ItemController?或者它与您尝试扩展的类不同?对不起,我的英语不好(下一票:如果子类中省略了构造函数,则隐式调用父构造函数)。注意:如果子类定义构造函数,则不会隐式调用父构造函数。要运行父构造函数,请调用父构造函数::\u construct()在子构造函数中是必需的。“@PhilippMaurer我刚刚测试过,在Laravel controller中没有调用父构造函数。而且,看起来这对OP有效,所以我向上投票。也许你应该自己测试并删除向下投票?