Как написать ООП в переполнении стека

Кто-нибудь может помочь, этот код можно назвать ООП дизайн. Как создать класс в 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;

-1

Решение

Предоставленный вами код нарушает несколько правил для ООП, поэтому не может рассматриваться как таковой.

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

Допустим, у вас есть машина для представления в PHP.

Вы начнете думать, что можете иметь:

  1. Класс автомобиля;
  2. Класс Wheel (у вашей машины может быть 4 колеса);
  3. Затем вы думаете: «Но автомобиль — это транспортное средство, и, например, у велосипеда только два колеса», и затем вы создаете свой «Класс транспортного средства»;
  4. Тогда вы улучшите свой Car Class и расширить его от Vehicle;
  5. Теперь каждый Vehicle есть шины, но вы не указываете сколько, то есть для каждого type решать, а не родительский класс, который «абстрагирует их».

И так далее. Вы быстро видите здесь, что для решения этой проблемы (и мы находимся в самом начале) у вас уже есть;

  1. Автомобиль абстрактного класса;
  2. Класс автомобиля (который расширяет Автомобиль);
  3. Велосипедный класс (который расширяет автомобиль);
  4. Класс Колеса (который может быть добавлен к Типам транспортных средств -> Ваш Автомобиль и Ваш Велосипед);

Если вы хотите перейти к ООП, вам нужно учесть несколько правил:

  1. Инкапсуляция;
  2. Полиморфизм;
  3. Открыть / Закрыть реализацию;
  4. Наследование;
  5. Открытая рекурсия;

Вы хотите ограничить ваши объекты класса, чтобы они понимали только то, что они есть. Таким образом, автомобиль не содержит логику для велосипеда и наоборот.

1. Инкапсуляция -> Это не позволяет внешнему коду манипулировать или «беспокоиться» о том, что происходит внутри целевого класса;

Это относится к использованию частный а также защищенный методы;
Как ведет себя класс Car и что он запускает в любой логике, которую, по вашему мнению, должен работать Car, полностью скрыто для других классов, таких как Bike. Им не нужно знать, что нажимает друг на друга!

2. Полиморфизм -> Например, количество шин или даже типы шин для каждого транспортного средства, оно будет отличаться. Поэтому вы можете объявить Vehicle Можно addTyres НО каждый Vehicle тип (как Car а также Bike) будет реализовывать как addTyres иначе (Вы можете ограничить велосипеды только двумя шинами, в то время как автомобили имеют 4);

3. Открыть / Закрыть реализацию -> Когда вы создаете классы, вы должны думать о них так, как они должны быть ОТКРЫТЬ для продления НО ЗАКРЫТО для модификации. Это означает, что вы можете расширить их поведение, НО вам никогда не придется возвращаться и изменять поведение вашего объекта;

4. Наследование -> Позволяет вашим классам реализовать «иерархию». Думайте об этом как «родитель» и «дети». Что пришло «первым» и что пришло «после». Как форма является родителем Круг. Если вы объявите свой аргумент, форма очень абстрактно, так как представляет что-либо из Квадраты, треугольники, круги, и т.д. Но если вы ссылаетесь на Площадь Вы знаете об этом более подробно, например, вершины, углы и т. д.! Формы представляют это, но ничего не уточняют по отношению к какому типу, просто какой должна быть структура, а не «как она будет»;

5. Открытая рекурсия -> Классы могут вызывать друг друга и даже другие классы. Вот как они взаимодействуют. Черт, они могут даже иметь другие объекты как часть своих атрибутов;

В очень возобновленном источнике это очень краткое введение в ООП!
Как только вы это освоите, это будет удивительно, и у вас будет такой мощный логический код, и он настолько организован, клянусь вам, вы не вернетесь: 3

Но да, этого недостаточно, чтобы даже начать рассказывать вам ООП! : x Просто подумай об этом, это прогулка, а не пункт назначения: D

PS: отличный способ начать привыкать к ООП также начинает смотреть на Шаблоны проектирования

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector