PHP之MVC项目实战

本文主要包括以下内容

  1. 类文件自动加载
  2. 路径管理
  3. 页面跳转
  4. 注册自动加载方法
  5. 配置文件系统
  6. cookie
  7. session

类文件自动加载

在PHP中使用别的类时,需要载入类文件,如果类很多的话,需要重复写很多代码,所以利用__autoload魔法方法实现自动加载

/*** 自动加载函数** @param $class_name string 需要的类名*/
function __autoload($class_name) {
//  echo $class_name, ' ';//特例$map = array('MySQLDB' => FRAME_DIR . 'MySQLDB.class.php','Model' => FRAME_DIR . 'Model.class.php');//该数组,将所有的有限的特例,类与类名的映射,完成一个列表//判断当前所需要加载的类是否是特例类if( isset($map[$class_name])) {//存在该元素,是特例//直接载入require $map[$class_name];}//规律elseif (substr($class_name, -10) == 'Controller') {//控制器require CURR_CONT_DIR . $class_name . '.class.php';} elseif (substr($class_name, -5) == 'Model') {//模型require MODEL_DIR . $class_name . '.class.php';}
}

路径管理

项目中,使用常量的形式管理路径!
使用绝对路径!
尽量自动获得!

如果目录之前进行拼凑,一定会使用到目录分隔符!(PATH_SEPARATOR,路径分隔符) ,不同的操作系统对目录分隔符的支持是不同的!
windows 支持 \(反斜杠) 和 /(斜杠),默认是反斜杠\。
linux 支持 / (斜杠)
因此程序中多见 /斜杠!
除此,还有一个更好的方法:
利用 预定义 常量:DIRECTORY_SEPARATOR,目录分隔符!

//管理路径常量
define('DS', DIRECTORY_SEPARATOR);//简化目录分隔符名称长度!
define('ROOT_DIR', dirname(__FILE__) . DS);//根
define('APP_DIR', ROOT_DIR . 'app' . DS);//应用程序
define('CONT_DIR', APP_DIR . 'controller' . DS);//控制器
define('CURR_CONT_DIR', CONT_DIR . PLATFORM . DS);//当前控制器
define('VIEW_DIR', APP_DIR . 'view' . DS);//视图
define('CURR_VIEW_DIR', VIEW_DIR . PLATFORM . DS);//当前视图
define('MODEL_DIR', APP_DIR . 'model' . DS);//模型路径
define('FRAME_DIR', ROOT_DIR . 'framework' . DS);//框架路径

页面跳转

header(‘Location: url’);
优势:在于立即跳转!
劣势:没有办法在跳转前给出提示!

header功能是,发送响应头信息!相应头信息,是相应信息的一部分!通知浏览器应该做哪些事情的部分!但是要求,相应头信息,要先于响应主体(相应信息的其他部分)先被发送到浏览器!
因此,无论如何也是看不到echo的提示:

因此,编程上建议在使用header函数时,前面不应该有任何的输出!包含html输出和phpecho输出!

location.href=’url’,javascript
提示是,样式不易控!(可以用弹出层)

但是,js的支持,需要浏览器支持才可以!

meta:Refresh
refresh 是刷新的意思,可以提供一个秒数,刷新的间隔!
有需要当前页面执行结束后才会刷新,因此容易给出提示,包括提示的样式!

因此项目中典型的提示跳转都由 refresh完成!

格外注意:
跳转的代码执行结束后,脚本是没有停止的!
因此,跳转的代码后边强制脚本停止!

注册自动加载方法

利用 系统函数:
spl_autoload_registser()

如果需要注册的是一个函数:直接提供函数名即可
如果是方法的话:需要给出类或者对象(是否是静态) 和 方法名!
此时需要一个数组,使用两个元素,分别表示
array(类名或对象,方法名);

spl_autoload_register(array('Framework', 'itcast_autoload'));

配置文件系统

一,增加一个文件,保存配置信息
二,项目运行时,将配置文件载入,就可以使用配置信息

增加配置文件
在app目录增加一个config子目录,用于管理配置文件:

