>백엔드 개발 >PHP 튜토리얼 >객체 지향 그래프 계산기 사용

객체 지향 그래프 계산기 사용

WBOY
WBOY원래의
2016-08-08 09:22:431490검색

이 예는 실용적이지 않을 수도 있지만 기본적으로 객체지향의 세 가지 특성인 상속, 캡슐화, 다형성을 요약합니다. 이 예의 주요 기능은 다음과 같습니다.

  1. 사용자가 다양한 유형의 그래픽을 선택할 수 있습니다.
  2. 선택한 그래픽의 관련 속성을
  3. 입력합니다. 입력 속성은 모양의 둘레와 면적을 계산합니다.

효과는 다음과 같습니다.

아이디어:

    1. A부분은 index.php에 직접 작성하고 해당 그래픽을 클릭하면 해당 페이지로 $_GET["shape"]가 전송되며 자동 로딩 클래스가 사용됩니다.
    2. 파트 B는 가변 함수를 사용하고 $_GET["shape"] 값을 사용하여 다양한 그래픽에 대한 양식의 입력 부분을 결정하는 다양한 함수를 호출하는 form.class.php에 의해 출력됩니다.
    3. 파트 C는 result.class.php에 의해 출력됩니다. 추상 클래스를 선언하고 사각형, 삼각형, 원의 추상 클래스에서 면적 및 둘레 계산 방법을 구현하고 상속, 캡슐화 및 다형성을 반영하고 new $_GET["shape"]()를 사용하여 해당 그래픽 개체를 인스턴스화합니다. 그런 다음 객체의 메서드를 호출하여 둘레와 면적을 반환합니다.

개선이 필요한 곳:

  1. 이 예시는 수업의 여러 기능을 보여주기 위한 것일 뿐이며 필터링을 하지 않습니다. 사용자 입력은 주입 공격을 유발할 수 있으며 실제 프로덕션 애플리케이션에는 적합하지 않습니다. 실제 응용 프로그램에서는 악의적인 공격을 방지하기 위해 사용자 입력을 필터링해야 합니다.
  2. DIV+CSS는 페이지 레이아웃 최적화에 사용되지 않으며 인터페이스도 그다지 친숙하지 않습니다. 레이아웃을 최적화하고 사용자 경험을 향상시킬 수 있습니다.

index.php 코드는 다음과 같습니다.

<span> 1</span> <html>
<span> 2</span> <head>
<span> 3</span>         <meta http-equiv="charset" c> 4</span> </head>
<span> 5</span> <body>
<span> 6</span>         <div>
<span> 7</span>         <h1>图形周长面积计算器</h1>
<span> 8</span>         <!--点击链接的时候使用GET传递图形的形状属性给index.php,也就是页面本身-->
<span> 9</span>         <a href="index.php?shape=rect">矩形</a>
<span>10</span>         <a href="index.php?shape=triangle">三角形</a>
<span>11</span>         <a href="index.php?shape=circle">圆形</a>
<span>12</span>         </div>
<span>13</span>         <div>
<span>14</span> <?<span>php
</span><span>15</span><span>/*</span><span>自动加载类</span><span>*/</span><span>16</span><span>function</span> __autoload(<span>$className</span><span>){
</span><span>17</span><span>include</span> (<span>strtolower</span>(<span>$className</span>).'.class.php'<span>);
</span><span>18</span><span>        }
</span><span>19</span><span>20</span><span>/*</span><span>21</span><span>        1.先new一个Form对象,发现没有form类的定义,把类名Form传递到自动加载类的函数参数进行类的自动加载。
</span><span>22</span><span>        2.echo一个对象的引用,会调用该对象的__toString方法返回一个字符串,echo输出的就是对象返回的字符串,
</span><span>23</span><span>          这里输出一个表单等待用户的输入。
</span><span>24</span><span>*/</span><span>25</span><span>echo</span><span>new</span> Form("index.php"<span>);
</span><span>26</span><span>27</span><span>/*</span><span>如果用户点击了提交按钮,自动加载result类,输出结果</span><span>*/</span><span>28</span><span>if</span>(<span>isset</span>(<span>$_POST</span>["sub"<span>])){
</span><span>29</span><span>echo</span><span>new</span><span> result();
</span><span>30</span><span>        }
</span><span>31</span> ?>
<span>32</span>         </div>
<span>33</span> </body>
<span>34</span> </html>

form.class.php 코드는 다음과 같습니다.

