想好好的学一下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这个框架的开发。

参考文章

PHP学习(MVC架构与面向对象)的更多相关文章

  1. MVC架构在Asp.net中的应用和实现

    转载自:http://www.cnblogs.com/baiye7223725/archive/2007/06/07/775390.aspx 摘要:本文主要论述了MVC架构的原理.优缺点以及MVC所能 ...

  2. MVC架构简介及其测试策略

    最近在WEB端测试工作中陷入了瓶颈,单纯的手动功能测试在没有成熟的代码规范之前还是很容易坑的,WEB自动化测试一时半会还没有什么进展,所以决定先学习一下网站用的MVC架构,跟着教程写了一个小网站,大概 ...

  3. 设计模式之美学习(九):业务开发常用的基于贫血模型的MVC架构违背OOP吗?

    我们都知道,很多业务系统都是基于 MVC 三层架构来开发的.实际上,更确切点讲,这是一种基于贫血模型的 MVC 三层架构开发模式. 虽然这种开发模式已经成为标准的 Web 项目的开发模式,但它却违反了 ...

  4. MVC架构学习

    作为一名小小的GreenBird,学习MVC呢,已经花费了2天了,期间得到了美丽的学姐的帮助,初步整理了一下. 首先,学习MVC呢就先以一个标准的MVC的简单的例子来入手,然后根据学姐的PPT,我用v ...

  5. go区块链学习教程之iris框架mvc架构

    在Iris框架中,封装了mvc包作为对mvc架构的支持,方便开发者遵循mvc的开发原则进行开发. iris框架支持请求数据.模型.持久数据分层处理,并支持各层级模块代码绑定执行. MVC即:model ...

  6. ExtJS 4.2.1学习笔记(一)——MVC架构与布局

    1       ExtJS入门 1.1     支持所有主流浏览器 调试推荐:chrome.Safari.Firefox 1.2     推荐目录结构 - appname (包含所有程序代码,是根目录 ...

  7. 【JAVA】基于MVC架构Java技术荟萃案例演练

    基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servle ...

  8. java 学习写架构必会几大技术点

    java 学习写架构必会几大技术点 关于学习架构,必须会的几点技术 1. java反射技术 2. xml文件处理 3. properties属性文件处理 4. 线程安全机制 5. annocation ...

  9. MVC架构杂谈

    来源:伯乐在线专栏作者 - 林欣达 链接:http://ios.jobbole.com/86895/ 点击 → 了解如何加入专栏作者 前言 MVC是软件工程中的一种软件架构模式,它把软件系统分为三个基 ...

随机推荐

  1. OC学习篇之---单例模式

    在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...

  2. webpack配置教程

    1.npm脚本运行webpack与命令行输入webpack的区别  : https://segmentfault.com/a/1190000011052193   npm 模块的 安装 和 卸载  : ...

  3. 20175223 《Java程序设计》第十一周学习总结

    目录 教材学习内容总结 代码调试中的问题和解决过程 1. Linux中编程实现计算器方法乘法报错,但 IDEA 中可以. [代码托管] 学习进度条 参考资料 目录 教材学习内容总结 因未熟练掌握第十章 ...

  4. mysql 用户权限管理详细

    用户管理 mysql>use mysql; 查看 mysql> select host,user,password from user ; 创建 mysql> create user ...

  5. Linux常用命令的使用方法

    Linux 命令大全 Linux 命令大全 1.文件管理 cat chattr chgrp chmod chown cksum cmp diff diffstat file find git gitv ...

  6. gokit 统计分析 M2M接入服务 OTA固件升级 硬件社交化

    统计分析 M2M接入服务  OTA固件升级 硬件社交化 统计分析 为智能硬件定制的统计分析服务.只需添加入一行代码的集成工作,多维度的设备使用和用户行为数据就能自动统计出来. 演示 特色一:设备上线情 ...

  7. HTML5: HTML5 拖放

    ylbtech-HTML5: HTML5 拖放 1.返回顶部 1. HTML5 拖放(Drag 和 Drop) 拖放(Drag 和 drop)是 HTML5 标准的组成部分.   将 RUNOOB.C ...

  8. CMDB 调研报告

    基础概念 1.什么是CMDB CMDB——配置管理数据库,通过识别.控制.维护,检查企业的IT资源,从而高效控制与管理不断变化的IT基础架构与IT服务,并为其它流程,例如事故管理.问题管理.变更管理. ...

  9. Eclipse快捷键 之 代码追踪

    在使用Java编写复杂一些的程序时,你会不会常常对一层层的继承关系和一次次方法的调用感到迷惘呢?幸亏我们有了Eclipse这么好的IDE可以帮我们理清头绪--这就要使用Eclipse强大的代码追踪功能 ...

  10. Windows10安装好Visual Studio2017后,找不到MFC向导

    前段时候在Windows10中安装好Visual Studio2017后,想创建一个基于MFC的对话框应用,发现无法找到MFC开发向导选项,很是奇怪,以前使用VC6.0或者Visual Studio2 ...