Мне нужно написать программу на 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 ответ
но мне интересно, есть ли способ сделать это лучше, если я не могу сейчас встать.
PHP для каждого и классифицировать() может использоваться для замены на for петля:
foreach(range(0, 9) as $i) {
Таким образом, код не нужно вручную увеличивать $i.
Сначала я подумал, что можно использовать ReflactionClass::getProperties() для перечисления свойств для перебора и использования заглавных букв в именах для передачи в strpos(), но некоторые свойства не совпадают равномерно — например, name, gpsDatum. Можно объявить массив сопоставления имен свойств строкам для поиска или использовать регулярные выражения.
Вы рассматривали возможность использования file_get_contents()? Это может потребовать использования дополнительной памяти, так как это приведет к чтению всего содержимого файла в память, но будет означать вызов fgets() можно было снять с петли.
Также является ли хорошей практикой сохранять свойства класса как частное поле, или я могу оставить их как общедоступные, если какой-либо другой класс не использует это свойство?
Это субъективный вопрос. Некоторые утверждают, что «вы всегда стремитесь как можно больше скрыть от клиентского кода, но также и от подклассов.« но вы можете не согласиться с этим, так что решать вам.
Вы можете сделать общедоступные методы в классе Pilot — например, один для синтаксического анализа и один для получения свойств — например, все свойства в массиве или один метод получения для каждого свойства.
