想好好的学一下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. Linux文本处理三剑客之——grep

    一Linux文本处理三剑客之——grep Linux文本处理三剑客都支持正则表达式 grep :文本过滤( 模式:pattern) 工具,包括grep, egrep, fgrep (不支持正则表达式) ...

  2. lnmp 一键安装详解

    1.使用putty或类似的SSH工具登陆VPS或服务器: 登陆后运行:screen -S lnmp 如果提示screen: command not found 命令不存在可以执行:yum instal ...

  3. redis集群-4

    redis集群原理 redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态.每个节点都和其 ...

  4. MyEclipse增强代码补全

    MyElipse的默认代码提示功能隐藏了许多细节,需要开发者手动设置,一起来设置吧,让你的myeclpse更强大. 方法 1 打开MyEclipse 6.0.1,然后“window”→“Prefere ...

  5. Cocos2d-x 发布 Android

    Cocos2d-x 发布 Android 前置需求: Android NDK Android SDK OR Eclipse ADT Bundle Android AVD target installe ...

  6. Python面试题之“猴子补丁”(monkey patching)指的是什么?这种做法好吗?

    “猴子补丁”就是指,在函数或对象已经定义之后,再去改变它们的行为. 举个例子: import datetime datetime.datetime.now = lambda: datetime.dat ...

  7. CF963

    CF963C 首先假设横向被分成p块纵向被分成q块,\(C_i\)为横向长度为\(i\)的方块个数,\(D_i\)为纵向长度为\(i\)的方块个数 \(p\times q=\)总块数T,q要是所有\( ...

  8. Error(10028):Can't resolve multiple constant drivers for net “ ” at **.v

    两个进程里都有同一个条件判断的话,会产生并行信号冲突的问题. 同一个信号不允许在多个进程中赋值,否则则为多驱动. 进程的并行性决定了多进程不同能对同一个对象进行赋值.

  9. maven工程的下载及其环境配置

    Maven是一个项目管理工具,它给我们提供了好多有用的组件和工具. Maven下载: Maven下载载地址:http://maven.apache.org/download.cgi (1)进入下载界面 ...

  10. Android 中MediaPlayer播放音频

    1.播放/res/raw/目录下的音频资源 public class MainActivity extends Activity { MediaPlayer mediaPlayer; int posi ...