Кто-нибудь может помочь, этот код можно назвать ООП дизайн. Как создать класс в PHP, который показывает, что это ООП дизайн.
Я пытаюсь создать простой пример класса, прежде чем я начну внедрять следующее в свои проекты, и я хотел бы знать, есть ли что-то, что я мог бы / должен улучшить. Я буду очень рад, если кто-нибудь подскажет, как у меня сейчас дела.
Это простой класс, который сортирует столбцы ассоциативного массива. Кто-нибудь может написать простой класс относительно сортировки ассоциативного массива. Это может быть что угодно, просто следуйте шаблону проектирования ООП.
Заранее спасибо за помощь.
<?php
interface PassangerBoardingInterface
{
public function ArrageBoardingTicket(string $from, string $to, string $instruction) ;
public function GetEmbededHTMlTemplate ( $template, $regrex);
}
class PassengerBoardingSorterOOP implements PassangerBoardingInterface
{
// Boarding list
public $boardingList;
// Journey start message
public $startMessage;
// End message
public $endMessage;
// Get Template
public $getTemplate;
public function __construct(array $boardingList )
{
$this->boardingList = $boardingList;
}
public function ArrageBoardingTicket(string $from, string $to , string $instruction)
{
foreach($this->boardingList as $boardingList)
{
usort($this->boardingList, function ($a, $b) use ($to, $from){
return ($a[$to] === $b[$from] ) ? 0 : 1;
});
}
// Defining index
$i = 0;
$coutboarding = count($this->boardingList);
// Appending data to start index
$this->boardingList[0][$instruction] = $this->startMessage;
// Appending string to end column
$this->boardingList[$coutboarding - 1 ][$instruction] = $this->endMessage;
}
public function GetEmbededHTMlTemplate($template, $regrex)
{
$result = '';
/* Loop each data */
for($j = 0; $j < count($this->boardingList); $j++)
{
/* Get the template */
$output = $template;
/* where indexs matches in template */
foreach($this->boardingList[$j] as $key => $value)
{
$reg = str_replace('(.*?)',$key, $regrex);
/* Check with regular expression */
if(preg_match($reg,$template))
{
/* Replace with */
$output = preg_replace($reg,$value,$output);
}
}
$result .= $output;
}
$this->getTemplate = $result;
}
}
==============================
//My array of information
$cards = [
[
"from" => "Barcelona",
"to" => "New York",
"instruction" => "",
'time' => '2018-02-02 20:05',
'transport' => 'Flight' ,
'transportno' => 'B33',
'seatno' => 'Y15'
],
[
"from"=> "Barcelona",
"to" => "Gerona",
"instruction" => "",
'time' => '2018-02-02 20:05',
'transport' => 'Bus' ,
'transportno' => 'M31, M32, M33','seatno' => 'Any'
], // 1
[
"from" => "Madrid",
"to" => "Barcelona",
"instruction" => "",
'time' => '2018-02-02 20:05',
'transport' => 'Bus' ,
'transportno' => 'M31, M32, M33',
'seatno' => 'Any'
],
["from" => "New York",
"to" => "Stockholm",
"instruction" => "",
'time' => '2018-02-02 20:05', 'transport' => 'Flight' ,
'transportno' => 'M31, M32, M33','seatno' => 'Any'
], // 0
[
"from" => "Gerona",
"to" => "Barcelona",
"instruction" => "",
'time' => '2018-02-02 20:05',
'transport' => 'Bus' ,
'transportno' => 'M31, M32, M33',
'seatno' => 'Any'
], // 2
];
$obj = new PassengerBoardingSorterOOP($cards);
$obj->startMessage = 'Your journey start from here ';
// End message
$obj->endMessage = 'Your journey ends here';
$obj->ArrageBoardingTicket('from', 'to', 'instruction');
// Form a template so you can get template list
$template = '<li class="list-group-item">{{&instruction}}Take {{&transport}} From {{&from}} To {{&to}},
{{&transport}} No {{&transportno}}, {{&transport}} Departure Date {{&time}}. Seat Number {{&seatno}}.</li>';
$regrex = '/{{&(.*?)}}/';
$obj->GetEmbededHTMlTemplate($template, $regrex);
echo $obj->getTemplate;
Предоставленный вами код нарушает несколько правил для ООП, поэтому не может рассматриваться как таковой.
Это представление объектов, которые взаимодействуют друг с другом для создания вашей программы, а не сценарии, которые вызывают друг друга (надеюсь, это имеет смысл).
Вы должны начать думать, как вы можете представить свою проблему в виде объектов.
Допустим, у вас есть машина для представления в PHP.
Вы начнете думать, что можете иметь:
Car Class
и расширить его от Vehicle
;Vehicle
есть шины, но вы не указываете сколько, то есть для каждого type
решать, а не родительский класс, который «абстрагирует их».И так далее. Вы быстро видите здесь, что для решения этой проблемы (и мы находимся в самом начале) у вас уже есть;
Если вы хотите перейти к ООП, вам нужно учесть несколько правил:
Вы хотите ограничить ваши объекты класса, чтобы они понимали только то, что они есть. Таким образом, автомобиль не содержит логику для велосипеда и наоборот.
1. Инкапсуляция -> Это не позволяет внешнему коду манипулировать или «беспокоиться» о том, что происходит внутри целевого класса;
Это относится к использованию частный а также защищенный методы;
Как ведет себя класс Car и что он запускает в любой логике, которую, по вашему мнению, должен работать Car, полностью скрыто для других классов, таких как Bike. Им не нужно знать, что нажимает друг на друга!
2. Полиморфизм -> Например, количество шин или даже типы шин для каждого транспортного средства, оно будет отличаться. Поэтому вы можете объявить Vehicle
Можно addTyres
НО каждый Vehicle
тип (как Car
а также Bike
) будет реализовывать как addTyres
иначе (Вы можете ограничить велосипеды только двумя шинами, в то время как автомобили имеют 4);
3. Открыть / Закрыть реализацию -> Когда вы создаете классы, вы должны думать о них так, как они должны быть ОТКРЫТЬ для продления НО ЗАКРЫТО для модификации. Это означает, что вы можете расширить их поведение, НО вам никогда не придется возвращаться и изменять поведение вашего объекта;
4. Наследование -> Позволяет вашим классам реализовать «иерархию». Думайте об этом как «родитель» и «дети». Что пришло «первым» и что пришло «после». Как форма является родителем Круг. Если вы объявите свой аргумент, форма очень абстрактно, так как представляет что-либо из Квадраты, треугольники, круги, и т.д. Но если вы ссылаетесь на Площадь Вы знаете об этом более подробно, например, вершины, углы и т. д.! Формы представляют это, но ничего не уточняют по отношению к какому типу, просто какой должна быть структура, а не «как она будет»;
5. Открытая рекурсия -> Классы могут вызывать друг друга и даже другие классы. Вот как они взаимодействуют. Черт, они могут даже иметь другие объекты как часть своих атрибутов;
В очень возобновленном источнике это очень краткое введение в ООП!
Как только вы это освоите, это будет удивительно, и у вас будет такой мощный логический код, и он настолько организован, клянусь вам, вы не вернетесь: 3
Но да, этого недостаточно, чтобы даже начать рассказывать вам ООП! : x Просто подумай об этом, это прогулка, а не пункт назначения: D
PS: отличный способ начать привыкать к ООП также начинает смотреть на Шаблоны проектирования
Других решений пока нет …