<span> 1</span> <?<span>php
</span><span> 2</span><span>/*</span><span> 3</span><span>        project:面向对象版图形计算器
</span><span> 4</span><span>        file:form.class.php
</span><span> 5</span><span>        description:对不同的图形输出不同的表单
</span><span> 6</span><span>*/</span><span> 7</span><span>class</span><span> form{
</span><span> 8</span><span>private</span><span>$formAction</span>=<span>NULL</span>;       <span>//</span><span>保存响应表单的文件</span><span> 9</span><span>private</span><span>$shape</span>=<span>NULL</span>;            <span>//</span><span>保存图形的形状</span><span>10</span><span>11</span><span>/*</span><span>12</span><span>                @param string $action 对象初始化传入的参数,代表响应的页面的是哪一个文件
</span><span>13</span><span>*/</span><span>14</span><span>function</span> __construct(<span>$action</span> = ""<span>){
</span><span>15</span><span>$this</span>->formAction = <span>$action</span>;    <span>//</span><span>把传入的参数保存到$formAction中;</span><span>16</span><span>$this</span>->shape = <span>isset</span>(<span>$_GET</span>["shape"]) ? <span>$_GET</span>["shape"]:"rect";   <span>//</span><span>从表单传递的变量中获取图形类别,如没有传递,默认为矩形</span><span>17</span><span>                }
</span><span>18</span><span>function</span><span> __toString(){
</span><span>19</span><span>$form</span> = '<form action="'.<span>$this</span>->formAction.'?shape='.<span>$this</span>->shape.'" method="post">'<span>;
</span><span>20</span><span>//</span><span>下面两行使用变量函数调用对应图形的私有函数,返回input部分表单的字符串</span><span>21</span><span>$shape</span> = 'get'.<span>ucfirst</span>(<span>$this</span>-><span>shape);
</span><span>22</span><span>$form</span> .= <span>$this</span>-><span>$shape</span><span>();
</span><span>23</span><span>24</span><span>$form</span> .= '</br><input type="submit" name="sub" value="计算"/></br>'<span>;
</span><span>25</span><span>$form</span> .= '</form>'<span>;
</span><span>26</span><span>27</span><span>return</span><span>$form</span><span>;
</span><span>28</span><span>                }
</span><span>29</span><span>//</span><span>私有方法,返回矩形表单input部分的字符串;</span><span>30</span><span>private</span><span>function</span><span> getRect(){
</span><span>31</span><span>//</span><span>在表单提交后输入的内容继续显示,防止其消失</span><span>32</span><span>$formheight</span>=<span>isset</span>(<span>$_POST</span>['height']) ? <span>$_POST</span>['height'] : <span>NULL</span><span>;
</span><span>33</span><span>$formwidth</span>=<span>isset</span>(<span>$_POST</span>['width']) ? <span>$_POST</span>['width'] : <span>NULL</span><span>;
</span><span>34</span><span>$input</span> = '<p>请输入矩形的长和宽</p>'<span>;
</span><span>35</span><span>$input</span> .= '矩形的高度:<input type="text" name="height" value="'.<span>$formheight</span>.'"/><br></br>'<span>;
</span><span>36</span><span>$input</span> .= '矩形的宽度:<input type="text" name="width" value="'.<span>$formwidth</span>.'"/></br>'<span>;
</span><span>37</span><span>return</span><span>$input</span><span>;
</span><span>38</span><span>                }
</span><span>39</span><span>//</span><span>返回三角形输入表单input部分的字符串</span><span>40</span><span>private</span><span>function</span><span> getTriangle(){
</span><span>41</span><span>//</span><span>在表单提交后继续显示出来,防止其消失</span><span>42</span><span>$formside1</span>=<span>isset</span>(<span>$_POST</span>['side1']) ? <span>$_POST</span>['side1'] : <span>NULL</span><span>;
</span><span>43</span><span>$formside2</span>=<span>isset</span>(<span>$_POST</span>['side2']) ? <span>$_POST</span>['side2'] : <span>NULL</span><span>;
</span><span>44</span><span>$formside3</span>=<span>isset</span>(<span>$_POST</span>['side3']) ? <span>$_POST</span>['side3'] : <span>NULL</span><span>;
</span><span>45</span><span>$input</span> = '<p>请输入三角形的三边</p>'<span>;
</span><span>46</span><span>$input</span> .= '边长1:<input type="text" name="side1" value="'.<span>$formside1</span>.'" /></br></br>'<span>;
</span><span>47</span><span>$input</span> .= '边长2:<input type="text" name="side2" value="'.<span>$formside2</span>.'"/></br></br>'<span>;
</span><span>48</span><span>$input</span> .= '边长3:<input type="text" name="side3" value="'.<span>$formside3</span>.'"/></br>'<span>;
</span><span>49</span><span>return</span><span>$input</span><span>;
</span><span>50</span><span>                }
</span><span>51</span><span>//</span><span>返回圆形表单input部分的字符串</span><span>52</span><span>private</span><span>function</span><span> getCircle(){
</span><span>53</span><span>$formradius</span>=<span>isset</span>(<span>$_POST</span>['radius']) ? <span>$_POST</span>['radius'] : <span>NULL</span>;  <span>//</span><span>在输入表单提交后内容继续显示出来,防止其消失</span><span>54</span><span>$input</span> = '<p>请输入半径</p>'<span>;
</span><span>55</span><span>$input</span> .= '半径:<input type="text" name="radius" value="'.<span>$formradius</span>.'"/></br>'<span>;
</span><span>56</span><span>return</span><span>$input</span><span>;
</span><span>57</span><span>                }
</span><span>58</span><span>        }
</span><span>59</span>

