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思想框架
解释
浏览器直接请求的是控制器文件,也只有控制器文件知道用户给了什么(请求数据)以及用户真正要的是什么(目标)。
控制器根据用户的请求做两件事
控制器- 调用哪个模型
- 获取什么数据
- 显示数据到那个视图中
模型文件
根据控制器的调用生产数据并返回给控制器
视图文件
只负责显示数据(数据显示在页面的哪里以及显示的效果),并且由控制器决定显示哪些数据
模型文件和视图文件没有直接的关系。

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