1、变量 --122
1.1类型
1.2变量的检测
1.3类型检测
1.4变量的打印
1.5类型的转换
1.6变量赋值
1.7变量销毁
1.8动态变量名
1.9面试常见问题
2.运算符 --239
2.1算术符
2.2比较运算符
2.3三元运算符
2.4逻辑运算符
2.5递增递减运算符
2.6字符串运算符
2.7赋值运算符
3.控制结构 --379
3.1选择结构
3.2循环结构
3.3实操训练
4、函数 --548
4.1函数概念
4.2函数的定义格式
4.3函数的命名规范
4.4函数的调用过程和返回值
4.5函数参数的传值方式
4.6函数中变量的作用域
4.7动态调用函数
5、日期时间函数 --665
5.1获取事件戳
time()
microtime()
6、格式化 --707
date()
gmdate()
7、解析检测日期 --727
mktime()
strtotime()
checkdate()
8、字符串 --747
8.1字符串的定义方式
8.2单双引号对比:转义 解析 速度
8.3字符串常用函数分类
字符串长度函数
查找字符位置函数
字符串替换函数
提取字符串函数(双字节)
分割,链接,反转函数
去除,增加空格函数
HTML代码/数据库安全处理有关函数
比较字符函数
字符大小写转换函数
8.4如何选择单双引号
9、数组讲解 --829
9.1数组的特点及声明方式
9.2索引数组,关联数组,多维数组
9.3键的规则
9.4操作数组单元
9.5循环数组
9.6游标操作
9.7常用函数及面试题
10、超级全局变量 --1030
$_GET
$_POST
$_REQUEST
$_SESSION
$_COOKIE
$_FILES
$_ENV
$_SERVER
$GLOBALS
11、常量 --1067
11.1意义
11.2声明
11.3特点
11.4检测
11.5案例
11.6声明常量后,该常量在页面的任意处都可以访问
12、文件包含 --1102
作用
include
include_once
require
require_once
include 和require的区别
13、位运算 --1132
14、进制详解 --1163
15、位运算与PHP错误报告设置 --1188
16、浮点数并不精确 --1214
17、逻辑运算的短路特性与运算符优先级 --1230
18、递归 --1273
18.1递归概念
18.2递归技巧与案列
18.3递归与静态变量
18.4递归练习题
19、程序练习 --1334
19.1 IP,域名,DNS,host概念
19.2 apache安装与虚拟主机配置
19.3 整合PHP
19.4 安装myaql
20、mysql入门语句 --1431
21、留言提交到mysql --1481
--------------------------------------------------------------------------
--------------------------------------------------------------------------
1、变量
1.1类型
整型、浮点型、字符串、布尔、数组、对象、NULL、资源
NULL:是指没有值,也没有类型,它的值就是null -->$a = null;
形象的称为:只有名字的盒子,盒子里没有内容,不知道盒子是用来做什么的
用途:变量初始化,比较的时候等等
1.2变量的检测
判断变量是否存在:
isset可以检测变量是否存在,对于NULL,isset也返回false
对于值为零 $a = ''; 的变量也是存在的
样式为:
if(isset($b)){
echo '变量b存在';
} else {
echo '变量b不存在';
}
1.3类型检测
gettype();获取变量类型
样式为:
$a = '1';
echo gettype($a);
判断是否我们想要的类型:is_int ,is_float , is_array ...
样式为:
if(is_int($a)){
echo 'a是整型';
} else{
echo 'a不是整型';
}
注意:$a = 23; --> 这是整型
$a = '23';--> 这是字符串
1.4变量的打印
常用:
echo: 方便打印字符串、数字
print_r: 方便打印数组,会打印数字结构
var_dump: 方便打所有类型,调试时方便打印:变量的类型及其值
样式为:
$b = arry(1,2,'3');
var_dump($b); -->对打印类型及其值
1.5类型的转换
PHP中,变量的类型是可以随时转变的,非常灵活,最常见的是字符串与数字的转换
或是数字/字符串 -> 布尔值的转换
字符串到数字的转换:
$a = 'world12.3hello';
$a = $a + 3; -->规律:从左到右截取,直到碰到不合法的数字,截取出来的部分转换成数字
var_dump($a); -->打印出:3 因为碰到world就已经不和法,所以后面的无法截取转换成数字
注意:字符串的拼接是用点 --> . 列如:$a = $a . 'hello';
数字转换为字符串:
$a = 123;
$a = $a . 'hello';
echo $a; -->打印出:123hello
到布尔值的判断,以下值,都被当成布尔的假,而其它值,都被当成布尔型的真
如: '' , '0' , 0 , 0.0 , false , NULL , array();
列如:
if('' == false) {
echo '字符串果然假'; -->打印出字符串果然假
}
1.6变量赋值
传值赋值,引用赋值
变量赋值之传值赋值:
样式为: $li = 29;
$wang = 23;
$wang = $li;
var_dump($li,$wang); -->打印出:29,29
$wang = 'w';
var_dump($li,$wang);打印出:29,29 , w
变量赋值之引用赋值:两个变量指向同一个盒子(同看一台电视),一个人修改盒子就会影响另一个人的盒子
样式为: $li = 29;
$wang = 23;
$wang = &$li;
var_dump($li,$wang); -->打印 29 ,29
$wang = 'w';
var_dump($li,$wang); -->打印 w , w
1.7变量销毁:unset
样式1为:一个人看一部电视
$a = 99;
unset($a);
if(isset($a)){
echo 'a存在';
} else {
echo 'a不存在'; -->打印a不存在
}
样式2为:两个人同看一部电视,一个人不在,另一个人还在看电视
$li = 29;
$wang = &$li;
var_dump($li,$wang) -->29 29
$wang = 20;
var_dump($li,$wang) -->20 20
unset($li);
var_dump($li,$wang); -->null 20
1.8动态变量名:用变量的值再做变量的名,如$$a
样式为:
$liubei = '河北人';
$laoda = 'liubei';
$paihang = 'laodao';
echo $laoda , $$laoda , $$$paihang; -->liubei 河北人 河北人
1.9面试常见问题:
变量的类型
传值赋值和引用赋值的区别
2.运算符
2.1算术符
样式1为:
$a = 10;
$b = 0;
echo $a / $b; -->除数不能为0
样式2为:
$a = 320000000000;
$b = 320000000000;
$c = $a + $b;
var_dump($c); -->当数量太大溢出时,有可能会得到浮点数
样式3为:
$a = -10;
$b = -3;
echo $a % $b; --> -1 注意:在取模算法时,结果的正负仅取决于被除数 -10
2.2比较运算符 :凡运算必有运算结果,比较运算符的运算结果是布尔型值
样式1为:
$a = 5;
$b = 3;
$c = ($a > $b);
var_dump($c); -->布尔值:bool(true)
样式2为:
$c = ($a == $b);
var_dump($c); -->布尔值:bool(false)
样式3为:
$a = 5;
$B = '5';
var_dump($a == $b); -->布尔值:bool(true)
var_dump($a === $b); -->布尔值:bool(false)
注意:=== 3个等号要求类型相同,且值相等
样式4为:
$res = 0; // 1 2 3 false
if($res === false){
echo '没找到';
} else {
echo '找到'; --> 找到
}
面试题:
“===”是什么?试举一个“==”是真但“===”
与==相比,===,不仅要求值相等,还要求变量类型也相等.
比如
echo false==0?'等于':'不等于'; // 等于
echo false===0?"等于":'不等于'; //不等于
例: 查找字符串'abcde'中有没某个指定字母(不区分大小写)
$str = 'abcdef';
echo stripos($str,'z')!=false?'有':'没有';
echo stripos($str,'e')!=false?'有':'没有';
echo stripos($str,'a')!=false?'有':'没有';
2.3三元运算符
给定2个数,找比较大的数
样式1为:
$a = 15;
$b = 10;
$c = null;
if($a >= $b){
$c = $a;
} else {
$c = $b;
}
var_dump($c); -->15
样式2为:
$a = 15;
$b = 10;
$c = null;
$c = ($a>=$b? $a : $b); 三元运算符: ? -->前面的判断真假 ,如果为真则取$a ,为假则取$b
var_dump($c); -->15
利用3元运算符,求3个数中最大的数 -->需要2个3元运算符嵌套
2.4逻辑运算符
有房有车,才嫁
样式1为:
$house = true;
$car = true;
if($house === true){
if($car === true){
echo '嫁';
} else '不嫁';
} else {
echo '不嫁';
}
样式2为:
注意:&& -->并且
$house = true;
$car = true;
if( ($house==true) && ($car == ture) ){
echo '嫁';
} else {
echo '不嫁';
}
有房或有车都行
样式1为:
注意: || -->或者
$house = true;
$car = true;
if($house || $car){
echo '嫁';
} else {
echo '不嫁';
}
2.5递增递减运算符
样式1为:
$b = 5
$a = $b++; ++的效果 --> 1.返回b本身的值,2.把b的值加1
var_dump($a,$b); --> 5 6
样式2为:
$b = 5
$a = $b--; --的效果 -->1.把b的值减1 2.返回新值
var_dump($a,$b); --> 5 4
样式3为:
$b = 5
$a = ++$b; ++的效果 -->1.把b的值加1 2.返回新值
var_dump($a,$b); --> 6 6
样式4为:
$b = 5
$a = --$b; --的效果 -->1.把b的值减1 2.返回新值
var_dump($a,$b); --> 4 4
2.6字符串运算符 : . -->字符串拼接 ,可以把整型当字符串拼接起来
样式1为:
$a = 'hello';
$b = 'world';
$c = $a . $b;
var_dump($c); -->hellworld
样式2为:
$a = 'hello';
$b = 'world';
$c = $a . $b;
$d = 112;
$c = $c . $d;
var_dump($c); -->hellworld112
注意:下面哪个语句运行速度快?
$a = 'hello';
$b = 'world';
echo $a , $b; -->速度较快,因为:两个木棍同时一起扔
echo $a . $b; -->速度较慢,因为:两个木棍拼接起来了才扔
2.7赋值运算符
样式1为:
$a = 3; -->这是一个赋值运算 ,有2个作用,1是把3赋给$a ,2是返回运算结果,即3
样式2为:
$a = 3;
$res = ($a = 3);
var_dump($res); --> 3
3.控制结构
3.1选择结构
样式1为:判断星期几
$todat = 1;
if($today ==1){
echo '今天星期1';
} else if ($today == 2){
echo '今天星期2';
} else if ($today == 3){
echo '今天星期3';
} else if ($today == 4){
echo '今天星期4';
} else if ($today == 5){
echo '今天星期5';
} else if ($today == 6){
echo '今天星期6';
} else if ($today == 7){
echo '今天星期7';
} else {
echo '你来自火星';
}
样式2为:switch () 适合用在验证多个可能的值,不适合用在判断范围
$todat = 1;
switch ($today){
case 1;
echo '今天星期1';
break; -->到为真是,breadk会切断后面的值,否则后面是值也会显示出来
case 2;
echo '今天星期2';
break;
case 3;
echo '今天星期3';
break;
case 4;
echo '今天星期4';
break;
case 5;
echo '今天星期5';
break;
case 6;
echo '今天星期6';
break;
case7;
echo '今天星期7';
break;
default:
echo '你来自火星';
}
3.2循环结构
whlie(){}
样式1为:先算,再工作
$i = 0;
whlie($i++<=10){
echo $i; -->1 2 3 4 ... 10 11
}
样式2为:
$i = 0;
whlie($i<=10){
echo $i++; -->1 2 3 4 ... 9 10
}
do while -->先工作,再算
样式1为:
$i = 100;
do {
echo '我照样执行一次';
} while($i<10);
for
注意:循环的一般要素:初始化(1),判断(2),执行体(3),修改变量(4)
样式1为:
for(1 ; 2 ; 4){
3
}
样式2为: 注意:$i-=3 --> $i = $i - 3的简写;
for($i=50; $i>=3; $i-=3 ) {
echo '喝酒';
}
样式3为:多个初始化,判断 ~ ~
for($i=1,$j=5;$i<=5 && $j>=1;$i++,$j++){
echo $i,'~',$j,'<br />';
}
break/continue
样式1为:
for ($i=0;$i < 10 ; $i++){
if($i == 4){
continue; -->直接把4删除了
}
echo $i,'<br />';
}
样式2为:
for ($i=0;$i < 10 ; $i++){
if($i == 4){
echo $i;
break; -->把4后面是数字删掉
} else{
echo $i,'<br />';
}
}
3.3实操训练:
1、奖金利润提成,利润(I)低于或等于10万元时,奖金可提 10%;利润高于10万时,低于20万时,低于10万元时的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发奖金总数?
程序分析:利用 if else 做范围的讨论
$i=60;
if ($i<=10) {
$reward =0.1*$i;
}else if ($i<=20 && $i>10) {
$reward = 1+($i-10)*0.075;
}else if ($i<=40 && $i>20) {
$reward = 1+0.75+($i-20)*0.05;
}else if ($i<=60 && $i>40) {
$reward = 1+0.75+1+($i-40)*0.03;
}else if ($i <=100 && $i>60){
$reward = 1+0.75+1+0.6+($i-60)*0.015;
}else if ($i>=100){
$reward = 1+0.75+1+0.6+0.6+($i-100)*0.01;
}
echo $reward;
2、输入三个整数 x,y,z ,找出最大的数
$x = 1;
$y = 2;
$z = 3;
$a = ($x>$y? $x : $y);
$a = ($a>$z? $a : $z);
var_dump($a);
3、打印出所有的“水仙花数” 。所谓“水仙花数” 是指一个三位数 ,且个位数字立方和等于该数本身,例如:153 是一个“水仙花数” ,因为 153 = 1 的三次方 + 5 的三次方 +3的三次方。
程序分析:利用for 循环控制100-999个数,每个数分解出个位,十位,百位。
for ($x=1; $x <= 9; $x++) {
for ($y=0; $y <=9 ; $y++) {
for ($z=0; $z <=9 ; $z++) {
if ($x*$x*$x + $y*$y*$y + $z*$z*$z == 100*$x + 10*$y +$z) {
echo $x,' ',$y,' ',$z,'<br />';
}
}
}
}
4、猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,有多吃了一个,第二天早上又将剩下的桃子吃掉了一半,有多吃了一个,以后每天早上吃了前一天剩下的一半零一个,到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少?
程序分析:采取逆向思维的方法,从后往前推断
for ($t=1,$tian=9; $tian>=1 ; $tian--) {
$t=($t+1)*2;
echo '猴子第',$tian,'天,还有',$t,'个桃子','<br />';
}
5、有一分数序列:2/1 , 3/2 , 5/3 , 8/5 ,13/8 , 21/13 ...求出这个数列的前20项之和
for ($m=2,$z=1,$a=0,$s=1; $s<=20 ; $s++) {
$a=$a+$m/$z;
$m =$z+$m;
$z =$m-$z;
}
echo $a,'<br />';
6、假设某人有100,000现金,没经过一次路口需要进行一次交费,交费规则为当他现金大于50,000时每次需要交5%,如果现金小于等于50,000每次交5,000。请写一程序此人可以经过多次这个路口。
for ($i=100000,$cnt=0; $>=5000 ; ) { --> $cnt=0 走的次数
$cnt += 1;
if($i > 5000){
$i *=0.095;
} else {
$i -= 5000;
}
echo '第' , $cnt , '次过桥,剩下' , $i ,'元<br />';
}
7、打印九九乘法表
for($i=1;$i<=9;$i++){
for($b=1;$b<=$i;$b++){
echo $i,'*',$b,'=',$i*$b,' ';
}
echo '<br />';
}
8、有鸡翁一,值钱五,鸡母一,值钱三;鸡雏三,值钱一;百钱买鸡白只,问鸡翁、鸡母、鸡雏几何?
for ($g=1;$g<20 ; $g++) {
for ($m=1; $m < 35; $m++) {
for ($x=1; $x <300 ; $x++) {
if(5*$g+3*$m+$x/3==100 && $g+$m+$x==100) {
echo '公鸡',$g,'母鸡',$m,'小鸡',$x,'<br />';
}
}
}
}
9、求1到100内的素数
for ($a=1; $a <=100 ; $a++) {
$num =0;
for ($b=1; $b<$a ; $b++) {
if ($a%$b ==0) {
$num++;
}
}
if ($num ==1) {
echo $a,'<br />';
}
}
10、一种羊 第二年生一个小羊 第四年生一个小羊 第五年死 20年后有多少羊?
$arr = array('0'=>1,'1'=> 0,'2'=>0,'3'=>0,'4'=>0);
for ($i=1; $i <=20 ; $i++) {
$num = $arr[1]+$arr[3];
array_unshift($arr, $num);
array_pop($arr);
}
echo array_sum($arr);
?>
----------------------------------------------------------------------
----------------------------------------------------------------------
4.1函数概念
一段封装好的代码,可以随时调用
样式1为:
function t1() {
echo 'hello';
echo 'world';
echo '<br />';
}
t1(); -->体现了代码的封装效果
样式2为:
function he($a,$b) {
$c = $a +$b;
echo $c;
}
he(3,4); -->体现了函数能帮忙运算
样式3为:
function h2($a,$b) {
$c = $a + $b;
return $c;
}
$d = h2(4,5); -->通过返回值形式拿到结果
echo $d;
------------------------------------------------------------------------------------------------
4.2函数的定义格式
样式1为:
function 函数名([参数1,参数2..N]) { [] -->里面的参数可不写
return; -->执行语句
}
------------------------------------------------------------------------------------------------
4.3函数的命名规范
对于函数,命名规则和变量是一样的,但是函数不区分大小写
样式1为:
echo H2(2,4)
------------------------------------------------------------------------------------------------
4.4函数的调用过程和返回值
样式1为:
function t(){
echo 'hello'; -->没有调用函数,无法显示 ,函数不调用,就无法运行
}
执行语句的流程:
样式2为:
function t(){
echo 'hello';
}
echo 'a'; -->第一步
t(); -->第二步:碰到函数调用时,PHP脚本就控制权就会跑到 function t() 执行完
echo 'b'; --> 调用函数完后,回到原地,再执行第三部
注意:函数调用时,代码执行权进入函数,当函数所有语句执行完毕,函数结束,交回执行权
或者函数碰到return 语句时,函数返回,交回执行权
样式3为:
function t2(){
echo '1';
echo '2';
echo '3';
return 'good'; -->悄悄返回,但是没有echo
echo '4';
echo '5';
return 'study';
}
$res = t2(); --> 1 2 3
注意:函数返回,要么不返回,要么只能返回一个值
样式4为:
function t3(){
return 'hello' , 'world'; -->错误语句,不能同时返回两个值
}
------------------------------------------------------------------------------------------------
4.5函数参数的传值方式
样式1为:
function t($a) {
$a +=1;
}
$a = 3;
t($a);
echo $a; --3 ,因为function里的 $a(属于函数内部的) 跟外面的 $a = 3 是没有关系的
样式2为:
function t($a) {
$a +=1;
}
$b = 3;
t($b); --> 传参$b,相当于$b 的值,赋给$a ,而$a 是函数内部的值,怎么变,和外界无关,体现了函数的封装性
echo $a;
样式3为:
function t2($a){
$a +=1;
}
$b = 5;
t2($b);
echo $b; -->6 ;$a和$b 指向了同一个地址。
注意:这种传参方式是不推荐的,因为函数内部的语句,影响到了外部的变量,破坏了函数的封装性
------------------------------------------------------------------------------------------------
4.6函数中变量的作用域
在PHP的页面中声明的变量,叫做“全局变量”,函数内的变量,叫“局部变量”;各自有各自的作用域
样式1为:
$a = 12; -->全局变量
function t(){
$b = 22; -->局部变量
echo $a;
}
t();
echo $b;
样式2为:声明全局变量 global -->可随意找到变量
$a = 22;
function t2(){
global $a;
echo $a;
}
t2(); --> 22
注意:这种传参方式是不推荐的,因为函数内部的语句,影响到了外部的变量,破坏了函数的封装性
样式3为:超级全局变量,在页面的任何部分,包括函数,方法等,都可以直接访问
function t3(){
print_r($_GET);
}
t3();
------------------------------------------------------------------------------------------------
4.7动态调用函数
样式1为:可以用变量的值当作函数,并调用函数
function wel(){
echo 'welcome';
}
function beat(){
echo 'beat';
}
$heart = 'wel';
$heart(); -->$heart 的值是welcome,因为调用执行wel();
注意:变量可重名,但是函数重名就会报错
------------------------------------------------------------------------------------------------
5、日期时间函数
5.1获取时间戳
time()
样式1为:
echo time(); -->返回时间戳
注意:时间戳是指1970 01 01 00:00:00到现在这一瞬间经过的秒数
------------------------------------------------------------------------------------------------
microtime() -->microtime作用:检测程序运行速度
样式1为:
print_r(microtime());-->返回时间戳同时还有微秒
样式2为:
print_r(microtime(true));-->返回单位是微秒时间戳
样式3为:
$start = microtime(true);
for($i=1;$i<10000000;$i++){
$tmp = 13333333/234;
}
$end = microtime(true);
echo $end - $start; -->检测13333333/234的运行效率
------------------------------------------------------------------------------------------------
6、时间戳格式化
date()
样式1为:
$time = time();
echo date('Y-m-d 星期N h:i:s' , $time); -->2014-9-14 星期日 22:33:24
------------------------------------------------------------------------------------------------
gmdate()
样式1为:
$time = time();
echo date('Y-m-d 星期N h:i:s' , 0); -->1970-01-01 星期四 08:00:00 格林威治和北京的时区差别
样式2为:
$time = time();
echo gmdate('Y-m-d 星期N h:i:s' , 0); -->1970-01-01 星期四 12:00:00 格林威治时区的时间
注意:h:i:s 小写h 是12小时制,大写的24小时制
------------------------------------------------------------------------------------------------
7、解析检测日期
mktime()
样式1为:
mktime(14,35,20,09,14,2014); -->计算得到是时间戳
------------------------------------------------------------------------------------------------
strtotime()
样式1为:
echo strtotime('now'); -->计算现在的时间戳
样式2为:
echo strtotime('now +1 day'); -->计算明天的时间戳
样式2为:
echo strtotime('now -1 day'); -->计算昨天的时间戳
------------------------------------------------------------------------------------------------
checkdate() :检测日期是否合法
样式1为:
var_dump(checkdate(2.29,2000)); -->返回布尔值true/false
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
8.1字符串的定义方式
样式1为:
$a = 'hello';
$b = 'hello';
echo $a , '<br />' , $b;
样式2为:heredoc nowdoc 定义大段文本
$c = <<<HTML -->可自定义
-------可随意写内容
-------可随意写内容
HTML; -->可自定义
样式3为:
$d = <<<'HTML' -->nowdoc多了一个单引号
-------可随意写内容
-------可随意写内容
HTML;
echo $d;
-------------------------------------------------------------------------------------
8.2单双引号对比: 转义 解析 速度
单引号转义:
样式1为:$a = '\'';
echo $a; -->echo: '
样式2为:$a = '\\';
echo $a; -->echo: \
双单引号转义:
样式3为:$a = "\"";
echo $a; -->echo: '
注意:双引号里的变量negotiations解析
样式4为:
$age = 29;
$str1 = '李明今年 $age 岁';
$str2 = "李明今年 $age 岁";
echo $str1; --->李明今年 $age 岁
echo $str2; --->李明今年 29 岁
注意:速度比较
单引号不需要分析串内有无变量,需要转义的内容少,因此速度比较快
优先使用单引号
-------------------------------------------------------------------------------------
8.3字符串常用函数分类
字符串长度函数:strlen
样式1为:按字节计算
$a = 'hello';
echo strlen($a); -->5
样式2为:按字节计算
$b = '中国';
echo strlen($b); -->6 因为:utf8 编码,中文占3个字节
样式3为:按字符来计算
$c = '中国';
echo mb_strlen($c, 'utf-8'); -->2 'utf-8'是告诉计算机我使用的编码类型
-------------------------------------------------------------------------------------
查找字符位置函数:strpos
样式1为:
$str = 'abcde';
$char = 'a';
if(strpos($str, $char) !==false){
echo '含有' , $char,'<br />';
} else {
echo '不含有' , $char,'<br />';
}
字符串替换函数
样式1为:
$str = 'hi, fuck';
echo str_replace('fuck','f**k',$str); -->hi, f**k
样式2为:替换一批字符串
$str = '男人,女人,男孩,女孩';
echo strtr($str, array('男'=>'女' , '女'=>'男'));
提取字符串函数(双字节)
样式1为:substr()
$str = 'tommrow is another day';
echo substr($str, 0 ,3); -->tom 0开始。截3个字符
echo substr($str, 0 ,-3); --> mrow is another day -3代表结束位置,后往前数
echo substr($str,-10 ,-3); -->nother
分割,链接,反转函数
样式1为:
$str = 'tech,linux,mysql';
$arr = explode(',',$str);
print_r($arr); -->把字符串拆分数组
样式2为:
$str = 'tech,linux,mysql';
echo implode($arr , ','); -->把数组合并为字符串
去除,增加空格函数
HTML代码/数据库安全处理有关函数
比较字符函数
字符大小写转换函数
把以上函数练习3次以上
-------------------------------------------------------------------------------------
9、数组讲解
9.1数组的特点及声明方式
数组是一种复合数据,可以装下多个值,每个值用不同的键来区分
样式1为:声明语法
$arr = array('001'=>'春','002'=>'夏','003'=>'秋','004'=>'冬');
print_r($arr);
特点:放在独特的柜子里
-------------------------------------------------------------------------------------
9.2索引数组,关联数组,多维数组
样式1为:索引数组
$arr = array(0=>'东',1=>'南',2=>'西'); -->键不必有特殊意义,纯数字,注意突出内容
样式2为:关联数组
$stu = array('name'=>'小华' , 'age'=>30); -->字符串做键,一般能体现该单元的内容,如age ->年龄
样式3为:多维数组
$arr = array(0=>'a' , 1=>array('stu'=>'li','bag'=>array('数学','语文')));
print_r($arr);
-------------------------------------------------------------------------------------
9.3键的规则
样式1为:如果不声明键,会从0 1 2..递增来生成键
$arr = array('a','b','c');
print_r($arr);
样式2为:如果已经存在某1个或几个数字键,则从最大的数字键,递增生成数字键
$arr = array(3=>'a' , 'b', 'c');
print_r($arr);
样式3为:如果键声明重复了,后面的值覆盖前面的值
$arr = array(3=>'a' , 3=>'b' , 4=>'c');
print_r($arr);
样式4为:键可以是整数,也可以是字符串
$arr = array(2=>'布' , 2.3=>'尔' , '2.5'=>'教' , '2x'=>'育');
print_r($arr);
注意:浮点数转成整数,如果字符串的内容恰好是整数,也理解成整数
-------------------------------------------------------------------------------------
9.4操作数组单元
样式1为:增1个单元
$arr = array('a','b','c');
$arr[] = 'd';
$arr[99] = 'e';
print_r($arr); --> a b c d e
样式2为:读取单元值
$arr = array('a','b','c','d');
echo $arr[3]; -->d
样式3为:多维数组读取
$arr = array('a','b','c');
$arr[] = 'd';
$arr[99] = 'e';
$arr['stu'] = array('li' , 'wang');
echo $arr['stu'][1]; -->wang
样式4为:改单元值
$arr = array('a','b','c');
$arr[0] = 'A'; a --> A
样式5为:删除某个单元值
$arr = array('a','b','c');
unset($arr[1]); -->删除 b
-------------------------------------------------------------------------------------
9.5循环数组
样式1为:
for 循环,对于0..1.2...递增的索引数组
$arr = array('a','b','c','d','e','f');
for($key = 0;$key<count($arr);$key++) { --->count($arr)读取$arr数组单元的个数
echo $arr[$key], '<br />';
}
样式2为:关联数组
$arr = $array('age'=>28,'height'=>180,'name'=>'list');
foreach ($arr as $key =>$value) { --把age赋予$key ,把28赋予$value (value可自定义)
echo $key , '~', $value , '<br />';
}
样式3为:选取数组中的值
$arr = $array('age'=>28,'height'=>180,'name'=>'list');
foreach($arr as $v) {
echo $v; --> 28 180 list
}
样式4为:把下面数组的每个单元值变成原来的2倍
$stu = array('lisi'=>3,'wang'=>4,'zhangsan'=>6);
-------------------------------------------------------------------------------------
9.6游标操作:current() next() end() reset() prev()
样式1为:current() -->取当前游标指向的数组单元的值
$arr = array('a','b','c');
echo current($arr); -->a
样式2为:next() -->把数组的游标往后移
$arr = array('a','b','c');
next($arr);
echo current($arr); -->b
样式3为:end() -->把数组游标移到最后
$arr = array('a','b','c');
end($arr);
echo current($arr); -->c
样式4为:reset() -->把数组游标移复位
$arr = array('a','b','c');
reset($arr);
echo current($arr); -->a
样式5为:prev() -->把数组游标前移
$arr = array('a','b','c');
end($arr);
echo current($arr); -->c
prev($arr);
echo current($arr); -->b
样式6为:整合运用
$arr = array('a','b','c');
while($v = current($arr)) {
echo $v;
next($arr); -->a b c
}
样式7为:上面的漏洞
$arr = array(1,3,4,5,false,6,8,9,);
while($v = current($arr)) {
echo $v;
next($arr); --> 1,3,4,5
} -->因为while碰到了false 就结束了 ,这种情况可以用数组游标的each 函数来处理
-------------------------------------------------------------------------------------
9.7常用函数及面试题
常用函数:以下没个练习3次以上
count()
array_key_exists()
in_array()
array_change_key_case()
array_count_values()
array_fill()
array_filter()
array-values()
array_keys()
array_push()
array_pop()
array_shift()
array_unshift()
Sort()
Resort()
Usort()
asort()
ksort()
natsort()
natcasesort()
array_merge()
array_merge_recursive()
array_diff()
array_diff_assoc()
array_intersect()
array_intersect_assco()
array_flip()
array_unque()
array_reverse()
array_sum()
shuffle()
Range()
Srand()
array_rand()
样式1为:
$arr = array('a'=>'张龙' , 'b'=>'赵虎' , 'c'=>NULL);
if( isset($arr['c']) ) {
echo 'c号单元存在';
} else {
echo 'c号单元不存在'; --c号单元不存在 ,实际上是存在的
}
样式2为:判断数组单元键是否存在 array_key_exists()
$arr = array('a'=>'张龙' , 'b'=>'赵虎' , 'c'=>NULL);
if( arrary_key_exists('c',$arr) ) {
echo 'c号单元存在';
} else {
echo 'c号单元不存在'; --c号单元存在
}
样式3为:判断数组单元值是否存在in_array()
$arr = array('a'=>'张龙' , 'b'=>'赵虎' , 'c'=>NULL);
if( in_array('赵虎',$arr) ) {
echo '赵虎存在';
} else {
echo '赵虎不存在'; --赵虎存在
}
样式4为:往数组尾部加入单元,并返回操作后的数组长度
$arr = array('a' , 'b' , 'c' , 'd');
echo array_push($arr, 'e'); -->5
样式5为:弹出尾部的单元,并显示弹出的单元
$arr = array('a' , 'b' , 'c' , 'd');
echo array_pop($arr); --> e
echo array_pop($arr); --> d
样式6为:数组头部增加单元,并返回操作后的数组长度
$arr = array('a' , 'b' , 'c' , 'd');
echo array_unshift($arr, 'z'); -->z a b c d
样式7为:弹出头部单元
$arr = array('a' , 'b' , 'c' , 'd');
echo array_shift($arr);
练习题1:
一种羊 第二年生一个小羊 第四年生一个小羊 第五年死 20年后有多少羊?
(计算机是从0开始算起)
$arr = array(1, 0, 0, 0, 0);
for($i=1;$i<=20;$i++) {
$tmp = $arr[1] + $arr[3];
array_unshift($arr, $tmp);
array_pop($arr);
}
echo array_sum($arr); -->178
练习题2:
n只猴子围坐成一个圈,按顺时针放心从1到n编号,然后从1号开始沿顺时针方向从1开始报数,报到m的猴子出局
再从刚出局猴子的下一个位置重新开始报数,从此重复,直至剩下一个猴子,它就是大王。
设计并编写程序,实现如下功能:
1、要求由用户输入开始时的猴子数n,报到的最后一个数m。
2、给出当选猴王的初始编号。
-------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------
10、超级全局变量
$_GET -->地址栏上获得的值
$_POST -->POST表单发送的数据
$_REQUEST -->既有GET,也有POST的内容
样式1为:表单html
<form action="122.php?id=3" method="post">
<p><input type="text" name="username" /></p>
<p><input type="subimt" value="提交" /></p>
</form>
--------------------------------------------------------------------------------------------
$_SESSION -->
$_COOKIE -->
$_FILES -->
--------------------------------------------------------------------------------------------
$_ENV -->服务器操作系统的环境变量,如操作系统类型--linux win mac 环境变量等等
容易暴露服务器信息,一般不允许显示
禁用方法:variables_order = "GPCS"
练习题:如果禁用了$_ENV变量,还有什么办法获取环境信息?
$_SERVER -->获取当前服务器,网站的域名,当前访问的脚本,客户IP
获取客户IP地址:(REMOTE_ADDR, HTTP_X_FORWARD_FOR)
--------------------------------------------------------------------------------------------
$GLOBALS -->是对全局变量花名册的一个别名,通过该变量,可以任意访问全局变量
样式1为:
$a = 3;
$b = 4;
function t(){
print_r($GLOBALS);
$GLOBALS['a'] = 99;
}
t(); -->a =3 b = 4
echo $a; -->99
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
11、常量
11.1意义:
声明后值不能修改
11.2声明:
define(常量名,常量值)
样式1为:
define('PI' , 3.14); --常量名字前不加$
echo PI;
命名规范:和变量一样,只不过习惯上全是大写
11.3特点:
声明后,值不能修改,也不能重新声明,也不能销毁unset (是针对变量的)
样式1为:
PI = 3.14;
echo PI; -->语法错误
11.4检测:defined()
样式1为:
PI = 3.14;
if(defined('PI')) {
echo '常量已存在';
} else {
echo '常量不存在';
}
样式2为:真实开发一般这样用 ,因为不知道常量是否存在,同时可以定义常量
if(!defined('HEI')){
define('HEI', 8846)
}
练习题:动词常量名,用变量的值做常量的名字,该如何做?
$chang = 'HEI';
echo $chang;
echo constant('HEI') -->根据常量值,获得常量名
--------------------------------------------------------------------------------------------
11.5案例
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
12、文件包含
作用:在于代码的重用,我们可以把常用的代码段写一个文件里,当需要用这些代码时,
引入这个文件就可以了。
include :
样式1为:
include('./**.php'); -->调用其它文件里的函数,相当于把**.php的文件内容替换本行,复制多行就是把**.php的内容运用多次
样式2为:
1.php --> $age +=1;
include('./1.php');
include('./1.php');
include('./1.php');
echo $age; --> 3 ,复制多行,相当于运行了多次
include_once:
样式3为:
1.php --> $age +=1;
include_once('./1.php');
include_once('./1.php');
include_once('./1.php');
echo $age; --> 2
注意:_once 的作用: 只引入1次,如果之前已引用过,不再重复引用
--------------------------------------------------------------------------------------------
require
require_once
--------------------------------------------------------------------------------------------
include和require的区别:如果引入文件不存在,include尽量往下执行,报warning
require则直接煲fatal error ,脚本立即停止执行
注意:
不加_once速度快些
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
13、位运算:是针对字节上的位来进行运算(8位),把位的0/1当成假/真,针对每个位上的逻辑运算,就是位运算
样式1为:
10进制 2进制
5 0000 0101
13 0000 1101
& -----------
0000 0101 <--echo 5 & 13; -->5
| 0000 1101 <--echo 5 | 13; -->13
^ ---------- 两者必须一样
0000 1001
~ ---------- 求反
样式2为:
echo 5 & 12; ---> 4
echo 5 | 12; ---> 13
样式3为:
echo 5 ^ 12; ---> 9
样式3为:
echo ~5 ; ---> -6
练习:利用位运算的左移,使整数增大2倍
$a = 3;
echo $a << 1; --> 6
echo $a << 2; --> 12
echo $a >> 1; --> 1
echo 8 >>2; --> 2
作业:
自定义函数实现10进制整数转16进制
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
14、进制详解
生活中常用10进制
计算机常用2进制,8进制,16进制
样式1为:10进制
echo 123; -->从右到左3位,分别以1顶1 以1顶10 以1顶 100
echo 1*3 + 10*2 + 100*1;
样式2为:8进制 ,前面加0代表8进制
echo 0123; -->从右到左3位,分别以1顶1 以1顶8 以1顶64
echo 027; --> 23
样式3为:16进制,前面加0x 代表16进制
echo 0x123; -->从右到左3位,分别以1顶1 以1顶16 以1顶256
echo 0x1c; -->28
样式4为: 2进制,PHP目前不支持直接表示
从右到左,分别以1顶1 以1顶2 以1顶4
10进制 2进制
5 0000 0101
255 1111 1111,128+64+32+16+8+4+2+1
-1 1111 1111 ,这8个1,到底理解成255 ,还是理解成-1 ,这个取决于程序
比如在Mysql中,int则理解为-1 ,usigned int 理解为255
注意:查找进制补码相关资料
计算机中的正负数,就是时钟的顺逆时钟的区别
练习题:
1、为什么程序员总是分不清万圣节 和圣诞节 ?
2、 /thread-9527-1-1.html
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
15、位运算与PHP错误报告设置
PHP脚本的错误,分多个等级,如致命错误,Notice ,warning, N多级,如何方便的设置报告错误?
PHP 把不同等级的级别,用数字来表示,比如:
1 E_ERROR(integer) 致命的运行时错误,这类错误一般是不可恢复的情况,例如内存分配导致的问题,后果是导致脚本终止运行
2 E_WARNING(integer) 运行时警告(非致命错误) ,仅给出提示信息,但是脚本不会终止运行
4
8
16
上面数字与2进制的关系是: 不同级别 1的位置就不同
0000 0001
0000 0010
0000 0100
0000 1000
综上,想报告所有错误,可以把所有错误级别 a | b | c....
样式1为:设置报告所有错误 -->注意:设置报告所有错误这样会把资料泄露出去的:如泄露网站地址
error_reporting(E_ALL);
样式2为:不报错误
error_reporting(0);
样式3为:想报所有错误,除了notiec的错误
error_reporting(E_ALL ^ E_NOTIEC);
或者:error_reporting(E_ALL & ~E_NOTIEC);
因为:echo E_NOTIEC; --> 8 -- 0000 1000
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
16、浮点数并不精确
样式1为:
if( (0.3 - 0.2) == 0.1) {
echo '相等';
} else {
echo '不等';
} --> 不等 (舍入)
原因:10进制:3.1 是 3 *10^0 + 1 * 10^ - 1;
3进制: 1.1 是 1* 3^0 + 1 * 3^ -1; 对应10进制,1.333333
10进制 2进制
0.5 0.1
0.8 0.1100..
某些小数在10进制下,是有限的,转成2进制要无限循环,因此,损失一些精度
导致浮点数计算和数学上结果不一致
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
17、逻辑运算的短路特性与运算符优先级
样式1为:
$house = false;
$car = true;
if($house && $car) {
echo '嫁';
} else {
echo '不嫁';
} -->房子已经为假,又用并且计算,结果为假,程序并不会去判断$car的值
样式2为:
$b = 1;
if( $house && ($b = 6) ) { $b =6 被短路 ,没有机会执行
} echo $b; --> 1
样式3为:
$b = 1;
if( $house || ($b = 6) ) { $b =6
} echo $b; --> 6
样式4为:
$b = 1;
if( $car || ($b = 6) ) { $b =1
} echo $b; --> 1
短路特性:一旦前面已经判断真假,后面就没有机会执行
短路特性的运用:
利用短路写出简短的判断代码
样式5为:
if(!defind('PI')) {
define('PI', 3.14);
}
短路写出:省略了if 结构
defined('PI')||defined('PI', 3.14); 前面为真,后面就不会执行
练习题:
$a = 3;
$b = 5;
if ($a = 5 || $b = 7) {
$a++; -->这里得到布尔值true
$b++;
}
echo $a; --> 1 布尔值true显示效果为 1
echo $B; --> 6
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
18、递归
18.1递归概念
样式1为:
function sum($n) {
if($n==1) {
reture 1;
}
ruture $n + sum($n - 1);
}
echo sum(100);
-------------------------------------------------------------------------------------
18.2递归技巧与案列
技巧:假设法--假设自己的函数已经完成
样式1为:用递归打印当前目录下的所有文件,目录及子目录 ...
function print_r($path,$lev=1) {
$dh = opendir($path);
whlie( $row=readdir($dh)) !== false) {
echo str_repeat(' ',$lev) , $row,'<br />';
if('.'== $row ||'..'==$row) {
continue;
}
if(is_dir($path . '/' . $row)) {
printdir($path . '/' . $row , $lev +1)
}
}
closedir($dh);
}
$path = '.';
printdir($path)
-------------------------------------------------------------------------------------
18.3递归与静态变量
样式1为:
function t() {
$a = 10;
$a += 1;
reture $a;
}
echo t(); --> 11
echo t(); --> 11
echo t(); --> 11
样式2为:
function t() {
statci $a = 10;
$a +=1;
return $a;
}
echo t(); --> 11
echo t(); --> 12
echo t(); --> 13
static 变量有一个特点,在第一次函数调用声明之后存在,且不随函数结束而结束
当函数再次调用时,可以直接利用上次的结果
样式3为:写递归函数,计算所有单元的和
$arr = $array(1,2,3,array(4,arrary(5,6)));
function sum($arr) {
static $sum = 0;
foreach ($arr as $v) {
if(is_array($v)) {
sum($v);
} else {
$sum +=$v;
}
}
echo $sum,'<br />';
return $sum;
}
echo sum($arr)
-------------------------------------------------------------------------------------
18.4递归练习题
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
19、程序练习
19.1 IP,域名,DNS,host概念
IP有 2^32 --> 42亿
域名 --> 解析成 --> IP
DNS服务器:用户把域名发送到DNS服务器上,服务器把域名解析成相应的IP地址,也叫做域名解析
在本地机上模拟域名:在c盘 window -system32 - drivrs -etc -host文件上添加域名,如
126.0.0.1 a.com -->在浏览器上输入a.com ,就可以访问相对应的文件
(原因:解析的优先权:谁离的近,就先解析谁) ,a.com 是本地机上的域名,所有就会先解析本地,远程的就不再解析
-------------------------------------------------------------------------------------
19.2 apache安装与虚拟主机配置
为什么要安装apache:
apache就是提供网页服务,客户访问网页html(html网页交给了apache管理)的时候,apache就会响应给客户.
每个软件都有其相应的端口,apache上网时的端口一般是80.
apache响应的是静态文件,如GIF/CSS/HTML
apache 访问htdocs文件里的网页,但是不理解PHP程序语言,所以需要要PHP解释器
虚拟主机:一个apache 提供多个网站域名的服务
如何然spache服务多个虚拟IP:
方法如下
1、 找到spache/conf文件夹下的 httpd 文件 (vhost配置虚拟主机服务)
找到语句:
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf -->删掉这句的# ,就可以支持虚拟主机的配置了,
2、找到conf文件夹下的 extra 文件夹 里面的httpd-vhost.conf 添加语句:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "D:/docs/htdocs/b.com" -->这个就需要响应b.com目录下的文件给我
ServerName b.com -->我在浏览器上输入这个
ErrorLog "logs/dummy-host2.a.com-error.log"
CustomLog "logs/dummy-host2.a.com-access.log" common
</VirtualHost>
3、要重启apache
4、在htdocs文件夹里添加命名为b.com的文件夹
5、在c盘window -system32 - drivrs -etc -host文件最后添加:
127.0.0.1 b.com
-------------------------------------------------------------------------------------
19.3 整合PHP
流程:
php 1、解压php-5.4.28-Win32-VC9-x86到某盘php文件里
2、在php文件里找到 php.ini-development 复制一份并改为 php.ini文件
3、找到php.ini文件里的语句:
; extension_dir = "ext" -->改为:extension_dir = "D:/php/ext"
apache 4、打开apache/conf/httpd文件 里的语法:
在<IfModule mime_module> 前面添加语句:
PHPIniDir "D:/php" --> 存放文件
LoadModule php5_module "D:/php/php5apache2_2.dll" --> 桥梁
LoadFile "D:/php/libeay32.dll"
LoadFile "D:/php/ssleay32.dll"
#.php -->php解释器
AddType application/x-httpd-php .php -->
注释:php文件夹里的 php5apache2_2.dll 就是php和apache的桥梁
5、安装:文件
vcredist_x86_2005
vcredist_x86_2008
vcredist_x86_2010
6、要是还是不行可以通过命令查找问题
cmd --> ??
-------------------------------------------------------------------------------------
19.4 安装mysql
1、常规安装
2、找到 "D:/docs/htdocs/b.com文件里新建a.php 文件,里面写:
var_dump(mysql_connect('127.0.0.1','root','admin'));
127.0.0.1 默认的网址
root默认的目录
admin 安装时填写的密码
3、找到D:/php/php.int 文件里的:
;extension=php_mysql.dll -->修改为:extension=php_mysql.dll
4、重启apachce
5、浏览器打开a.php 会显示: resource(3) of type (mysql link)
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
20、mysql入门语句
sql查询语言
数据库服务器 mysql
库 database
表 table
1、连接到数据库服务器
cmd --> 输入连接命令: mysql -h localhost -u root -p admin
mysql :数据库
-h localhost :指定哪个数据库
-u root :默认的目录
-p admin :登录密码
------>cmd得到:
mysql>
2、查看所有库:输入
mysql> show databases
--->得到有哪些库
3、选择库:输入
mysql> use test(库名)
4、查看库下面的表:输入
mysql>show tables
5、建表:
creat table msg ( -->msg是存储的文件
id int auto_increment primary key,
title varchar(200), -->存标题
content varchar(200), -->存内容
pubtime int
)charset utf8;
6、告诉服务器你的字符集
set names gbk/utf8; -->客户端是什么字符集就写什么
7、添加数据:输入
mysql>insert into msg (id,content,pubtime) values (1,'逗你玩',1312345);
select * from msg -->显示新建的表
set names gbk; -->表格会显示乱码文字,因为客户端是gpk ,而服务器是utf8
8、查询所有数据
select * from msg;
9、按id查询一行
select * from msg where id=2; -->取出id=2 的数据
10、快速清空表
truncate 表名
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
21、留言提交到mysql
1、开始留言 -->已经建好的表单
2、连接mysql:规划好放到哪个文件
语句:
$conn = mysql_connect('192.168.1.100','root','密码');
发送查询:
mysql_query('use test' , $conn);
mysql_query('set names utf8' , $conn);
接收POST数据:
$sql = insert into liuyan (tltle,content,pubtime) values ('" .$_POST['tielt'] . "','" . $_POST['content']."',".time() .")";
注意:反浏览器反馈的信息,复制粘贴到 cmd mysql> *** 可以及时查询问题
3、发送:
if(mysql_query($sql,$conn)) {
echo '留言成功';
} else {
echo '留言失败';
}
4、查询
$sql = 'select' * from liuyan;
mysql_query($sql,$conn);
5、读取:
while($row = mysql_fetch_assoc($rs)) {
echo '<li><a href="du.php?id=',$row['id'],'">',$row['title'],'</li>';
}
建立du.php文件,通过地址栏来确定你要读哪条留言
代码为:
<?php
$coon = mysql_connect('192.168.1.100','root',',');
mysql_query('use test' , $conn);
mysql_query('set names tuf8' , $conn);
$id = $_GET['id'];
$sql = 'select * from liuyan where id=' . $id;
$rs = mysql_query($sql,$conn);
$row = mysql_fetch_assoc($rs);
?>
<h1><?php echo $row['title']; ?></h1>
<p><?php echo $row['content']; ?></p>