result.class.php 코드는 다음과 같습니다.

<span> 1</span> <?<span>php
</span><span> 2</span><span>class</span><span> result{
</span><span> 3</span><span>private</span><span>$shape</span> = <span>NULL</span><span>;
</span><span> 4</span><span> 5</span><span>//</span><span>使用GET传递的变量,实例化一个相应的对象,返回一个对象的引用;</span><span> 6</span><span>function</span><span> __construct(){
</span><span> 7</span><span>$this</span>->shape = <span>new</span><span>$_GET</span>["shape"<span>]();
</span><span> 8</span><span>        }
</span><span> 9</span><span>//</span><span>调用对象的属性和方法,返回周长和面积</span><span>10</span><span>function</span><span> __toString(){
</span><span>11</span><span>$result</span> = <span>$this</span>->shape->shapeName.'的周长为'.<span>$this</span>->shape->perimeter().'</br>'<span>;
</span><span>12</span><span>$result</span> .= <span>$this</span>->shape->shapeName.'的面积为'.<span>$this</span>->shape->area().'</br>'<span>;
</span><span>13</span><span>return</span><span>$result</span><span>;
</span><span>14</span><span>        }
</span><span>15</span> }                                                                                                                                      

추상 클래스 Shape.class.php 코드는 다음과 같습니다.

<span> 1</span> <?<span>php
</span><span> 2</span><span>/*</span><span> 3</span><span>        project:面向对象版图形计算器
</span><span> 4</span><span>        file:shape.class.php
</span><span> 5</span><span>        description:抽象类,定义两个抽象方法area()和perimeter(),以及定义方法validate对输入的值进行验证
</span><span> 6</span><span>*/</span><span> 7</span><span>abstract</span><span>class</span><span> shape{
</span><span> 8</span><span>public</span><span>$shapeName</span>;                      <span>//</span><span>形状名称;</span><span> 9</span><span>abstract</span><span>function</span> area();               <span>//</span><span>抽象类area(),让子类去实现,体现多态性</span><span>10</span><span>abstract</span><span>function</span> perimeter();          <span>//</span><span>抽象类perimeter();</span><span>11</span><span>12</span><span>/*</span><span>13</span><span>                @param mixed $value 接受表单输入值
</span><span>14</span><span>                @param string $message 提示消息前缀
</span><span>15</span><span>                @param boolean 返回值,成功为TRUE,失败为FALSE
</span><span>16</span><span>*/</span><span>17</span><span>protected</span><span>function</span> validate(<span>$value</span>,<span>$message</span> = "输入的值"<span>){
</span><span>18</span><span>if</span>(<span>$value</span> < 0 || <span>$value</span> == <span>NULL</span> || !<span>is_numeric</span>(<span>$value</span><span>)){
</span><span>19</span><span>$message</span> = <span>$this</span>->shapeName.<span>$message</span><span>;
</span><span>20</span><span>echo</span> '<font color="red">'.<span>$message</span>.'必须为正数</font><br>'<span>;
</span><span>21</span><span>return</span><span>FALSE</span><span>;
</span><span>22</span><span>                }
</span><span>23</span><span>else</span><span>24</span><span>return</span><span>TRUE</span><span>;
</span><span>25</span><span>        }
</span><span>26</span> }

