• PHP学习(MVC架构与面向对象)


     
    想好好的学一下php中的一些面向对象的知识,以前只是为了打CTF随意的学了一下,但是为了以后的代码审计(准备PHP这边把thinkphp这个框架好好的学一下).

    PHP面向对象的基本知识

    • 类与对象

     
    类是描述一类事物的抽象名称。

    class nmae
    {
        类的描述
    }
    
    • 对象的创建
    $obj=new 类名();
    

    Deom代码

    <?php
    
    class Mikasa
    {
        var $data='QAQ';
        public function echoQAQ($value='')
        {
            echo $this->data;
        }
    }
    
    $Saber=new Mikasa();
    
    $Saber->data="emmmmmm";
    
    $Saber->echoQAQ();
    ?>
    

     
    输出:emmmmmm
     
    还可以使用var data='QAQ';这是php4的语法,跟public是一样的。

    • 属性与方法

      属性就是类里面设置的变量,方法就是类里面写的函数。

    • 对象的创建

      • 第一种

        $obj=new 类名();

      • 第二种

         $test='类名';
         $Saber=new $test();
        跟可变函数是一个道理
      • 第三种

        $obj=new 类名();
        $obj1=new $obj();
        
    • 对象之间的值传递

       
      这里面有一个小坑需要解释一下
       
      Demo代码

      <?php
      class Mikasa
      {
      var $data='QAQ';
      public function echoQAQ($value='')
      {
      echo $this->data;
      }
      }
      $Saber=new Mikasa();
      $Mikasa=$Saber;
      $Saber->data="This is a test";
      $Saber->echoQAQ();
      $Mikasa->echoQAQ();
      ?>

      将会输出This is a testThis is a test,为什么会是两个呢这个就要涉及到PHP对象的赋值了,个人表达能力有限就给一张图片吧。

      使用&的话也是一样,不过不是直接复制了,而是共用一个对象编号。

      也就是说unset()掉一个后,另一个就用不了了。
       

    • 静态变量和静态方法

      • 定义格式

        static 属性名=xx
         
        static function 方法名(){};
         

      • 实例代码

        <?php
        class Mikasa
        {
        static $test='QAQ';
        static function Hello()
        {
        echo 'QAQ';
        }
        }
        echo Mikasa::$test;
        Mikasa::Hello();
        //输出QAQQAQ

        可以直接使用类里面的静态的属性、方法。

    • this与self关键字

      $this代表的就是当前类的对象,self代表的就是类本身(python中的self与cls)

    • 类中的常量

          class test
          {
      const name='qaq';
      }
      //常量必须在声明的时候去赋值
    • 类的构造与析构方法

      __construct
      __destruct
      
    • 类的继承(也叫派生)

      使用的是extends关键字

    • 访问控制符

      public : 谁都能访问,var 在修饰属性的时候和 public 是一样的
      protected : 只有自己家族内部可以访问(具有继承关系的多个类之间)
      private : 只有自己可以访问
    • parent关键字

      parent 关键字用来表示某一个类的父类(或者说父类的对象),类似于Python 中的 super(),常常在子类中去访问父类的方法或者属性。

       
      就是重写父类的方法。
      parent::__destruct(){};重写父类的__destruct方法
       
      重写的要求
       

      父类: public 子类: public
      父类: protected 子类: protected/public
      父类: private 子类: 不能重写
    • 抽象类

      用于定义一些类的共同上级类,让这些类都具有某种共同的特征(其实就是强制子类实现某种属性或者方法)
       

    • 重载技术

      用于应对非法使用属性或者方法的措施
       

      • 重载的分类

        • 属性重载
        • 方法重载
      • 属性重载

        • __set($name,$value)

          给一个不存在的属性赋值时候会自动调用,$name=$value,就能够动态赋值。
           

        • __get($name)

          在给一个不存在的属性取值时候会自动调用,获取属性名
           

        • __isset($name)

          对一个不存在的属性使用 isset() 方法的时候调用
           

      • 方法重载

        • __call($name,$argument)

          调用不存在的方法名时候会调用
           

        • __callstatic($name,$argument)

          同上
           

    • 接口

      接口是比抽象类更抽象的一种类似类的结构,接口中只有两种成员,一种是常量,另一种是抽象方法。

      interface class A{
      const PI=3.14;
      function B();//
      }

       
      还是截一下图片吧。
       

       

    • PDO数据对象

      • 什么是PDO

        PDO是已经写好的数据库工具类,通过它能够对数据库进行各种操作,非常的方便快捷。
        nbsp;

      • 特点

        方便,随时使用的时候我们只需要new一个对象就行了,操作多种数据库,很方便。
         

      • php常见使用情况

        • 连接数据库得到数据库的连接资源
        • 执行各种sql语句得到布尔值或者结果集
        • 对结果集的数据进行取用,遍历(CTF遇到了很多了)
      • PDO系统的逻辑结构


         
        操作不同的数据库就去php.ini开启对应的PDO模块
         

      • PDO的使用

        <?php
         $test="mysql:host=localhost;port=3306;dbname=Mikasa";
        $db=new PDO($test,'root','root');
        $result=$db->query('select * from test');
        while ($row=$result->fetch()) {
        var_dump($row);
        }
        $db=null;

         
        这样就完成了一次查询一般query方法是执行的是各种sql语句,exec语句执行的是增删改查语句,一般exec是不会返回结果集的。最后让$db指向null就代表断开了连接。
         

      • PDO的结果集常见处理方法

        • 得到行数

          $res->rowCount();
           

        • 得到列数

          $res->columnCount()
           

        • 返回一行数据

          $res->fetch(返回类型)

          PDO::FETCH_ASSOC 返回关联数组
          PDO::FETCH_NUM 返回索引数组
          PDO::FETCH_BOTH 返回前两者皆有的数据(默认值)
          PDO::FETCH_OGJ 返回对象
        • 返回所有的数据

          $res->fetchAll()
           

        • 返回指定的列

          $res->fetchColumn(int)
           

      • PDO预处理语句

         
        一般是用于提高sql语句的执行效率,有以下几种形式。
         

        • 占位符形式

          $sql="select * from user_list where age=?"

           
          参数的顺序依次是1,2,3,4,5等
           
          实例代码

          $arr=array(1,2,3,4);
          $sql=$sql="select * from user_list where id=?";
          $result=$pdo->prepare($sql);
          foreach($arr as $value){
          $result->bindValue(1,$value);
          $result->execute();
          $result=$result->fetch(PDO::FETCH_ASSOC);
          var_dump($result);
          }
          • 命名参数形式

            $sql="select * from user_list where id=:qaq"
             
            后面绑定参数的时候用的就不是1,2,3,4,5来整了,使用的是参数名来进行绑定。
             
            $result->bindValue(':qaq',$value);
             

    • MVC架构(最重要的东西)

      • 什么是MVC架构

         
        其实也是不太清楚的,最近才接触到这个,好像是显示与逻辑相分离的思想好像。
         

        • 项目设计的基本流程

         

         

      • 简单的实例引入

         
        实现一个显示当前时间,要求有三种显示形式。
        1.显示年月日
        2.显示时分秒
        3.两者都显示
         

        • 显示与逻辑混合
    <!DOCTYPE html>
    <html>
    <head>
        <title>简单的时间显示</title>
    </head>
    <body>
    <p align="right">
        <a href="?type=1">形式以一</a>
        <a href="?type=2">形式二</a>
        <a href="?type=3">形式三</a>
    </p>
    
    <?php
    if(!empty($_GET['type']))
    {
        if($_GET['type']=="1")
        {
            $time=date("Y年m月d日");
        }
        elseif($_GET['type']=="2")
        {
            $time=date("H:i:s");
        }
    
        else
        {
            $time=date("Y年m月d日 H:i:s");
    
        }
    }
    echo "<h1>$time</h1>";
    ?>
    </body>
    </html>
    
    • 显示与逻辑相分离

    PHP文件

    <?php
    
    if(!empty($_GET['type']) && $_GET['type'] == "1"){
        $t1 = date("Y年m月d日");
    }elseif(!empty($_GET['type']) && $_GET['type'] == "2"){
        $t1 = date("H:i:s");
    }else{
        $t1 = date("Y年m月d日 H:i:s");
    }
    include "./show-time.html";
    ?>
    

     
    Html文件

    <html>
    <body>
    <p align = right>
        <a href="?type=1">形式一</a>
        <a href="?type=2">形式一</a>
        <a href="?type=3">形式一</a>
    <hr>
    </p>
    
    <?php
    echo "<h1>$t1</h1>";
    ?>
    </body>
    </html>
    
    • 模板技术

       
      在显示与逻辑相分离的基础上,做成多分不同的HTML,在通过用户的选择我更换HTML来显示,那么就构成了模板。
       

      MVC框架原理

    • 概念

      M: Model 模型
      V: View 模型
      C: Controller 控制器
       

    • MVC的简单演示

      假设求时间是一个非常复杂的工作,就像真实项目中的取数据要调用数据库模块一样,于是将求时间部分抽象成model模块,通过controller模块调用Model来实现求时间的功能.然后将结果放到view模块中。
       

    • 代码实现

     
    show-time-controller.php

    <?php
    require_once 'show-time-model.php';
    
    
    if(!empty($_GET['type']))
    {
        $obj=new GetTimeModel();
        if($_GET['type']=="1")
        {
            $date=$obj->GetDate();
        }
        elseif ($_GET['type']=="2") {
            $data=$obj->GetTime();
        }
        else
        {
            $data=$obj->GetDateTime();
        }
    }
    
    include './show-time-view.html';
    ?>
    

     
    show-time-model.php
     

    <?php
    /**
     * 
     */
    class GetTimeModel
    {
        public function GetDate($value='')
        {
            return Date("Y年m月d日");
        }
        public function GetTime($value='')
        {
            return Date("H:i:s");
        }
        public function GetDateTime($value='')
        {
            return Date("Y年m月d日 H:i:s");
        }
    }
    

     
    show-time-view.html
     

    <!DOCTYPE html>
    <html>
    <head>
        <title>Mikasa</title>
    </head>
    <body>
    <p align="right">
        <a href="?type=1">形式一</a>
        <a href="?type=2">形式二</a>
        <a href="?type=3">形式三</a>
    </p>
    <?php
    echo "<h1>$data</h1>";
    ?>
    </body>
    </html>
    

    MVC思想框架

    • 解释

      浏览器直接请求的是控制器文件,也只有控制器文件知道用户给了什么(请求数据)以及用户真正要的是什么(目标)。
       

    • 控制器根据用户的请求做两件事

       
      控制器

      1. 调用哪个模型
      2. 获取什么数据
      3. 显示数据到那个视图中
         
        模型文件
        根据控制器的调用生产数据并返回给控制器
         
        视图文件
        只负责显示数据(数据显示在页面的哪里以及显示的效果),并且由控制器决定显示哪些数据
         
        模型文件和视图文件没有直接的关系。
         

    后记

    这里面就是简单的总结一下,其实还是有很多的东西的,毕竟自己还没有接触过开发,后面的话打算学习一下thinkphp这个框架的开发。

    参考文章

  • 相关阅读:
    【Java学习笔记】I/O体系
    【Java学习笔记】几个实用类
    【Java学习笔记】内部类
    【Java学习笔记】对象的序列化和反序列化
    【Java学习笔记】数组的相关事项
    【Java学习笔记】由String str=”abc”引出的故事
    【Java学习笔记】上转型与下转型
    【Java学习笔记】枚举类型
    【Java学习笔记】集合类
    Maven的settings.xml中为HTTP和HTTPS配置代理服务器【转】
  • 原文地址:https://www.cnblogs.com/Mikasa-Ackerman/p/PHP-xue-xi-MVC-jia-gou-yu-mian-xiang-dui-xiang.html
Copyright © 2020-2023  润新知