PHP 系列:PHP Web 开发基础
PHP是动态类型的Web开发的脚本语言,PHP以页面文件作为加载和运行的单元,PHP现在有了Composer作为开发包管理。
1.使用Composer管理依赖
自从.NET开发用了Nuget管理程序集依赖,我就再也离不开它了,幸亏Java中也有Maven管理jar包,虽然开源中国的镜像太慢但还有ibiblio的镜像可用,PHP现在终于有了Composer(参考1)用来管理资源包。
(1)全局安装(参考2)
在指定安装目录中执行命令行:
php -r "readfile('https://getcomposer.org/installer');" | php
在指定安装目录中执行命令行:
echo @php "%~dp0composer.phar" %*>composer.bat
将指定安装目录添加到环境变量的系统变量Path中。
(2)项目安装
在项目目录中执行命令行:
php -r "readfile('https://getcomposer.org/installer');" | php
使用 composer.json 文件配置依赖。如配置PHP中常用的日志组件:
{
"require": {
"monolog/monolog": "1.0.*"
}
}
使用命令行命令 php composer.phar install 安装依赖的资源包。如果进行了全局安装,只需要执行composert install。
这会将生成 composer.lock 文件并依赖下载资源包到 vendor 目录,composer.lock 文件是下载依赖时真正使用的文件。
(3)升级依赖
项目使用 composer.lock 文件维护依赖,如果我们需要使用更新版本的依赖,需要按需修改 composer.json 文件并执行更新命令。全局安装:composer update,项目安装使用:php composer.phar update。
(4)资源包查询与镜像
可以使用http://packagist.org检索资源包,好比.NET中的https://www.nuget.org/packages/和Java中的http://search.maven.org/。
可以使用http://packagist.phpcomposer.com镜像,全局配置使用如下命令行命令:
composer config -g repo.packagist composer http://packagist.phpcomposer.com
项目配置使用如下命令行:
composer config repo.packagist composer http://packagist.phpcomposer.com
当然最简单的方式是直接修改composer.config文件:
{
"require": {
"monolog/monolog": "1.0.*"
},
"repositories": {
"packagist": {
"type": "composer",
"url": "http://packagist.phpcomposer.com"
}
}
}
(5)自动加载
Composert 在 vendor 目录下自动生成并维护包含了全部依赖信息的 autoload.php 文件。因此我们只需要通过 autoload.php 使用第三方库即可。例如:
<?php
require 'vendor/autoload.php';
$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');
?>
2.PHP基础
(1)PHP类似C语系语法的脚本语言。
如果你有C或C++语言的基础,那么很多概念和语法都可以直接对照。从大小写敏感到注释,从数据类型、函数、参数传递和成员引用等。从C/C++/Java/C#这一体系学习下来,再加上JavaScript脚本语言的基础,加点PHP的技能点水到渠成。
(2)PHP是动态类型语言。
PHP有和C语言等强类型语言一样的数据类型定义,支持的类型也相仿,只是PHP中同一变量在不同时刻可以表示不同类型的数据,但同一时刻,每个变量都相当于强类型中的指定类型的变量。因此对于PHP,更适合的称呼是动态类型。习惯使用Java/C#等强类型语言总会对动态类型的脚本语言心存焦虑,可以通过PHP的类型检查函数减少这方面的顾虑(is_bool\is_integer\is_double\is_string\is_null等)。
(3)PHP以页面文件方式运行。
无论如何使用PHP,PHP的都是以页面文件方式运行的,这和运行在浏览器端的JavaScript方式类似,JavaScript文件只有在被加载到当前页面才能引用和执行,PHP也只有在通过include或required方式加载后才能引用和执行,即使后续添加的 __autoload和spl_autoload依然只是简化而非改变了其加载引用的本质。
(4)PHP不需要复杂的框架
PHP天生是处理Web请求的,HTTP协议相关的内容是PHP的重点,一般来讲,除了纵向请求的处理,横向的认证和授权控制部分,其他部分不应该过于依赖PHP,如果通过耦合性较高的Web框架使用PHP本身就是错误的。由于PHP本身的运行和加载方式,导致PHP天生就适合复用各种组件而非使用框架来解决问题。成天寄希望于框架的人,要么是不想在PHP基础要么是不想在业务逻辑基础上下功夫。
3.PHP常用文件
(1)配置文件config.php
应用配置的各种信息定义在一个或多个配置文件中。一般每次请求都会加载配置文件,配置文件中不只包含了数据库连接信息,如应用MVC时,每次请求都会加载配置文件以便读取所有URL和Controller以及View之间的规则。
(2)入口文件index.php
处理首页请求或全部请求的文件。index.php在实现PHP的MVC时是天然的前段控制器FrontController,由index.php负责纵向的处理请求转发,横向的认证和授权等处理文件,等也需要在index.php中加载。
(3)数据访问文件database.php
database.php是工具类中最主要的用于数据访问的文件,为了避免数据访问中重复性出现的代码,一般的PHP应用程序都会独立的一个或一组数据访问文件。
4.自定义Session
在PHP中自定义Session比Java中方便多了,只需要将自定义的函数名称做为参数传递给session_set_save_handler($open, $close, $read, $write, $destroy, $gc)作为参数即可,我们自定义一个使用cookie作为存储的session,作为演示没有对数据长度进行验证,也没有使用对称加密解密。
<?php function open_session() {
return true;
} function close_session() {
return true;
} function read_session($id) {
if ($_COOKIE[$id]) {
return base64_decode($_COOKIE[$id]);
}
return '';
} function write_session($sid, $data) {
if ($_COOKIE['session_end']) {
setcookie($sid, base64_encode($data), $_COOKIE['session_end']);
} else {
$start = time() + session_get_cookie_params()['lifetime'];
setcookie('session_end', $start, $start);
setcookie($sid, base64_encode($data), $start);
}
return true;
} function destroy_session() {
$_Session = array();
return true;
} function gc_session() {
return true;
} ini_set("session.cookie_lifetime", "3600");
session_set_save_handler('open_session', 'close_session', 'read_session', 'write_session', 'destroy_session', 'gc_session');
session_start();
$_SESSION['count'] += 1;
echo $_SESSION['count'];
session_write_close();
?>
参考
(1)https://getcomposer.org/doc/00-intro.md
(2)http://docs.phpcomposer.com/00-intro.html
PHP 系列:PHP Web 开发基础的更多相关文章
- [置顶] 提高生产力:Web开发基础平台WebCommon的设计和实现
Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...
- 提高生产力:Web开发基础平台WebCommon的设计和实现
Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...
- 移动WEB开发基础入门
什么是移动WEB开发,我个人理解就是,将网页更好的显示在移动端的一些设置,简单来说就两点如下: 1.流式布局,即百分比自适应布局 将body下的div容器的样式设置如下: div{ width:100 ...
- 第五模块:WEB开发基础 第3章·BootStrap&JQuery开发
01-JQuery介绍 02-jQuery文件引入和加载的区别 03-jQuery的基础选择器 04-jQuery的层级选择器 05-jQuery的基本过滤选择器 06-jQuery的属性选择器 07 ...
- 第五模块:WEB开发基础 第1章·HTML&CSS基础
01-前端介绍 02-HTML介绍 03-HTML文档结构 04-head标签相关内容 05-常用标签一之h1~h6,p,a 06-常用标签一之ul.ol.div.img.span 07-常用标签二- ...
- Web开发基础知识
综述 最近开始Java Web方面的工作,千里之行始于足下,我们在开发过程中要善于总结自己遇到的问题.善于管理一些优秀的代码片段.本文的主要内容是Web开发的基础知识,对于大牛来说可以忽略,对于初入W ...
- 移动端web开发基础概念
最近在了解移动端web开发的相关知识,有些概念总是模糊不清,这次花费了一些时间整体的梳理了一遍. 分辨率 分辨率可以从显示分辨率与图像分辨率两个方向来分类.显示分辨率(屏幕分辨率)是屏幕图像的精密度, ...
- web开发基础--字节序
字节是网络传输上的最小单位,是web开发中需要了解的一个知识点. 1.有效位 在谈字节序前需要先了解有效位,有效位分为两种:最低有效位(LSB: Least Significant Bit) 和最高有 ...
- Java Web开发基础(3)-JSTL
在DRP项目中接触到了JSTL标签库,对我这样的比較懒的人来说,第一感觉就是"惊艳". JSTL标签库的使用.能够消除大量复杂.繁复的工作.工作量降低的不是一点半点.是降低了一大半 ...
随机推荐
- 存储过程之七—java代码调用
一.简介 jdbc调用存储过程与调用一般的sql语句有些差别.jdbc调用一般的sql语句的时候,返回的是结果集,或是sql语句后是否执行成功的标记量.而存储过程返回的可以是结果集,输出参数.返回状态 ...
- 不用synchronized块的话如何实现一个原子的i++?
上周被问到这个问题,没想出来,后来提示说concurrent包里的原子类.回来学习一下. 一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic ...
- 边工作边刷题:70天一遍leetcode: day 85-3
Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...
- Codeforces 369E Valera and Queries --树状数组+离线操作
题意:给一些线段,然后给m个查询,每次查询都给出一些点,问有多少条线段包含这个点集中的一个或多个点 解法:直接离线以点为基准和以线段为基准都不好处理,“正难则反”,我们试着求有多少线段是不包含某个查询 ...
- 2014 Super Training #6 H Edward's Cola Plan --排序+二分
原题: ZOJ 3676 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3676 题意:给每个朋友一瓶可乐,可乐有普通和高 ...
- CLOSE_WAIT?项目上线之际遇到这样的烦心事
项目内测中,马上就要发布了,如今内测,所以很忙,今天运维那发来一堆状态,忘记截图了,简单来讲就是HTTP发送请求的时候有连接等待关闭,导致CLOSE_WAIT这个状态一直累加,没有释放,这样长时间下去 ...
- maven总结3
POM文件 maven版本:apache-maven-3.1.1 1.<modelVersion>4.0.0</modelVersion> pom模型的版本,对于maven2 ...
- 只有图片拼接的html页面图片之间有白条的解决方法
有时候会有这样的页面,整个页面也就是几张切好的图片组成,但是把这些图片使用代码拼接好,又总会出现图片间有白条的问题,如下图: 解决方法:给图片的父容器添加 line-height: 0; 就好了,因为 ...
- js中接口的声明与实现
实现接口,必须实现接口里的所有方法. function Interface(name,fns){//声明一个接口类 this.name = name; th ...
- Xcode中文乱码问题
老师给拷贝的程序用Xcode打开中文显示是乱码,而预览里面是正常显示的,Xcode默认编码UTF-8没错的,怎么办呢? 解决办法:用自带的文本编辑器打开,全选,复制,Xcode中打开文件,粘贴,ok~ ...