<?php
//配置文件return array('database' => array('host'=>'127.0.0.1','port'=>'3306','user'=>'root','pass'=>'root','charset'=>'utf8','dbname'=>'itcast_shop',),//数据库组'app' => array(),//应用程序项目组'back' => array(),//后台'front' => array(),
);

载入配置文件
增加一个框架级别的基础操作,载入配置信息!
在framework/Framework.class.php
增一个方法,在run方法中执行即可!

考虑获得数据的变量:
保证保存配置信息的变量的全局性!使用$GLOBALS

/*** 载入路径常量*/private static function loadConfig() {$GLOBALS['config'] = require CONFIG_DIR . 'app.config.php';}

使用配置信息
在基础模型实例化MysQLDB类时需要使用
framework/Model.class.php

protected function initLink() {//require './framework/MySQLDB.class.php';// $options = array(//  'host'=>'127.0.0.1',//  'port'=>'3306',//  'user'=>'root',//  'pass'=>'root',//  'charset'=>'utf8',//  'dbname'=>'itcast_shop'// );$this->db = MySQLDB::getInstance($GLOBALS['config']['database']);}

浏览器的技术,可以在浏览器上保存数据的一门技术!cookie就是指的是浏览器上保存的数据!
PHP支持cookie技术!php可以向浏览器发出指令,从而将数据保存到浏览器上!

浏览器负责保存数据,而php负责控制浏览器保存那些数据!
(php在是使用浏览器上cookie技术)

保存在浏览器上的cookie数据,可以在浏览器每次项服务器请求时,都可以携带该数据,向服务器发出请求,此时服务器上的脚本就可以获得该数据!

基本使用
设置cookie变量,增,改,删
利用内部函数 setcookie完成
setcookie(名字,值)

取得cookie变量,读
使用预定义数组变量:$_COOKIE
该变量内保存所有从浏览器请求时所携带的cookie数据!
每个元素就是一个cookie变量数据!下标是名字,值,就是值!

高级使用
1,cookie数据只能是字符串数据!
2. setcookie函数,可以完成增,修改,删除!
不存在,则增加,存在则修改!
删除,可以采用将值,置空的形式!
3. cookie变量的失效期
cookie数据存在有效期的概念:
默认,临时cookie。会保存到浏览器关闭!
同时,支持,增加setcookie的第三个参数,来修改cookie变量的有效期。有效期的表示方式,是一个时间戳,表示到哪个时间点,失效!
php可以通过 time()函数,获得当前的时间戳,time()增加增量的形式延长cookie时间!

setcookie('name','test',time()+60*60);

4,cookie存在有效路径的概念
cookie变量是只在当前目录,及其后代目录才会生效!

test/下设置
test/sub/下可以访问

可以更改cookie数据的有效路径:
通过setcookie的第四个参数做修改:

/表示站点根目录有效!整站有效!

5,cookie子域名的概念

cookie是严格区分域名的。

支持在子域名之间是可以共享的:
利用第五个参数设置

有效期,有效路径,有效子域名!

6,COOKIEcookie_COOKIE是,浏览器请求时所携带的所有cookie!
当前设置的在下次使用请求才好用!

问题
由于COOKIE似乎逐渐退出历史舞台,不再的浏览器对于cookie的支持也不一致,所以以后慎用吧。

session

场景:
cookie的问题
由于是数据本身是在浏览器端:
数据的安全性问题!
数据总要在请求时携带!

怎么解决,注意保持在浏览器的多次请求间共享数据!

将数据放在服务器端,同时是数据区分浏览器,在浏览器的多次请求间共享数据!

在服务器上,为来访的每台浏览器增加一个数据空间,然后为这些数据空间分配不同唯一的标识!为每个浏览器分配一个唯一的标识,该标志应该服务器端数据库空间的标识应该一一对应
要求,浏览器每次请求时携带标识,此时服务器可以获得标识,利用标识确定数据空间,但却请求的所有的数据处理,都在当前的确定的空间内完成!

将服务器分配给浏览器的唯一标识存在浏览器的cookie内,可以保证浏览器每次来时都携带!
服务器为每一个新浏览器访问(没有确定标识的浏览器),确定 标识,和在服务器上生成一个唯一的数据空间!

基本使用
直接操作SESSIONsessionsession_SESSION内的一个元素!对元素操作,就是对session数据做操作!

但是,session技术,包括生产session标识,开辟session数据空间,为浏览器分配session标识等等,都需要PHP的session机制支持!
因此,需要先开启session的支持,才能操作$_SESSION变量,从而去操作session数据!

开启:
session_start();

操作:
$_SESSION;

session_start();if(isset($_SESSION['is_login']) && $_SESSION['is_login'] =='yes') {//继续执行} else {die('没有登陆');}

基本原理

浏览器端cookie中保存的sessionID:

当前浏览器第一次对服务器发出请求时,服务器不能确定浏览器的标识
会重新生成一个唯一标识,以cookie的形式保存到浏览器端!
其中默认的cookie变量名为:PHPSESSID。
该cookie标量,也被称之为 sessionID!

当浏览器拥有了sessionid这个cookie变量后,接下来的请求都会携带该ID发出请求:

服务器的端的是session数据空间
默认情况下,php,会将保存session数据的空间,生成一个文件来完成!通过文件的名称来区分属于哪个ID的!
默认的被保存在服务器操作系统的临时目录内:

详细介绍

自动开启
session可以自动开启!在当前的脚本执行之前,就完成开启!
通过php的配置文件,修改即可!
修改为session.auto_start=1

注意,在session已经开启的情况下再开启,则会触发错误!
因此常用@session_start();开启;

session_start()前的输出问题
session_start前也不应该有任何的输出,因为可能会使用到响应头信息(类似于header函数)

$_SESSION的使用
$_SESSION 变量只能是字符串下标数组,不支持数值下标数组!

没有session_start时是没有$_SESSION的。
但是语法上可以向一个普通数组一样处理,此时不会对_SESSION内的数据做保存!

删除session
删除某个session数据
unset($_SESSION[‘key’]);

删除所有的session数据
$_SESSION=array();

注意,不能unset($_SESSION);

删除session的文件
session_destroy()
session_destroy()只删除文件,不处理SESSION_SESSION是有值的!

但是,一旦执行了session_destroy(),则在脚本结束,不会在执行写操作!

如何完全删除一个session?
将于当前session相关的数据都删除掉。
SESSION:unset_SESSION=array()
session文件: session_destroy();
cookie中的sessionID: setcookie(‘PHPSESSID’, ‘’, time()-1);

服务器端session数据的处理

处理服务器上所保存的session数据的文件
修改保存目录

默认的保存在系统临时目录下,windows/temp下:

可以通过修改 php的配置。session.save_path进行修改!注意,php不能自动创建该目录,应该由自己创建目录

分子目录保存session文件
每个session一个session文件,当请求变多时,session文件增多! 分子目录保存!

通过 修改 session.save_path完成!可以配置session的子目录级数,sessionid字符可能性等

session.save_path="1;e:/php/temp"
session.hash_function=0
session.hash_bits_per_character=5

利用数据库存储session

重写session的存储机制!

session面临的问题:
1量大!难管理
2服务器多,难共享!

将session数据,放置在数据库服务器上进行保存管理!(内存)

将session数据存入到数据库中!

分析:
需要的工作
提供可以操作数据的功能代码!(读,写,删除)
告知php,在需要的时候,调用我们所定义的代码!

增加六个session存储的处理函数(方法)

<?php//定义六个函数/*** 在session开启时执行,* 负责完成session存储所需要资源的初始化工作!*/
function sess_open() {echo 'open<br>';//连接数据库$link = mysql_connect('127.0.0.1:3306', 'root', 'root');mysql_query('set names utf8');mysql_query('use itcast_shop');
}
/*** session_start()时,开启session时被执行** 负责从当的session记录中,将session数据读取出来** @param $sess_id string 当前的sessionID** @return string session的数据,不需要序列化。如果没有读到则返回空字符串!*/
function sess_read($sess_id) {echo 'read<br>';//利用 select 查询$sql = "select sess_data from `session` where sess_id='$sess_id'";$result = mysql_query($sql);if($row = mysql_fetch_assoc($result)) {return $row['sess_data'];} else {return '';}
}
/*** 在 脚本结束时被执行** 负责,将当前的session数据,同步写到当前的session记录中** @param $sess_id string* @param $sess_data string ** @return bool*/
function sess_write($sess_id, $sess_data) {echo 'write<br>';//执行写数据的操作!//当前session记录存在则更新sess_data,不存在则插入!$expire = time();$sql = "insert into `session` values ('$sess_id', '$sess_data', $expire) on duplicate key update sess_data='$sess_data', expire=$expire";return mysql_query($sql);
}/*** 在调用了 session_destroy()系统函数时,被自动调用!\* 负责的功能时,利用当前id,删除当前的session记录!** @param $sess_id string** @return bool*/
function sess_destroy($sess_id) {echo 'destroy<br>';//执行 delete 操作$sql = "delete from `session` where sess_id='$sess_id'";return mysql_query($sql);
}/*** 在session_start() 是执行* 负责 删除所有的垃圾数据** @param $maxlife int 最大的生命周期** @return bool*/
function sess_gc($ttl) {echo 'gc<br>';//$now = time();$last = $now-$ttl;//$sql = "delete from `session` where expire < $last";return mysql_query($sql);}
/*** 脚本结束*/
function sess_close() {echo 'close<br>';
//  mysql_close();return true;
}session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destroy','sess_gc'
);

利用系统函数,设置session存储所需要的处理器,为当前定义好的 这六个函数:
session_set_save_handler();

增加一个表保存session数据
保存在文件中变成保存到数据表中!
一个文件对应 一条记录
文件名 某个字段,sessionID
文件内容 字段,当前session数据

create table session(
sess_id varchar(32) primary key,
sess_data text,
expire int(11)
) charset=utf8;

垃圾回收,gc
如果一条记录(一个文件)在多久之内,没有被使用过了,则认为该数据是垃圾!
默认的时间,是1440s秒。24分钟!可以通过php的配置:session.gc_maxlifetime=1440
什么时候执行删除的动作?
在session_start()时,有一定的几率,执行垃圾回收!
默认是 1/1000 千分之一!
可以通过php修改:

session.gc_probability=1;
session.gc_divisor=1000;
  • session与cookie的区别与联系?
    session 的 sessionID存在 cookie内!
  • session数据有效期?原因是什么?
    浏览器关闭。
    原因是保存在浏览器端的sessionid丢失!
    默认的sessionID的cookie变量是临时的cookie变量!
  • 如何持久化session?

持久化sessionID这个cookie变量!

使用函数:session_id函数得到当前的sessionID!

setcookie('PHPSESSID',session_id(),time()+3600);

php还提供一个专门的修改sessionID的cookie变量的函数:
session_set_cookie_params();设置该cookie变量的选项的

在表示有效期的第一个参数,是时间周期,而不是时间戳!留意,应该在session-start()之前,就完成cookie选项的设置!
(类似于 session_set_save_handler一样)

session_set_cookie_params('3600');
session_start();

此外还应该保证,服务器端垃圾判定的时间要与session持久化的时间尽量一致!
session.gc_maxlifetime = 3600;

留意,少用!

  • cookie禁用session是否可用?
    session是基于cookie的,因此cookie禁用,session不应该可用!

如果非要用,也是可以的!
办法是:
url上传递sessionID!

此时,需要修改php的配置达到目的:
1,开启对url上传递的支持!将仅仅使用cookie传递sessionid关闭!

session.use_only_cookie=0;

2,增加url上参数

session.use_trans_id=1;

此时php就在浏览器没有cookie使用的情况下,可以采用url进行sessionID的传递:

注意,php只会自动在html代码的a连接的地址上增加url的传递SessionID
php代码内的url不能自动增加!

tip:表单请求时,该参数如何传递!php会自动增加表单项隐藏域,name=”PHPSESSID” 值为=”session_ID()”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加州伯克利大学:自动驾驶中虚拟到现实的强化学习|厚势汽车

来源&#xff1a;同济智能汽车研究所UCB 提出了虚拟场景到真实场景的翻译网络&#xff0c;解决强化学习用于自动驾驶虚拟测试中与现实测试的差异。强化学习需要大量的试错&#xff0c;而真实的自动驾驶车辆&#xff08;AV&#xff09;无法提供大量的试错为此 AV 强化学习使用虚…

Effective C++ 第二版 1)const和inline 2)iostream

