当父类中存在属性时,Laravel 出现未定义属性错误

另外两个类似的问题要求属性不能是私有的(类继承中的未定义属性?)和对父构造函数的调用(从父类访问属性时未定义属性),这些不是我的情况的问题。

我有一个继承的类,它是 Object 实例,但我正在调用一个由父级提供的函数,该函数访问它自己的受保护属性。
在一个对象中,代码实际上有效,除非我进行单独的函数调用(请参见下面的代码),在这种情况下我会收到此错误,在另一个类中,即使没有额外的行来强制出现问题,我也会在运行时收到错误(sendExport()错误嵌入到返回的 Excel 中,该 Excel 已损坏)。

我看不到我的子类之间有任何区别,所以我不知道为什么行为不同,即使其中一个可以满足我的需要,但它可能生成错误的事实让我感到紧张,因此任何有关可能的问题/修复的指示会很好。

错误是:

Undefined property: App\Helpers\Exports\StudyExport::$spreadsheet at ExcelReport.php:20Line 20 is: if($this->spreadsheet instanceof Spreadsheet){

这是父类 ExcelReport.php,这sendExport()是要查看的函数,它调用getExcel(),您会注意到不需要调用构造函数:

<?php

namespace App\Helpers;


use PhpOffice\PhpSpreadsheet\Spreadsheet;

use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

use Illuminate\Support\Facades\Auth;


class ExcelReport 

{

    protected $cellRow=0;

    protected $count=0;

    protected $excelSec=1/24/60/60;

    protected $spreadsheet=null;


    public function checkExcel(){

        return $this->spreadsheet instanceof Spreadsheet;

    }


    public function getExcel($tab=0){

        if($this->spreadsheet instanceof Spreadsheet){

            if($tab>=$this->spreadsheet->getSheetCount()) $tab=0;

            $this->spreadsheet->setActiveSheetIndex($tab);

            $writer=new Xlsx($this->spreadsheet);

            ob_start();

            $writer->save('php://output');

            $this->spreadsheet->disconnectWorksheets();

            unset($this->spreadsheet);

            return ob_get_contents();

        }else{

            return $this->spreadsheet;

        }

    }


    public function sendExport($title,$tab=0){

        $filename=$this->filename($title,Auth::user()->dateFormat()).'.xlsx';

    

        // This line is not actually needed, without it, the code works (in one child but not in 

        // another), with it the call to getExcel() gives the error

        $this->getExcel($tab);

        // /////


守着星空守着你
浏览 119回答 1
1回答

慕婉清6462132

问题是这一行:&nbsp;&nbsp;&nbsp;&nbsp;unset($this->spreadsheet);这应该是:&nbsp;&nbsp;&nbsp;&nbsp;$this->spreadsheet&nbsp;=&nbsp;null;这并不能解决我所有的问题,但现在给了我一致的行为。我的新 Child 类仍然给我一个损坏的 Excel 文件,但这可能是由于该子类的代码中存在一些问题,因为它现在始终适用于所有其他类。
打开App,查看更多内容
随时随地看视频慕课网APP