Something is wrong with the code in this class. I went over missing brackets and such but I can't find out the problem. The weird thing is, it runs fine locally, only when pushed onto the production server, it crashes (which makes it awkward to fix too).
It crashes on the very first line of the class declaration public ?string $header;
It says 'syntax error, unexpected '?' (T_STRING), expecting function (T_FUNCTION) or const (T_CONST)'
<?php
namespace App\Http\Navigation;
use App\Models\Category;
use App\Models\Genus;
use App\Models\Quarter;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use phpDocumentor\Reflection\Types\This;
 /*
|--------------------------------------------------------------------------
| Sidebar Class
|--------------------------------------------------------------------------
|
| Construct and load the Sidebar object as part of the view in the 
| view controller to be processed by an included navigation/sidebar.blade
|
*/
/** @package App\Http\Navigation */
class Sidebar
{
    public ?string $header;  <- IT CRASHES HERE
    public ?array  $menu_array;
    public ?string $route_prefix;
    public ?object $categories;
    public ?string $section;
    public ?string $translation_type;
    public ?object $owner;
    public function __construct($view)
    {   
        $this->section = $view->section;
        $this->resource = $resource ?? null;
        $this->owner = owner() ?? User::first();
    }
// =========================================================================
// PUBLIC STATIC FUNCTIONS
// =========================================================================
    /** Create a Sidebar object and load all necessary data
     *
     * @param  object $view
     * @return object
     */
    public static function construct($view)
    {
        // dd('Sidebar@create() view', $view);
        if (!self::checkHasSidebar($view)) {
            return null;
        }
        $sidebar = new Sidebar($view);
        $sidebar->loadActiveMenus($view);
        $sidebar->loadMenuArray($view);
        // dd('Sidebar@construct() return', $sidebar);
        return $sidebar;
    }
// =========================================================================
// PRIVATE FUNCTIONS
// =========================================================================
    public function loadActiveMenus($view)
    {
        if (isset($view->selection) && is_object($view->selection)) {
            switch ($view->selection->resource_name) {
                case 'categories':
                    if ($view->selection->tier == 1) {
                        $this->active_top_menu = $view->selection->name;
                    } elseif ($view->selection->tier == 2) {
                        $this->active_menu = $view->selection->name;
                        $this->active_top_menu = $view->selection->parent->name;
                    } else {
                        $this->active_item = $view->selection->name;
                        $this->active_menu = $view->selection->parent->name;
                        $this->active_top_menu = $view->selection->parent->parent->name;
                    }
                    break;
    
                case 'genera':
                    $this->active_menu = $view->selection->slug;
                    $this->active_top_menu = $view->selection->subfamily->slug;
                    break;
    
                case 'quarters':
                    $this->active_menu = $view->selection->code;
                    $this->active_top_menu = $view->selection->year;
                    break;
            }
        }
    }
    /** Get the data for the sidebar menus based on the given view
     * 
     * @param object $view
     * @return string // returns updated resource key
     */
    private function loadMenuArray($view)
    {
        // dd('Sidebar@loadMenuArray, parameters', $view);
        switch ($view->section) {
            
            // BACKOFFICE
            case 'backoffice':
                switch ($view->resource_name) {
                    // ACTIVE/QUARTERS
                    case 'orders':
                    case 'payments':
                    case 'purchases':
                    case 'shipments':
                        $menu_array = $this->generateMenuArrayBackofficeQuarters($view, $view->resource_name);
                        $this->translation_type = 'language_files';
                        break;
                    // CATEGORIES
                    case 'items':
                    case 'products':
                    case 'suppliers':
                        $menu_array = $this->generateMenuArrayBackofficeCategories($view, $view->resource_name);
                        $this->translation_type = 'translations';
                        break;
                }
                break;
            // WEBSTORE
            case 'webstore':
                $menu_array = $this->generateMenuArrayWebstore($view);
                $this->translation_type = 'translations';
                break;
        }
        // dd('Sidebar@loadMenuArray return', $menu_array, $this, $view);
        return $this->menu_array = $menu_array;
    }
// =========================================================================
// MENU ARRAY FUNCTIONS
// =========================================================================
      