条款1 尽量用const和inline而不用#define >"尽量用编译器而不用预处理" Ex. #define ASPECT_R 1.653 编译器永远不会看到ASPECT_R这个符号名, 在源码进入编译器之前, 就被预处理程序去掉, ASPECT_R 不会被加入到符号列表中; 编译报错时, 报错信息指向1.653, 让…

PHP之MVC项目实战(二)

本文主要包括以下内容 GD库图片操作 利用GD库实现验证码 文件上传 缩略图 水印 GD库图片操作 <?php$img imagecreatetruecolor(500, 300); //var_dumP($img); // //分配绿色 $green imagecolorallocate($img, 0, 0xff, 0x0); //var_dump($green);//fill $result ima…

2019年机器学习:追踪人工智能发展之路

作者&#xff5c;Hussain Fakhruddin编译&#xff5c;专知整理&#xff5c;Yingying&#xff0c;李大囧摘要&#xff1a;“智能助理”的时代已经到来了。机器学习已经成为全球数字化转型的关键要素之一 ,在企业领域&#xff0c;机器学习用例的增长在过去几年中也是显著的。预计…

PHP之MVC项目实战(三)

本文主要包括以下内容 标准错误错误处理 http操作 PDO 文件操作 标准错误错误处理 PHP在语法层面上发生的错误 两个过程&#xff1a; 触发阶段&#xff08;发生一个错误&#xff09; 处理阶段&#xff08;如何处理该错误&#xff09; 触发阶段 系统触发&#xff0c;…