하위 클래스 Triangle.class.php의 코드는 다음과 같습니다.

<span> 1</span> <?<span>php
</span><span> 2</span><span>/*</span><span>*
</span><span> 3</span><span>        project:面向对象版图形计算器
</span><span> 4</span><span>        file:triangle.class.php
</span><span> 5</span><span>        description:继承抽象类shape,计算并返回三角形的周长和面积
</span><span> 6</span><span>*/</span><span> 7</span><span>class</span> triangle <span>extends</span><span> shape{
</span><span> 8</span><span>private</span><span>$side1</span> = 0;             <span>//</span><span>边长1;</span><span> 9</span><span>private</span><span>$side2</span> = 0;             <span>//</span><span>边长2;</span><span>10</span><span>private</span><span>$side3</span> = 0;             <span>//</span><span>边长3;</span><span>11</span><span>12</span><span>/*</span><span>13</span><span>                构造函数:对表单变量进行合理性验证,通过则初始化三个边长
</span><span>14</span><span>*/</span><span>15</span><span>function</span><span> __construct(){
</span><span>16</span><span>$this</span>->shapeName = "三角形";    <span>//</span><span>命名图形
</span><span>17</span><span>18</span><span>                //使用父类的方法validate检查输入的是否为正数</span><span>19</span><span>if</span>(<span>$this</span>->validate(<span>$_POST</span>["side1"],"边长1") & <span>$this</span>->validate(<span>$_POST</span>["side2"],"边长2") & <span>$this</span>->validate(<span>$_POST</span>["side3"],"边长3"<span>)){
</span><span>20</span><span>21</span><span>//</span><span>使用私有方法验证两边和是否大于第三边</span><span>22</span><span>if</span>(<span>$this</span>->validatesum(<span>$_POST</span>["side1"],<span>$_POST</span>["side2"],<span>$_POST</span>["side3"<span>])){
</span><span>23</span><span>$this</span>->side1 = <span>$_POST</span>["side1"];         <span>//</span><span>若通过验证初始化三边;</span><span>24</span><span>$this</span>->side2 = <span>$_POST</span>["side2"<span>];
</span><span>25</span><span>$this</span>->side3 = <span>$_POST</span>["side3"<span>];
</span><span>26</span><span>                        }
</span><span>27</span><span>else</span><span>{
</span><span>28</span><span>echo</span> '<font color="red">两边的和要大于第三边</font>'<span>;
</span><span>29</span><span>exit</span><span>();
</span><span>30</span><span>                        }
</span><span>31</span><span>                }
</span><span>32</span><span>else</span><span>{
</span><span>33</span><span>exit</span><span>();
</span><span>34</span><span>                }
</span><span>35</span><span>        }
</span><span>36</span><span>/*</span><span>使用海伦公式计算面积,并返回结果</span><span>*/</span><span>37</span><span>function</span><span> area(){
</span><span>38</span><span>$s</span> = (<span>$_POST</span>["side1"] + <span>$_POST</span>["side2"] + <span>$_POST</span>["side3"])/2<span>;
</span><span>39</span><span>return</span><span>sqrt</span>(<span>$s</span> * (<span>$s</span> - <span>$_POST</span>["side1"]) * (<span>$s</span> - <span>$_POST</span>["side2"]) * (<span>$s</span> - <span>$_POST</span>["side3"<span>]));
</span><span>40</span><span>        }
</span><span>41</span><span>/*</span><span>计算并返回周长</span><span>*/</span><span>42</span><span>function</span><span> perimeter(){
</span><span>43</span><span>return</span><span>$_POST</span>["side1"] + <span>$_POST</span>["side2"] + <span>$_POST</span>["side3"<span>];
</span><span>44</span><span>        }
</span><span>45</span><span>/*</span><span>计算三角形两边和是否大于第三边,是返回TRUE,否返回FALSE</span><span>*/</span><span>46</span><span>private</span><span>function</span> validatesum(<span>$side1</span>,<span>$side2</span>,<span>$side3</span><span>){
</span><span>47</span><span>if</span>((<span>$side1</span> + <span>$side2</span>) > <span>$side3</span> && (<span>$side1</span> + <span>$side3</span>) > <span>$side2</span> && (<span>$side2</span> + <span>$side3</span>) > <span>$side1</span><span>)
</span><span>48</span><span>return</span><span>TRUE</span><span>;
</span><span>49</span><span>else</span><span>50</span><span>return</span><span>FALSE</span><span>;
</span><span>51</span><span>        }
</span><span>52</span> }