    /** Generate menu array for backoffice resources using Categories
     *
     * @param object $view
     * @param string $resource_name
     * @return array
     */
    private function generateMenuArrayBackofficeCategories($view, $resource_name)
    {
        $sidebar_categories = Category::where('type', $resource_name)->where('tier', 1)->orderBy('sorting_order')->with(['children'])->get();
        // Year topmenu
        foreach ($sidebar_categories as $category) {
            $menu_array[$category->name]['translated-label'] = text($category, 'name');
            if ($category->children->count() > 0) {
                foreach ($category->children->sortBy('name') as $child_category) {
                    $menu_array[$category->name]['menus'][$child_category->name] = [
                        'translated-label' => text($child_category, 'name'),
                        'url' => self::getIndexRouteUsingSelectedResource($view->section, $resource_name, $child_category->name)];
                }
            } else {
                $menu_array[$category->name]['url'] = self::getIndexRouteUsingSelectedResource($view->section, $resource_name, $category->name);
            } 
        }
        $menu_array['uncategorized'] = [
            'url' => self::getIndexRouteUsingSelectedResource($view->section, $resource_name, 'uncategorized'),
        ];
        return $menu_array;
    }  
    /** Generate menu array for backoffice resources using Quarters
     *
     * @param object $view
     * @param string $resource_name
     * @return array
     */
    private function generateMenuArrayBackofficeQuarters($view, $resource_name)
    {
        // dd('Sidebar@generateMenuArrayBackofficeQuarters view', $view, $resource_name);
        
        // $this->header = $resource_name;
        // Active and recent
        $menu_array = [
            'active'  => ['url' => self::getIndexRouteUsingSelectedResource('backoffice', $resource_name, 'active', 'selection')],
            'recent'  => ['url' => self::getIndexRouteUsingSelectedResource('backoffice', $resource_name, 'recent', 'selection')],
        ];
        $sidebar_years = DB::table('quarters')->distinct('year')->orderBy('year', 'desc')->pluck('year');
        $quarters = self::getSelectionsUsingResourceName('quarters');
        foreach ($sidebar_years as $year) {
            foreach ($quarters->where('year', $year) as $quarter) {
                if ($quarter->{'has_' . $resource_name}) {
                    $menu_array[$year]['menus'][substr($quarter->key, 4 ,2)] = [
                        'url' => self::getIndexRouteUsingSelectedResource($view->section, $resource_name, $quarter->name, 'quarter'),
                    ];
                } else {
                    $menu_array[$year]['menus'][substr($quarter->key, 4 ,2)] = ['is_disabled' => true];
                }
            }
        }
        // dd('Sidebar@generateMenuArrayBackofficeQuarters(), return', $menu_array);
        return $menu_array;
    }  
    /** Generate the menu array for the webstore
     *
     * @param object $view
     * @return array
     */
    private function generateMenuArrayWebstore($view)
    {
        // dd('Sidebar@generateMenuArrayWebstore view', $view, $this);
        $menu_array = [];
        // Show all ants item
        $menu_array['ants']['menus']['all_available_species'] = ['url' => route('webstore.species.index')];
        // Product Categories topmenus
        foreach (Category::where('type', 'products')->where('tier', 1)->orderBy('sorting_order')->get() as $category) {
            foreach ($category->children->sortBy('sorting_order') as $child_category) {
                if($child_category->has_available_products) {
                    $menu_array[$category->name]['menus'][$child_category->name] = [
                        'translated-label' => text($child_category, 'name'),
                        'url' => self::getIndexRouteUsingSelectedResource('webstore', 'products', $child_category->name)
                    ];
                }
            }
        }
        
        // Ants- Genera menu
        foreach (Genus::WhereHasPublicSpeciesPrice()->get() as $genus) {
            if ($genus->is_visible_in_sidebar) {
                $menu_array['ants']['menus']['genera']['menus'][$genus->name] = [
                    'url' => self::getIndexRouteUsingSelectedResource('webstore', 'species', $genus->name, 'genus')
                ];
            }
        }
        // Ants - Species Categories menus
        foreach (config('navigation.species_types') as $type) {
            foreach (Category::getWithType($type)->sortBy('sorting_order') as $category) {
                if ($category->has_available_colonies) {
                    $menu_array['ants']['menus'][$type]['menus'][$category->name] = [
                        'translated-label' => text($category, 'name'),
                        'url' => self::getIndexRouteUsingSelectedResource('webstore', 'species', $category->name)
                    ];
                        // self::getIndexRouteUsingSelectedResource('webstore', 'species', $category->name);
                }
            }
        }
        // dd('Sidebar@generateMenuArrayWebstore(), return', $menu_array);
        return $menu_array;
    }
// =========================================================================
// PRIVATE STATIC FUNCTIONS
// =========================================================================
    /** Check if the current view has a sidebar associated with it
     * 
     * @param object $view
     * @return string // returns updated resource key
     */
    private static function checkHasSidebar($view)
    {
        switch ($view->section) {
            
            // BACKOFFICE
            case 'backoffice':
                switch ($view->resource_name) {
                    case 'items':
                    case 'orders':
                    case 'payments':
                    case 'products':
                    case 'purchases':
                    case 'shipments':
                    case 'suppliers':
                        return true;
                        break;
                    default:
                        return false;
                        break;
                }
            // WEBSTORE
            case 'webstore':
                return true;;
                break;
            default:
                return false;
                break;
        }
    }
    
    /** Return a collection of the resources by the given resource name
     *
     * @param  string $resource_name
     * @return object  
     */
    private static function getSelectionsUsingResourceName($resource_name)
    {
        switch ($resource_name) {
            case 'quarters':
                    return Quarter::all()->sortByDesc('name');
                break;
        }
    }
    
    /** Return the url for the given resource
     *
     * @param  string $section
     * @param  string $resource_name
     * @param  string $selection_name
     * @param  string|'categories' $selection_resource_name
     * @return string
     */
    private static function getIndexRouteUsingSelectedResource($section, $resource_name, $selection_name, $selection_resource_name = 'category')
    {
        // dd('Sidebar::getIndexRouteUsingSelectedResource', $section, $resource_name, $selection_name, $selection_resource_name);
        // Don't pass the owner as parameter if the route is inside the webstore
        if ($section == 'webstore') {
            $parameters = [$selection_resource_name => $selection_name];
        } else {
            $parameters = ['owner' => owner()->slug, $selection_resource_name => $selection_name];
        }
        return route($section . '.' . $resource_name . '.index', $parameters);
    }
}
 
     
    