价值2950亿美元的「量子霸权」,技术水平到了哪个阶段

来源&#xff1a;36Kr摘要&#xff1a;谁掌握了量子计算机&#xff0c;谁就可能引领下一次信息革命。当前经典计算体系&#xff0c;并不能解决所有问题。量子计算将给现有的计算理论带来深刻变革&#xff0c;将极大加深人类对物质与信息的理解&#xff1b;将是一种前所未有的计…

微信开发简单实例

本文主要包括以下内容 1. 微信聊天机器人 微信聊天机器人 利用图灵机器人接口实现微信聊天机器人 <?phpdefine("TOKEN", "weixin"); $wechatObj new wechatCallbackapiTest(); if (isset($_GET[echostr])) {$wechatObj->valid(); }else{$wec…

开放政府数据价值:内涵、评价与实践

来源&#xff1a;《政府数据开放研究》作者&#xff1a;陈美 湖北工业大学经济与管理学院分析开放政府数据的价值与评价&#xff0c;有助于政府数据开放更高效地开展。文章在界定开放政府数据价值内涵与层次划分的基础上&#xff0c;介绍国外开放政府数据价值评价进展&#xff…

Smarty模板技术学习

模板引擎技术&#xff1a;使得php代码和html代码分离的技术就称为“模板引擎技术” 自定义smarty模板技术实现 <?php//迷你smarty原理 class MiniSmarty{public $var_arr array();public $template_dir "./view/";public $compile_dir "./view_c/"…

vc++深入详解学习-NO.3

c的多态性&#xff0c;基于虚函数的多态性技术&#xff0c;在成员函数的定义前面加上virtual关键字申明的函数叫做虚函数&#xff0c;当c编译器在编译的时候&#xff0c;发现类中的虚函数&#xff0c;这个时候c就好采用迟邦定技术&#xff0c;在运行期间依据对象的类型确定调用…

50大产业链全景图(高清完整版)

来源&#xff1a;新材料在线摘要&#xff1a;机器人、无人驾驶、VR、光伏、核电、半导体……50大产业链全景图&#xff0c;让你一次纵观全局。&#xfeff;&#xff08;点击图片查看大图&#xff09;—1—全国各省新材料产业链全景图—2—飞机产业链全景图—3—高铁产业链全景图…

3D打印,智能砖,竹子城市……改变未来建筑业的8项技术

来源&#xff1a;资本实验室科学技术正在彻底改现代生活的方方面面&#xff0c;并且每天都在不断进步&#xff0c;没有任何减速的迹象。绝大多数行业已经并且正在受到技术进步的影响&#xff0c;并越来越接近未来。对于建筑行业而言&#xff0c;以下8种新技术将改变未来建筑业的…

Smarty模板技术学习(二)

本文主要包括以下内容 公共文件引入与继承 内容捕捉 变量调剂器 缓存 Smarty过滤器 数据对象、注册对象 与已有项目结合 公共文件引入与继承 可以把许多模板页面都用到的公共页面放到单独文件里边&#xff0c;通过模板就可以直接调用&#xff0c;类似php里边通过include指令…

分布式服务框架 Zookeeper -- 管理分布式环境中的数据

安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础&#xff0c;最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取&#xff0c;Zookeeper 的安装非常简单&#xff0c;下面将从单机模式和集群模式两个方面介绍 Zookeeper 的安装和配置。 单机…

AI“重造”麻省理工学院!今宣布投资10亿美元成立全新计算学院,近70年来最大结构调整...

来源&#xff1a;Deep Tech深科技摘要&#xff1a;近日&#xff0c;世界顶尖名校麻省理工学院通过学校官方网站宣布重磅消息。近日&#xff0c;世界顶尖名校麻省理工学院通过学校官方网站宣布重磅消息&#xff1a;投资 10 亿美元以引领计算机技术和人工智能技术的发展及全球影响…

经验分享:10个简单实用的 jQuery 代码片段

尽管各种 JavaScirpt 框架和库层出不穷&#xff0c;jQuery 仍然是 Web 前端开发中最常用的工具库。今天&#xff0c;向大家分享我觉得在网站开发中10个简单实用的 jQuery 代码片段。 您可能感兴趣的相关文章精心挑选12款优秀 jQuery Ajax 分页插件分享60款绚丽的 jQuery 幻灯片…

PHP数据库操作

PHP实现数据库的增删改查 <?php $connmysql_connect(localhost,root,root); if(!$conn){ echo "connect failed"; exit; }$sqluse test; mysql_query($sql,$conn);//增加 $sql"insert into mytest values(null,pu,20)"; $rsmysql_query($sql,$conn);…

日本机器人实力大盘点,和Atlas的高调刷屏相比,日本机器人的默默崛起更让人忌惮...

来源&#xff1a;机器人大讲堂摘要&#xff1a;近期&#xff0c;估计全球的机器人圈都沉浸在Atlas的三连跳中无法自拔&#xff0c;刷屏的Atlas代表了美国对待科研的态度&#xff1a;我能所以全世界都得膜拜我&#xff01;近期&#xff0c;估计全球的机器人圈都沉浸在Atlas的三连…

Android高性能ORM数据库DBFlow入门

DBFlow&#xff0c;综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点。同时不是基于反射&#xff0c;所以性能也是非常高&#xff0c;效率紧跟greenDAO其后。基于注解&#xff0c;使用apt技术&#xff0c;在编译过程中生成操作类&#xff0c;使用方式和ActiveAndr…

不值钱的软件人才[转]

软件人才在中国不值钱&#xff0c;不但价格只比“一文不值”多一点&#xff0c;而且地位也就是一个普通劳动者&#xff0c;和高薪等挂不上钩。这里讲的是中国大陆地区&#xff0c;因为我不知道其他国家的情况&#xff0c;如无特殊声明&#xff0c;以下所有情况均只中国大陆的情…