任何人都可以帮助您将此代码称为OOP设计。如何在PHP中创建一个显示OOP设计的类。
在尝试将以下内容实现到我的项目中之前,我正在尝试创建一个简单的示例类,我想知道是否有我可以/应该改进的地方。如果有人给我一些有关我现在的情况的信息,我将感到非常高兴。
这是对关联数组列进行排序的简单类。任何人都可以编写有关排序关联数组的简单类。可以遵循OOP设计模式进行任何操作。
预先感谢您的帮助。
<?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;
答案 0 :(得分:4)
您提供的代码违反了一些有关OOP的规则,因此不能视为这样。
它是为了创建程序而相互交互的对象的表示,而不是互相调用的脚本(希望这样做很有意义)。 您必须开始思考如何将问题表达为对象。
假设您有一辆用PHP表示的汽车。
您将开始认为自己可以拥有:
Car Class
并从Vehicle
扩展它; Vehicle
都有轮胎,但您没有指定要为每个type
决定的轮胎,而不是“抽象”的父类。以此类推。您很快就会在这里看到要解决此问题(而且我们从一开始);
当您要转向OOP时,需要考虑一些规则:
您希望限制Class对象仅了解“它们是什么”。因此,汽车不具备自行车的逻辑,反之亦然。
1。封装->这样可以防止外部代码操纵或“关注”内部目标类上发生的事情;
它是指使用私有和受保护的方法; Car类的行为方式以及它以何种逻辑触发工作,无论您决定Car应该如何工作,对于诸如Bike之类的其他类都是完全隐藏的。他们不需要知道彼此之间有什么点击!
2。多态性->例如,轮胎的数量,甚至每辆车的轮胎类型,都会有所不同。因此,您可以声明Vehicle
可以addTyres
但每种Vehicle
类型(例如Car
和Bike
)将实现如何addTyres
不同(可以限制自行车只有2个轮胎,而汽车只有4个);
3。打开/关闭实现->创建类时,您应该考虑一下它们,因为扩展应为 OPEN ,而扩展应为 CLOSED 。这意味着您可以扩展其行为,但不必回头更改对象行为;
4。继承->允许您的类实现“层次结构”。可以将其视为“父母”和“孩子”。什么是“第一”,什么是“后”。像形状一样,是 Circle 的父级。如果您宣布自己的论点,则形状是非常抽象的,因为它代表了正方形,三角形,圆圈等但是,如果您指的是 Square (平方),您会更详细地了解它,例如顶点,角度等!形状表示什么,但没有对哪种类型,对什么结构应该是什么进行精炼,而不是对“它将如何做”进行精炼;
5。打开递归->类之间可以相互调用,甚至可以相互调用。他们就是这样互动的。他们甚至可以将其他对象作为其属性的一部分;
在非常恢复的资料中,这是对OOP的简短介绍! 一旦掌握了它,那就太神奇了,您将拥有如此强大的逻辑代码,如此井井有条,我向您发誓,您不会回头:3
但是,是的,这还不足以开始告诉您OOP! :x只是这样想,这是散步,而不是目的地:D
PS:一种开始习惯OOP的好方法也是开始研究设计模式