PHP基础笔记
韩顺平推荐
研究linux内核
研究算法
研究网络技术(网管,网络安全)
研究数据库
PHP笔记 .php目前由zend公司管理,mysql(mysql->sun->oracle) (LAMP) 跨平台,同时支持多种数据库;效率比较高,具有良好的安全性。免费使用;开放源代码(学习别人的代码); Php4,php5开始支持面向对象 弱数据类型 Web站点:WEB站点是多个web资源的集合。简单点说,可以把web应用理解为硬盘上的一个目录,这个目录用于管理多个web资源。Web站点通常称之为web网站或web项目/工程。PHP的基本概念 php是personla homepage 目前由zend公司管理 php嵌入到html代码,php脚本运行在服务端 1994(php1.0),1995(php2.0),1997(php3.0),2000(php4.0),2008(php5.0) Php6.0增加:更好的支持web2.0,支持更加好的Unicode支持,面向对象编程支持力度增加,对XMl编程支持,soap(简单对象协议)
l 软件开发中有个非常重要的原则:编译环境和运行环境要一致。
l 资料先在官网上找,多上英文网站
B/S和C/S的比较 开发成本低,管理维护简单,产品升级便利,对用户的培训费用低,用户使用方便,出现故障的概率小;安全性不足;客户端不能随心变化,受到浏览器的限制。 了解发送和接受到的内容。工具:httpwatch Lighttpd服务器,nginx服务器 Apache手册 管理apache,通过命令行来管理:httpd ?k start[shutdown|restart] Httpd.conf Apache目录结构 Apache服务器bin:该目录用于存放apache常用的命令,比如httpd,apachemonitor
cgi-bin:该目录存放Linux下的常用命令.sh
conf:存放配置文件httpd.conf
error:错误记录
htdocs:存放我们的站点的文件夹(默认情况下),如果有多个站点,可以通过文件夹来分类
icons:存放图标
logs:记录apache的相关日志
manual:手册
modules:apahche模块
Apache启动时会对读httpd.conf,加载相关模块
运行机制图
Mpm:mutil processing module 多重处理模块
Apr:可移植运行库
Apache的生命周期 配置虚拟目录我们把web应用放在apache默认的hdocs目录下,apache就会自动的管理。
l 添加虚拟目录节点
#欢迎页面
DirectoryIndex index.html index.htm,index.php
#站点别名
Alias /myblog “D:/myblog”
#访问权限设置
Order allow,deny
Allow from all
l 注释DocumentRoot "D:/phpenv/apache/htdocs"
10. 访问权限设置
#表示对d盘下面的myblog文件设置权限设置
#表示先许可所有的ip访问,deny表示拒绝所有ip访问,先看allow后看deny
Order allow,deny
#先看看allow
Allow from all
案例
#先看deny再看allow,allow中的设置会覆盖deny
Order deny,allow
Allow from 218.20.253.2
#218.20开头的ip被拒绝
Deny from 218.20
11. 虚拟主机的设置
l 启用httpd-vhosts.conf:在httpd.conf文件中添加
Include
l 在\extra\httpd-vhosts.conf配置虚拟主机
#这里配置欢迎首页面
DirectoryIndex index.html index.htm index.php
#不许可别人修改我们的页面
AllowOverride None
#设置访问权限
Order allow,deny
Allow from all
l 修改hosts文件,讲www.sohu.com重定向到本地的页面
练习:
在Httpd.conf文件中配置一台www.sohu.cn的虚拟主机(一个网站,站点),然后在window系统中注册www.sohu.cn这台主机在httpd.conf文件中启用httpd-vhosts.conf,即把#注销掉,
Include conf/extra/httpd-vhosts.conf
假设我们的虚拟主机在c:\myweb(即一个网站)
设置http-vhosts.conf文件
在hosts文件中添加我们的ip和主机映射关系:c:/windows/system32/drivers/etc/hosts
(想想hosts的域名配置公网Ip和内网ip)
在虚拟主机的根目录中创建一个名称为itcast站点,并在该应用下创建一个index.html页面,然后把web应用映射到缺省web应用,index.html页面设置为web应用的首页
l 访问网页的流程
例如:访问http://www.sohu.com/news.html
1) 解析主机www.sohu.com
2) 查询本地hosts文件:windows/sys32/drivers/../hosts(ip127.0.0.1对应域名)
3) 如果本地Hosts文件没找到ip,到dns(域名服务器)ip 域名
4) 找到ip
5) 发送http请求包
6) Apache解析http请求包:解析主机,解析站点名称,解析资源名称
7) 取得资源
12. 配置Apache支持php(apache在默认情况下是不会处理php)
套件软件:appserver或者wmap。该软件把我们需要环境打包安装
Php和apache的整合(即让apache可以处理php):
#让apache载入php处理模块
LoadModule php5_module ~php安装路径/php5apache2_2.dll
#phpinidir这个用于指定php的ini文件,
PHPIniDir ”~php模块安装路径”
#这个配置表示,当有一个资源是*.php的时候就由php来处理
AddType application/x-httpd-php .php .phtml
将php.ini-devlopment文件改成php.ini。因为我们的php的设置有需要在php.ini修改。启动开发模式。
在php.ini中指定扩展模块路径extension_dir=~php安装路径/ext(里面有很多功能库,如图形库,数据库库等),指定php的扩展库路径
让php支持mysql功能:在php.ini中启用php_mysql
如果没有启动,会报错找不到相关函数。
安装mysql
安装phpmyadmin(phpmyadmin是一个站点,所以直接解压到网站根目录下面)
安装并配置discuz论坛
1) 准备一个discuz论坛代码
2) 将其解压到 网站根目录下
3) 把discuz的upload文件拷贝到discuz文件夹下
4) 修改config.inc.php.数据库配置,以及一个管理员$forumfounders=’admin
5) 访问http://localhost/discuz’
完成配置:一台服务器上有多个站点,让每个站点配置一个域名
解决方案1:
1) 通过端口来区分不同的站点:按照绑定一个站点的方法做好准备
修改httpd.conf启用虚拟主机配置Virtual hosts;配置httpd-vhosts.conf文件;在hosts文件中添加ip和域名的对应关系;
同样添加一个新的域名与该ip绑定
在httpd-vhosts.conf中添加虚拟主机127.0.0.1:81
让apache监听81端口:加一个Listen 81
在hosts文件中再添加新的域名127.0.0.1 www.***.com
浏览器访问www.***.com:81
解决方案2:
通过ServerName端口区分不同的域名
在httpd-vhosts.conf文件中添加配置:
ServerName www.***.com
DirectoryIndex news.html
PHP变量(注意数据和变量概念的不一样) php变量是以$打头定义的,php变量的数据类型是变化的,php变量的数据类型是由运行时的上下文来决定的。 php是弱数据类型编程语言(数据类型不要转来转去) php基本数据类型:整形integer,小数(浮点型)float/double(php不区分单精度和双精度),布尔类型boolean,字符串型php复合类型:数组array,对象(object)
php特殊数据类型:null,资源类型(resource):$conn=mysql_connect(“localhost”,”root”,”root”);
$a=890; Var_dump($a); $a=1.1; Var_dump($a); ?> |
a) 八进制:$a=0123;,十六进制$a=0xAH;
b) Php不支持无符号整数,即php的整数都是有符号数。一般占4个字节。可以通过PHP_INT_SIZE可以显示我们自己的机器,一个整数用几个字节表示。Echo PHP_INT_SIZE;最大整数echo PHP_INT_MAX,如果超过了,整形会自动转换为float;(需要整理最大最小值)
c) 如果给定一个数超出了integer的范围,将会被解释为float
思考实践题:
$a; //如果只写了$a,但是没有赋值 Var_dump($a);//NULL,表示没有分配内存空间 Echo $a; ?> |
代码考量:健壮性,扩展性,安全性,代码的效率(并发,效率) 布尔类型的细节讨论
a) True,false都不区分大小写
b) 下面的值会被当做false对待:
布尔值FALSE自身
整型值0
浮点型值0.0
空字符串,以及字符串“0”
不包括任何元素的数组
不包括任何成员变量的对象
特殊类型NULL(包括尚未设定的变量)
浮点型细节a) 浮点数(也叫双精度或实数),浮点数的精度是14(从左边开始就是,第一个非0数就是精度开始;$a=0.23456789022222988;$b=0.00002222233334444;
b) 浮点数的字长和平台相关,通常最大值是1.8e308并具有14位十进制数字的精度(这个限制很重要)
字符串细节a) 一个字符占用一个字节;$a=”hello”;占5个字节
b) 理论上,我们对字符串大小没有限制,即只有不超过内存就可
c) 我们定义字符串的时候,可以用单引号,也可以使用双引号,区别如下:双引号会解释变量的值。如果字符串包含在单引号中,除了来处理\”时,会输出\”外,其它规则都一样。
当一个变量包含在“”号中时,会输出它的值,而包含在’’号中是输出其字符本身。
Php字符类型的自动转换变量的类型不由程序员设定的,确切地说,是由PHP根据该变量使用的上下文在运行时决定的,可以通过var_dump($变量1,$变量2…)方式来显示其类型。(PHP是不需要编译就能运行的)
10. php常量
a) 常量前面没有美元符号$
b) 常量用define()函数定义或者const,而不能通过赋值语句,在定义的时候就需要赋初值;常量的名称,一般全部大写,然后用下划线间隔;
define(“TAX_RATE”,0.08);在程序中我们不希望某个值变化,则考虑使用常量,比如圆周率,税率….
const TAX_RATE=0.08;
c) 常量可以不用理会变量的作用域而在任何地方定义和访问;
d) 常量一旦定义就不能被重新定义或者取消定义;
e) 常量的值是标量【基本数据类型:】
11. 表达式
表达式是PHP最重要的基石。在PHP中,几乎所写的任何东西都是一个表达式。
所谓表达式,就是任何有值的东西。$a=7/3;如何将小数位数保存到2位(函数处理)
比较运算符:$a===$b全等$a!==$b非全等(值相等,并且类型也相同)
$a!=$b只有值不相等,则为true
$a!==$b只要值不相等,或者类型不相等,则为true
字符串运算符(.):当两个基本数据类型用.连接的时候,就表示把他们的内容当做字符串拼接起来。
类型运算符:instanceof用于确定一个PHP变量是否属于某一类class的实例。不能去判断是否属于基本数据类型。
12. Switch可以使用的数据类型可以是:整形,小数,字符串,布尔型,null。从我们学习if和switch分支来看,if往往是对某一个范围的判读,而switch是对一个点的判断。
PHP函数 基本概念:为完成一功能的程序指令(语句)的集合。在php中,函数分为:自定义函数,系统函数(php语句本身提供,可以直接使用的函数,php设计者认为,在项目开发的过程,很多人都会用的一些功能)。函数的基本结构:Function 函数名(参数…){
//函数体
return 返回值;(可以没有)
}
函数的参数可以是多个,并且数据类型是php语言支持的任意类型;函数的命名跟自定义变量一样,首字母只能是_,A-Z,a-z开头,不要用数字或者特殊字符开头。
Php中页面相互调用a) require()和require_once()
一般放在php页面的最前面,php执行前,就先读入require所包含的页面,一旦出现错误,则退出程序(报错)。
这两个区别为,前面遇到即包含文件,后者会判断是否已经包含过了,如果包含过了,则不再包含文件。一可以节省资源,而可以避免重新定义的错误。
b) include()和include_once()
可以放在php页面的调用函数前,当php执行到时,才会读入include所引入的php页面,如果出现错误,程序不会退出,会继续执行。
区别:前者Include遇到即包含文件,后者include_once()
c) include和require区别(同时include_once和require_once区别)
相同的地方:都是可以引入别的页面
区别:include如果出现错误,程序继续运行;require出现错误,则会终止程序。
d) 使用哪个:做项目的时候,基本上使用的是require_once()
php执行时,一旦遇到函数的调用,就会开辟一个新栈 函数只是一个定义,函数执行的规则是只要一看到函数,则php就会开辟一个新栈 各个栈间的变量是相互独立的。(搞懂全局变量,局部变量)PHP中有三种提示:
Notice:注意 waring:警告 error:错误
如果在函数中,我们不希望使用某个变量,或者是希望彻底的不再使用某个变量,则可以使用unset(变量名)来销毁变量。 在php函数中,我们可以给某个参数,赋一个默认的值。 Php默认是值传递,如果需要引用(地址)传递,使用&变量名。 $a=1>>2;$b=-1>>2;
$c=1
$d=-1
Echo “a=”.a;
?>
二进制:逢二进一。使用二进制只有0,1两个数,简单易于电子方式实现。同时,通过0,1的组合可以表示任意一个数。原码,反码,补码:
1--> 原码 00000000 00000000 00000000 00000001
a) 二进制的最高位是符号位:0表示整数,1表示负数
b) 整数的原码,反码,补码都一样
c) 负数的反码=它的原码的符号位不变,其他位取反
-1 -->原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
d) 负数的补码=它的反码+1
e) 0的反码,补码都是0
f) Php没有无符号数之说,即:php中的输都是有符号的
g) 在计算机运算的时候,都是以补码的方式来运算的。意思就是不管一个数是正数还是负数,都要转成补码,然后进行运算。
Php中有4个位运算,分别是“按位与&”,“按位或|”,“按位异或^”,”按位取反~”,运算规则如下:按位与&:两位全为1,结果为1
按位或|:两位有一个为1,结果为1
按位异或^:两位一个为0,一个为1,结果为1
按位取反~:0->1,1->0
步骤:求出补码(因为所有的运算都是以补码的方式进行的)
~2=? -3
补码:00000000 00000000 00000000 00000010
11111111 11111111 11111111 11111101(结果是补码)->原码
反码:11111111 11111111 11111111 11111100(先减1)
原码:10000000 0000000 0000000 000000011(-3)
2&3:首先找到2和3的补码 =2
2的补码:00000000 00000000 00000000 00000010
3的补码:00000000 00000000 00000000 00000011
2&3 :00000000 00000000 00000000 00000010
位移运算:对二进制数进行左右移动,运算规则是:>>算数右移:低位溢出,符号位不变,并用符号位补溢出的高位
$a=1>>2; $a=0
1的补码:00000000 00000000 00000000 00000001
1>>2 : 0000000 000000000 00000000 00000000 (0)
$b=-1>>2; -1
-1的原码:10000000 00000000 00000000 00000001
-1的反码: 11111111 1111111 1111111 11111110
-1的补码: 1111111 11111111 11111111 11111111
-1
-1>>2 : 1111111 11111111 11111111 11111111 (结果为反码)
反码: 1111111 11111111 11111111 11111110
原码: 1000000 0000000 000000000 00000001(-1)
数组 排序 查找 为什么要数组:可以用于存放多个数据的数据类型,我们称为数组。 概念$array[0]=123;
[0]--> 下标,关键字
$array[0]-->数组的一个元素
123 -->元素对应的值
$array--->数组名
在php数组中,元素存放的值可以是任意数据类型的。
$arr[true]=”hello”; ==>$arr[1]
$arr[false]=”world”;==>$arr[0];
$arr[null]=”北京”;==>$arr[null]或者$arr[“”];
如果用小数做键值,会自动截断小数部分。
我们可以使用print_r来显示数组的情况。
PHP的数组是可以动态增长的。
$a = array(2,3);
$a[2]=56;
Echo $a[2];
一维数组引用陷阱:$arr[bar]=”hello,world”;
Echo$arr[bar];(会把bar当做常量)
$a[0]=1;$a[1]=2;$a[2]=5;
Count($a); =3
$a[0]=1;$a[5]=2;$a[10]=5;
Count($a); =3
$arr=array();
Echo count($arr); =0
Unset()函数允许销毁数组中的某个元素,也可以删除某个变量,但要注意数组的关键字不会重新索引。
?>
数组默认传递的是值,不是地址。对象默认传递的是地址。
排序,选择排序法,插入排序法 排序是将一组数据,依指定的顺序进行排列的过程。排序是一个程序员基本功。 分类:a. 内部排序法:将需要处理的所有数据都加载到内部存储器中进行排序。包括交换式排序法(冒泡法,快速排序法),选择式排序法和插入式排序法b.外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储器 进行排序。包括合并排序和直接合并排序法。