하위 클래스 Circle.class.php의 코드는 다음과 같습니다. 다음:

<span> 1</span> <?<span>php
</span><span> 2</span><span>/*</span><span> 3</span><span>        project:面向对象的图形计算器
</span><span> 4</span><span>        file:circle.class.php
</span><span> 5</span><span>        description:接收表单值,返回周长和面积
</span><span> 6</span><span>*/</span><span> 7</span><span>class</span> circle <span>extends</span><span> shape{
</span><span> 8</span><span>private</span><span>$radius</span>;        <span>//</span><span>圆的半径
</span><span> 9</span><span>10</span><span>        //初始化圆的名称,检查输入合法性并初始化半径</span><span>11</span><span>function</span><span> __construct(){
</span><span>12</span><span>$this</span>->shapeName = "圆形"<span>;
</span><span>13</span><span>if</span>(<span>$this</span>->validate(<span>$_POST</span>["radius"],"半径"<span>))
</span><span>14</span><span>$this</span>->radius = <span>$_POST</span>["radius"<span>];
</span><span>15</span><span>        }
</span><span>16</span><span>//</span><span>返回圆的面积</span><span>17</span><span>function</span><span> area(){
</span><span>18</span><span>return</span> 3.14 * <span>$this</span>->radius * <span>$this</span>-><span>radius;
</span><span>19</span><span>        }
</span><span>20</span><span>//</span><span>返回圆的周长</span><span>21</span><span>function</span><span> perimeter(){
</span><span>22</span><span>return</span> 3.14 * 2 * <span>$this</span>-><span>radius;
</span><span>23</span><span>        }
</span><span>24</span> }

하위 클래스 ret.class.php 코드는 다음과 같습니다.

<span> 1</span> <?<span>php
</span><span> 2</span><span>/*</span><span> 3</span><span>        project:面向对象的图形计算器
</span><span> 4</span><span>        file:rect.class.php
</span><span> 5</span><span>        descrition:声明一个矩形资料,实现形状抽象类计算周长和面积的方法,返回矩形的周长和面积
</span><span> 6</span><span>*/</span><span> 7</span><span>class</span> rect <span>extends</span><span> shape{
</span><span> 8</span><span>private</span><span>$width</span>;         <span>//</span><span>矩形的宽度</span><span> 9</span><span>private</span><span>$height</span>;        <span>//</span><span>矩形的高度
</span><span>10</span><span>11</span><span>        //使用父类的validate方法验证输入的合法性,通过则初始化宽度和高度</span><span>12</span><span>function</span><span> __construct(){
</span><span>13</span><span>$this</span>->shapeName = "矩形"<span>;
</span><span>14</span><span>if</span>(<span>$this</span>->validate(<span>$_POST</span>["width"],"宽度") && <span>$this</span>->validate(<span>$_POST</span>["height"],"高度"<span>)){
</span><span>15</span><span>$this</span>->width = <span>$_POST</span>["width"<span>];
</span><span>16</span><span>$this</span>->height = <span>$_POST</span>["height"<span>];
</span><span>17</span><span>        }
</span><span>18</span><span>        }
</span><span>19</span><span>//</span><span>返回面积</span><span>20</span><span>function</span><span> area(){
</span><span>21</span><span>return</span><span>$this</span>->width * <span>$this</span>-><span>height;
</span><span>22</span><span>        }
</span><span>23</span><span>//</span><span>返回周长</span><span>24</span><span>function</span><span> perimeter(){
</span><span>25</span><span>return</span> 2 * (<span>$this</span>->width + <span>$this</span>-><span>height);
</span><span>26</span><span>        }
</span><span>27</span> }

명령문:

1. 이 글은 실험용으로만 적합하며, 실제 적용에는 적합하지 않으며 이로 인한 결과에 대해 저는 책임을 지지 않습니다.

2. 이 글은 블로그 원문이므로 개인플랫폼에 자유롭게 퍼가실 수 있습니다. 단, 출처를 표기하고 링크를 첨부하셔야 하며, 그렇지 않을 경우 표절로 간주됩니다. 상업적인 사용은 엄격히 금지됩니다. 필요한 경우 저에게 연락하여 원고료를 지불하고 사용 승인을 받으십시오.

위 내용은 내용적인 측면을 포함하여 객체지향 그래프 계산기의 사용법을 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.