如何用PHP编写OOP

时间:2018-12-19 13:17:05

标签: php

任何人都可以帮助您将此代码称为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;

1 个答案:

答案 0 :(得分:4)

您提供的代码违反了一些有关OOP的规则,因此不能视为这样。

它是为了创建程序而相互交互的对象的表示,而不是互相调用的脚本(希望这样做很有意义)。 您必须开始思考如何将问题表达为对象。

假设您有一辆用PHP表示的汽车。

您将开始认为自己可以拥有:

  1. 汽车课;
  2. 车轮类(您的汽车可以有四个车轮);
  3. 然后您认为“但是汽车是车辆,例如,一辆自行车只有两个车轮”,然后创建“车辆类”;
  4. 然后您增强Car Class并从Vehicle扩展它;
  5. 现在,每个Vehicle都有轮胎,但您没有指定要为每个type决定的轮胎,而不是“抽象”的父类。

以此类推。您很快就会在这里看到要解决此问题(而且我们从一开始);

  1. 抽象类车辆;
  2. 汽车类(扩展车辆);
  3. 自行车课(扩展车辆);
  4. 车轮类别(可以添加到“车辆类型->您的汽车和自行车”中);

当您要转向OOP时,需要考虑一些规则:

  1. 封装;
  2. 多态;
  3. 打开/关闭实施;
  4. 继承;
  5. 打开递归;

您希望限制Class对象仅了解“它们是什么”。因此,汽车不具备自行车的逻辑,反之亦然。

1。封装->这样可以防止外部代码操纵或“关注”内部目标类上发生的事情;

它是指使用私有受保护的方法; Car类的行为方式以及它以何种逻辑触发工作,无论您决定Car应该如何工作,对于诸如Bike之类的其他类都是完全隐藏的。他们不需要知道彼此之间有什么点击!

2。多态性->例如,轮胎的数量,甚至每辆车的轮胎类型,都会有所不同。因此,您可以声明Vehicle可以addTyres但每种Vehicle类型(例如CarBike)将实现如何addTyres不同(可以限制自行车只有2个轮胎,而汽车只有4个);

3。打开/关闭实现->创建类时,您应该考虑一下它们,因为扩展应为 OPEN ,而扩展应为 CLOSED 。这意味着您可以扩展其行为,但不必回头更改对象行为;

4。继承->允许您的类实现“层次结构”。可以将其视为“父母”和“孩子”。什么是“第一”,什么是“后”。像形状一样,是 Circle 的父级。如果您宣布自己的论点,则形状是非常抽象的,因为它代表了正方形三角形圆圈等但是,如果您指的是 Square (平方),您会更详细地了解它,例如顶点,角度等!形状表示什么,但没有对哪种类型,对什么结构应该是什么进行精炼,而不是对“它将如何做”进行精炼;

5。打开递归->类之间可以相互调用,甚至可以相互调用。他们就是这样互动的。他们甚至可以将其他对象作为其属性的一部分;

在非常恢复的资料中,这是对OOP的简短介绍! 一旦掌握了它,那就太神奇了,您将拥有如此强大的逻辑代码,如此井井有条,我向您发誓,您不会回头:3

但是,是的,这还不足以开始告诉您OOP! :x只是这样想,这是散步,而不是目的地:D

PS:一种开始习惯OOP的好方法也是开始研究设计模式