Помогите разобраться с ошибкой Call to a member function getActiveSheet() on null

120
15 января 2020, 17:00

Возможно вопрос глупый, но, видимо глаз уже замылился и не вижу очевидного. При работе с классом возникла такая ошибка: Uncaught Error: Call to a member function getActiveSheet() on null in C:\OSPanel\domains\projectOKK\includes\tablehandler.inc.php:320

Вот сам код tablehandler:

class TableHandler extends Dbh {
public function exportSupport($from){
$operator = mysqli_real_escape_string($this->connect(), $from);
         $objPHPExcel = new PHPExcel();// Создаем объект класса PHPExcel
            $objPHPExcel->setActiveSheetIndex(0);// Устанавливаем индекс активного листа
            $sheet = $objPHPExcel->getActiveSheet();// Получаем активный лист
            $sheet->setTitle(''.$operator.''); // Подписываем лист
//Функция для покраски ячеек со строки 320
        function cellColor($cells,$color){
            global $objPHPExcel;
            $objPHPExcel->getActiveSheet()->getStyle($cells)->getFill()->applyFromArray(array(
                'type' => PHPExcel_Style_Fill::FILL_SOLID,
                'startcolor' => array(
                    'rgb' => $color
                )
            ));
        }
        cellColor('A2', 'c6d6b0');
    }
    }

Возможно какая-то ошибка в области видимости, но я уже не знаю, что делать) Помогите пожалуйста.

Answer 1

Как и первый ответ, есть еще способ более простой, чтобы Вам не переписывать структуру класса. Использовать анонимную функцию, передав ей необходимый объект в качестве замыкания тем самым избегая использование глобальных переменных. Пример:

$cellColor = function($cells,$color) use ($objPHPExcel){
    //Ваш код
}
$cellColor('A2', 'c6d6b0');
Answer 2

Метод cellColor() не видит переменную $objPHPExcel в локальной и глобальной областей видимости.

Можно решить проблему так: в метод exportSupport() добавить global $objPHPExcel;.

Но я противник "замусоривания" глобальной области и предлагаю в методе exportSupport() значение переменной $objPHPExcel присвоить свойству объекта и его уже использовать в методе cellColor():

class TableHandler extends Dbh {
    private objPHPExcel;
    public function exportSupport($from)
    {
        ...
        $this->objPHPExcel = $objPHPExcel;
    {
    public function cellColor($cells,$color)
    {
        $this->objPHPExcel->getActiveSheet()-> ...
    }  
}

После исправления проблемы с областью видимости $objPHPExcel у вас может возникнуть еще одна проблема:

Метод cellColor() "завязан" на уже проинициализированный объект св-ва objPHPExcel и должен вызываться ПОСЛЕ метода exportSupport(). Это, так называемое, связывание(coupling) решается перепроектированием объекта, но это не предмет вашего вопроса.

READ ALSO
Как записать данные в определенный блок в другом файле?

Как записать данные в определенный блок в другом файле?

Для записи данных в другой файл использую следующий код:

140
Постинг сообщений VK картинка + ссылка

Постинг сообщений VK картинка + ссылка

Доброй ночиНаписал постер сообщений в свою группу ВК, но появилась проблема

135
Как получить xpub key для создания bitcoin hd-wallet

Как получить xpub key для создания bitcoin hd-wallet

Как средствами PHP получить extended public key, необходимый для создания hd bitcoin кошелька?

156
Редирект на конце со /

Редирект на конце со /

есть два контекста, в web лежит основной каталог, в catalog лежит старые товары(вынес для удобства администрирования) если в конце адресной строки...

146