Разбор данных планера из файлов IGC

Мне нужно написать программу на PHP, которая читает Файлы IGC нравиться этот файл IGC и получает записи о планере.

А пока я придумал что-то вроде этого:

<?php

        class Pilot {
            public $name;
            public $gliderType;
            public $competitionId;
            public $gpsDatuml;
            public $competitionClass;
            public $startPoint;
            public $endPoint;
        }
        $pilot = new Pilot();
        $myFile = new SplFileObject("https://xcportal.pl/sites/default/files/tracks/2020-06-09/069daro396091568.igc", 'r', 10);
        for($i=0; $i < 10; $i++) {
            $information =  $myFile->fgets();
            if(($pos = strpos($information, "PILOT")) !== FALSE){
                $pilot->name = substr($information, $pos+7);
            }
            if(($pos = strpos($information, "GLIDERTYPE")) !== FALSE){
                $pilot->gliderType = substr($information, $pos+12);
            }
            if(($pos = strpos($information, "COMPETITIONID")) !== FALSE){
                $pilot->competitionId = substr($information, $pos+15);
            }
            if(($pos = strpos($information, "GPSDATUM")) !== FALSE){
                $pilot->gpsDatuml = substr($information, $pos+10);
            }
            if(($pos = strpos($information, "CLASS")) !== FALSE){
                $pilot->competitionClass = substr($information, $pos+7);
            }
            // echo strpbrk($information, "PILOT");
            // echo substr($information, 10);
        }
        echo $pilot->name;
        echo $pilot->gliderType;
        echo $pilot->competitionId;
        echo $pilot->gpsDatuml;
        echo $pilot->competitionClass;
    
        $myFile = null;
    ?>

но мне интересно, есть ли способ сделать это лучше, если я не могу сейчас встать.

Также хорошей практикой является сохранение свойств класса как частного поля, или я могу оставить их общедоступными, если какой-либо другой класс не использует это свойство?

1 ответ
1

но мне интересно, есть ли способ сделать это лучше, если я не могу сейчас встать.

PHP для каждого и классифицировать() может использоваться для замены на for петля:

foreach(range(0, 9) as $i) {

Таким образом, код не нужно вручную увеличивать $i.

Сначала я подумал, что можно использовать ReflactionClass::getProperties() для перечисления свойств для перебора и использования заглавных букв в именах для передачи в strpos(), но некоторые свойства не совпадают равномерно — например, name, gpsDatum. Можно объявить массив сопоставления имен свойств строкам для поиска или использовать регулярные выражения.

Вы рассматривали возможность использования file_get_contents()? Это может потребовать использования дополнительной памяти, так как это приведет к чтению всего содержимого файла в память, но будет означать вызов fgets() можно было снять с петли.

Также является ли хорошей практикой сохранять свойства класса как частное поле, или я могу оставить их как общедоступные, если какой-либо другой класс не использует это свойство?

Это субъективный вопрос. Некоторые утверждают, что «вы всегда стремитесь как можно больше скрыть от клиентского кода, но также и от подклассов.« но вы можете не согласиться с этим, так что решать вам.

Вы можете сделать общедоступные методы в классе Pilot — например, один для синтаксического анализа и один для получения свойств — например, все свойства в массиве или один метод получения для каждого свойства.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *