现在的位置: 首页 > 其他 > 正文

PHP入门笔记

2014年09月23日 其他 ⁄ 共 28614字 暂无评论 ⁄ 阅读 1,059 次

笔记参考:

1、  《PHP从入门到精通(第2版)》;

2、  《PHP与MySQL程序设计(第4版)》;

3、  《细说PHP(第2版)》;

4、  《PHP和MySQL Web开发(第4版)》;

5、  《深入PHP:面向对象、模式与实践(第3版)》;

6、  w3school、PHP中文手册等网络资源;

入门书目推荐:零基础入门建议从1开始,这本书讲的挺系统,很容易理解,不过讲的不够深,但正适合入门;入门之后可以简单过一下3相当于系统回顾,重点理解一下对象和类那一章;之后时间若充足可以看看4,想更深入学习可看5。不过编程这种事,学和做永远距离很远,想学好还是得不停的coding,在coding中成长。

【PHP基础】

PHP作为一种web语言,其代码需要与html代码相区分,故需要有外部标记,常见标记风格为<?php…?>

PHP注释风格,单行注释有//和#两种,多行用/*…*/,注释也是需要在<?php…?>标记内;

\n(换行,LF即line feed行满)和\r(回车,CR即carriage return回车),\n和\r在windows中没区别,都可以当作回车符,但在linux中\n表示换到下一行却不会回到行首,\r表示光标移回行首,但仍在本行;

PHP中语句之间用分号(;)区分隔开,PHP脚本就是由一条条分号区分的语句组成;

rand(int_min,int_max)函数返回两个值之间(含两边界值)的一个随机整数;

在输出变量时,变量后面跟中文很容易忘记变量后面要有空格,而致使变量跟后面字符串连接在一起,报变量未定义的错误,解决这个问题可以在变量后加空格,也可以将变量放到字符串外面,然后为.去连接;

在echo等输出时,除了变量外其他符号基本都按原义输出不会执行,所以需要将某些需要符号来执行计算的表达式移到引号外,然后用.连接;

有些函数前加r就从后往前查了,r可以理解为reverse;加i就忽略大小写了,i可以理解为ignore;

在PHP教程中,解释函数时使用mixed表示一个参数可以接受多种不同类型,callback说明接受的是一个函数或对象等;

在函数内使用global关键字相当于对在函数内对变量进行了一次赋值,函数内原赋值会被覆盖;

对于非数组变量,也可以使用“$变量名[num]”来获取指定字符位置的字符;

PHP中关键字、用户定义的函数、类都对大小写不敏感,如写ECHO和echo是一样的,但在程序代码中变量大小写是敏感的!

 

【PHP输出】

echo str 输出一个或多个字符串,不带括号,比print速度快,可通过,实现多字符串输出;

print str 输出一个或多个字符串,不带括号,不能使用,实现多字符串输出;

printf(str,arg1…),格式化输出,可以输出由静态文本和一个或多个变量中存储的动态信息组成的混合语句,其中%d为有符号十进制整数、%f为浮点数、%s为字符串、%u为无符号十进制整数,其中%f浮点数可以通过在%和f之间用.数字来控制精度;

sprintf()与printf()相似,不过它格式化的字符串用于赋值;

vprintf(str,array)与printf()相似,不过它的参数是放在数组中,而不是一个个列;

vsprintf()与sprintf()相似,格式化的字符串用于赋值;

fprintf([file],str,arg1…)与printf()相似,不过它通过flie参数指定输出到文件;

print_r(array[,mode])用于输出数组,mode默认为false直接输出,为true则不输出用于赋值;

die(str),输出一条消息,并退出当前脚本,该函数时exit()函数的别名;

 

【PHP数据类型】

PHP一共支持8种原始类型,包括4种标量类型,即boolean(布尔型)、integer(整型)、float/double(浮点型,PHP4.0之前浮点标识为double)和string(字符型),2种复合类型,即array(数组)和object(对象),2种特殊类型即resource(资源)和NULL;

在PHP中不是只有false值才是假,0、”0”、空字符串(“”)、只声明没有赋值的数组等也被认为是false;

在PHP中有3种定义字符串的方式,分别是单引号(’)、双引号(”)和界定符(<<<),单双引号区别在于双引号变量会被替换,而单引号则将变量按普通字符输出不解释,定义字符串一般用单引号,这样减少符号转义(仅单引号转义)和变量解析,而双引号需要转义$符号;

界定符与双引号基本没区别,$也需要转义,<<<后直接跟标识字符串,后面不可有空格,结束标识符必须单独另起一行,并且不允许有空格;

复合数据类型包括两种,数组和对象,数组是一组类型相同的变量集合,对象是类的实例,使用new命令来创建;

数组中的每个数据称为一个元素,元素包括索引(也称键名)和值两个部分,元素的键名可以由数字或字符串组成,元素的值可以是多种数据类型,标量、数组、对象、资源以及PHP中支持的语法等;

编程语言所应用到的方法有两种:面向过程和面向对象,在PHP中用户可自由使用这两种该方法;

资源是一种特殊变量,又叫做句柄,保存到外部资源的一个引用,资源是通过专门的函数来建立和使用的;

空值表示没有为该变量设置任何值,被赋予空值的情况有3种:还没有赋任何值、被赋值null、被unset()函数处理过的变量,is_null()函数可用来判断变量是否为Null;

PHP数据类型转换,只需要在变量前加上括号括起来的需要转换的目标数据类型名即可,另外也可以使用settype()函数转换数据类型,它有两个参数,第一个参数为待转换变量,第二个参数为要转换为的数据类型,使用第一种方式转换数据类型不改变原变量,而settype()函数会改变原变量的值;

检测数据类型函数大体相似,都是“is_数据类型”形式,如is_bool()函数检查是否布尔型、is_object()检查是否为对象,另外特殊的为is_numeric()函数检查是否含数字;

 

【PHP常量】

PHP常量定义可以使用define(常量名,值,可选参),可选参确定大小写敏感,为true则不敏感,取值可以直接用常量名或用constant(常量名)函数,检查一个常量是否已定义可用defined(常量名)函数;

预定义常量,__FILE__(显示当前文件路径)、__LINE__(显示当前行数)、PHP_VERSION(当前PHP版本)、PHP_OS(当前操作系统)、E_ERROR(最近错误处)、E_WARNING(最近警告处)、E_PARSE(语法解析问题处)、E_NOTICE(不寻常提示处);

 

【PHP变量】

变量是指在程序执行过程中值可以变化的量,变量通过一个名字(变量名)来标识。系统为程序的每一个变量分配一个存储单元,变量名可以理解成计算机内存单元的命名。因此,借助变量名即可访问内存中的数据。变量名后要有空格,否则后面的字符会被误以为也是变量名的一部分。

PHP中使用变量不需要声明变量,可直接赋值,但不意味着可以不赋值而直接调用;

变量赋值有三种方式:

第一种是常见的直接赋值;

第二种变量间赋值,如把变量1的值赋给变量2,再改变变量1的值,则变量2的值不会改变;

第三种是引用赋值,它是用不同的变量名访问同一个变量内存,所有变量都相当于别名,当一个变量的值改变时其他变量值也会改变,在使用时在赋值=号后加&可实现引用(相当于起个别名);

引用和复制的区别在于:复制是将原变量内容复制下来,开辟一个新的内存空间来保存,而引用则是给变量的内容再起一个名字;

变量作用域有三种:

局部变量,在函数内部定义,函数退出后变量内存释放;

全局变量,在函数外部定义,作用于整个PHP文件,相当于在一个全局数组中,函数内部不可用,想用的话可用global关键字声明(使用该名称的全局变量);

静态变量,值会存储于内存中而不会在函数调用完后释放;

函数之外声明的变量拥有Global作用域,只能在函数以外访问;函数之内声明的变量拥有Local作用域,只能在函数内部访问

global关键字用于访问函数内的全局变量,在名为$GLOBALS[index]的数组中存储了所有的全局变量。

 

【PHP运算符】

包括算术运算(+-*/%++--)、字符串运算(.)、赋值运算(=、+=、-=、*=、/=、.=、%=)、逻辑运算符(and、or、&&、||、xor、!)、比较运算符(<、>、<=、>=、==、!=、===、!==)、错误控制运算符(@只要在发生错误的表达式前加即可)、三目运算符(表达式 ? ... : …如果表达式为真则执行?之后代码,否则执行:之后代码)。

 

【PHP函数】

函数就是将一些重复使用的功能写到一个独立的代码块中,在需要时单独调用,定义语法为:

function fun_name($str1,$str2…) {

fun_body;

}

函数传参:在调用有入参的函数时,需要向函数传递参数,被传入的参数称为实参,而函数定义的参数为形参;参数传递的方式有按值传递、按引用传递和默认参数3种:

按值传递,它将实参的值复制到对应的形参中,在函数内部的操作针对形参(相当于内存中一个新定义的值)进行,操作的结果不会影响到实参;实参名和形参名可以一样,也可以不一样,在相同时,调用函数时test($str),这个$str是实参,而函数内部若有$str,则为形参;当然,也可以在调用函数时不使用参数(变量),而直接使用值;

按引用传递,按引用传递就是将实参的内存地址传递到形参中,此时,若函数内部有对该参数的操作将直接影响内存中的值,则实参的值也会发生变化;引用传递的方式就是在函数定义参数时在其之前加个&号即可,在调用引用传递函数时必须有实参而不能是一个直接的值;

默认参数,也可称为可选参数,即该参数可以不传值,将使用定义函数时设定的默认值;使用默认参数时,参数必须放在非默认参数的右侧,否则函数会出错,且从PHP5开始默认参数也支持引用传递了,默认值设定直接在参数后跟=设值即可;

函数返回值:通常函数将返回值传递给调用者的方式是使用关键字return,但return语句只能返回一个参数,也即只能返回一个值,不能一次返回多个。如果要返回多个值,则需要在函数中定义一个数组,将返回值存储在数组中返回;

变量函数:函数调用时可以直接调用,也可以用变量后跟一对括号来实现变量式调用函数,一般先定义一个函数,然后定义一个变量且变量的值设为函数名,调用函数时直接在该变量后加括号传值即可实现;如:函数定义function test () {…},变量赋值$func=”test”,函数调用$func();

函数引用:不理解,暂弃;

取消引用:取消引用使用unset()函数,它只是断开了变量名和变量内容之间的绑定,而不是销毁变量内容,这点需要注意,如有两个变量其中一个引用另一个,则unset()其中一个,相当于该变量空了,但另外一个变量值不会变;

 

【PHP流程控制】

条件控制语句:

if语句:一般语法为“if (条件) 语句;”如果需要执行的语句不只一条,则可以使用{}符号以语句组形式执行;

IF语句:

语法:

if (条件) {

当条件为true时执行的代码;

}

IF…ELSE…语句:

语法:

if (条件) {

条件为true时执行的代码;

} else {

条件为false时执行的代码;

}

IF…ELSEIF…ELSE…语句:

if (条件) {

条件为true时执行的代码;

} elseif (条件1) {

条件1为true时执行的代码;

} else {

条件为false时执行的代码;

}

switch…case多重判断语句

switch (variable){

case value1:

statment1;

break;

case value2:

default:

default statement;

}

switch语句根据variable(变量)的值依次与value值比较,如果不相等则继续查找下一个case,如果相等则执行对应语句,直到switch语句结束或遇到break为止,若所有case不满足则执行default默认语句;

switch语句在执行时,即使遇到符合要求的case语句段,也会继续往下执行,而且后面case将不做判断直接执行语句,直到switch语句结束,为了避免时间和资源的浪费以及程序的正常执行,必须在每个case语句段后加上break语句;

循环控制语句:

while循环

语法:

while (条件为真) {

执行代码

}

do…while循环

语法:

do {

执行代码

} while (条件为真);

for循环

语法:

for (初值;条件;递归条件) {

执行代码;

}

foreach循环:

foreach循环是PHP4引进来的,只能用于数组,在PHP5中,又增加了对对象的支持,其语法为:

foreach ($array_name as $variable_name) statement或

foreach($array_name as $key_name => $variable_name) statement

foreach语句将遍历数组$array_name,每次循环时,将当前数组中的值赋给$variable_name(或是$key_name和$variable_name两者),同时,数组指针向后移动直到遍历结束。当使用foreach语句时,数组指针将自动被重置,所以不需要手动设置指针位置;

流程控制的另一种书写方式:

在包括多个判断、循环、函数的页面,仅匹配大括号{}可能麻烦,可以使用另一种书写方式,用冒号:代替左大括号,用endif、endwhile、endfor等代替右大括号。

break/continue跳出循环:

使用break可以终止当前循环,还可以在break后指定数字跳出指定层次循环;

continue可以终止本次循环而进入下一次循环,同时continue后也可以跟数字指定跳出几重循环;

 

【PHP字符串】

字符串是指由零个或多个字符构成的一个集合,主要包括数字字符、字母字符、特殊字符(#%&等)、不可见字符(如\n、\r、\t)等;其中,不可见字符是比较特殊的一组字符,它用来控制字符串格式化输出,在浏览器上不可见。

字符串函数:

字符串转义:

addslashes()、stripslashes()前者在字符串中“单双引反斜杠NULL”4种预定义字符前反斜杠进行转义,后者删除这4种预定义字符前的反斜杠;

addcslashes()、stripcslashes()前者在指定字符(每个字符单独处理)前加反斜杠,可通过第二个可选参数指定字符,其中还可用..表示范围,如a..d表示在a、b、c、d前均加反斜杠;后者去除非预定义字符前的反斜杠;

字符串统计:

strlen(str)函数获取字符串长度,其中汉字和中文标点占两个字符,数字、英文、小数点、下载线和空格点一个字符;

substr_count(str,search)在str中查找search出现次数并返回;

count_chars(str[,mode])根据mode确定模式返回数组或字符串,默认0则返回所有字符出现次数(其ASCII码为键名),1返回str中出现字符次数(其ASCII码为键名)、2返回str中未出现字符(ASCII码为键,0为值),3返回出现字符组成的不重复字符串,4返回未出现字符组成字符串;

str_word_count(str[,mode])返回字符中单词总数或单词数组,mode默认0返回单词个数,1返回数字索引所有单词,2返回位置及单词;

跟array_count_values()函数组合可以统计每个单词出现的次数;

strpos(str,find[,start])返回find字符在str字符中首次出现的位置,可选参数start确定开始搜索的位置;

stripos()跟strpos()类似,不过它不区分大小写;

strrpos()跟strpos()类似,不过它匹配最后一次出现,相当于从后往前匹配;

strripos()跟strrpos()类似,不过它不区分大小写;

字符串裁补:

trim()、rtrim()、ltrim(),去首尾空(包括\n、\r、\t等形式的空),也可以通过第二个可选参数指定首尾去除字符,chop()是rtrim()的别名;

str_pad(str,length[,pad_str][,pad_mode])将str补齐到length长度,默认使用空格可通过pad_str指定补齐字符,pad_mode指定补齐方式,默认左补齐STR_PAD_RIGHT,其他模式有STR_PAD_LEFT、STR_PAD_BOTH;

字符串截取:

substr(str,start[,length])返回字符串中指定位置开始指定长度的字符串,省略长度则到最后,在截取中文字符时,如果截取字符串中出现奇数,则会导致中文字符串乱码,因为一个中文字符由两个字节组成;

strstr(str,search[,option])在str中搜索search,若执行成功则返回包含search到最后的所有字符串,若未找到匹配字符则返回false;若search是数字(注,加了引号就是字符而不是数字了)则搜索这个数值的ASCII值相匹配字符;可选参数option是PHP5.3添加,该值默认false返回匹配位到结束,若为true则往前返回(不含匹配字符);

strchr()是strstr()的别名;

stristr(str,search[,option])与strstr()一样只是忽略大小写;

若仅检查存在性则使用速度更快、消耗内存更少的strpos()函数,效率最差的是preg_match();

strrchr(str,search)返回search最后一次匹配到结尾的字符,且search只能是单个字符,若为多个字符则仅采用第一个字符匹配,若为数字则匹配这个数值的ASCII值相匹配的字符;

strpbrk(str,search_list)在str中搜索search_list中每个字符,返回从找到的字符开始到最后的子字符串,若未找到则返回false;

字符串分割合并:

explode(split,str[,limit])根据分隔符split把str分隔成多元素数组,可选参数limit规定返回元素最大个数,若为正数则最多返回limit个元素,最后的元素将包含str的剩余部分,若为负数则返回除最后limit个元素外的所有元素,为0默认为1;

implode(split,array)将array中元素以separator合并到一起;

join()最implode()的别名;

chunk_split(str,length,split)将str分割成length长的小块并加sign组合成新字符串;

str_split(str,length)将str分割成length长的元素到数组中;

strtok(str,split)将str按一个或多个split分割成更小的字符串;

preg_split()

字符串替换:

str_replace(search,replace,str[,count])在str中查找search并全部替换为replace,count可选参数可为变量来输出替换次数;

str_ireplace()函数与str_replace()一样,只是它不区分大小 写;

substr_repalce(str,replace,start[,length])从start位置开始将str中字符替换为replace中字符,start为正数表示从开头数的个数,负数为从结尾数个数,0表示从开头开始;可选参数length确定在str中替换的字符长度,默认将后面全部替换,0表示不替换仅插入,正数表示替换个数,负数表示替换结束位置为str结尾往前查的个数,若负数位置超过了start位置则length值自动为0;

strtr(str,search,replace)或strtr(str,array),把str中search字符全替换为replace字符,或把str中跟array键名匹配的字符替换为值;

字符串比较:

strcmp(str1,str2)、strcasecmp(str1,str2)两函数以二进制比较每个字节,相同则返回0,str1大于str2则返回值大于0,否则返回值小于0,前者区分大小写后者不区分,常用于验证密码;

strnatcmp(str1,str2)、strnatcasecmp(str1,str2)与之前类似,只是在比较字符中数字时采用自然法则(2小于10)而非机器法则(2大于10,因为是2和1比);

strncmp(str1,str2,length)该函数比较两字符串前length个字符,其他与strcmp()相似;

substr_compare(str1,str2[,start1][,length][,case])比较str1和str2是否相同,start1确定str1字符开始比较的位置,length确定两字符串比较长度,case确定是否区分大小写;

字符串格式化:

number_format(number[,decimals[,decimalpoint,separator]])对数字进行格式化,第三四参数必须同时出现或不出现,一个参数时对number约整加千分号,两个参数时decimal规定保留小数位,四个参数时decimalpoint规定小数字符号separator规定千分号符号;

str_repeat(str,repeat)把字符串str重复repeat次数;

str_shuffle(str)把字符串str中字符随机打乱;

strrev(str)字符串字符反转;

strip_tags(str,allow)去除str中HMTL、XML和PHP标签,可通过allow参数保留指定标签;

strtolower()函数将字符串全部转换为小写字母并返回修改后的字符串;

strtoupper()函数将字符串全部转换为大写字母并返回修改后的字符串;

ucfirst()函数将字符串第一个字母字符转为大写,其他不变;

ucwords()函数将字符串中每一个单词的第一个字母变为大写,但原有大写不会处理;

字符转换:

chr(ascii)根据ascii值转换为相应字符;

ord(str)根据字符转换为相应ASCII码;

 

【正则表达式】

量词,+(一个或多个)、*(零个或多个)、?(一个或零个)、{n}(连续n个)、{m,n}(连续m以上或n个以下)、{n,}(连续n个以上);

^(表示字符串开始)、$(表示字符串结尾)、\<(单词开始)、\>(单词结束)、\b(单词边界);

.(表示除换行符外任意一个字符)、\w(任意一个英文字母下划线或数字)、\d(任意一个0~9的数字)、\s(任意一个空白符,空格、制表、换行)、\t(一个制表符)、\n(一个换行符)、\r(一个回车符);

\(转义字符);

中括号,[]表示一定范围内的任意单个字符,其中-表示范围,^表示取反;

圆括号作用较多:分组限定、分枝多选、反向引用、位置查找;

补充:

圆括号的反向引用:

反向引用,就是依靠子表达式的“记忆”功能来匹配连续出现的字串或字母。如果要匹配的字串不固定,那么就将括号内的字串写成一个正则表达式。如果使用了多个分组,那么可以用“\1”、“\2”来表示每个分组(顺序是从左到右),如:

(it)\1         匹配连续两个it               ([a-z])([1-9])\1\2

除了可以使用数字来表示分组外,还可以自己来指定分组名称,格式如:(?P<name>pattern),如:(?P<a>[a-z])(?P<b>[1-9])(?P=a)(?P=b)。

PHP中正则表达式(Perl风格)

PHP长期支持Perl正则表达式和POSIX正则表达式,不过在PHP5.3.0中废弃使用POSIX形式;

Perl风格的正则表达式其匹配模式外有双斜杠(/正则表达式/)包围,并可以在前斜杠前或后斜杠后加修饰符实现指定功能;

修饰符,i(忽略大小写搜索)、g(全局搜索)、m(字符串视为多行,^$可匹配每行开始结束,不写时默认m)、s(与m相反,将字符串视为一行,忽略换行符)、x(忽略空白和注释)、u(第一次匹配后停止,不进行贪婪模式);

比普通正则多出的无字符,\A(只匹配字符串开头);

PHP的正则表达式函数

preg_grep(pattern,array)返回array中匹配pattern的元素组成的数组;

preg_match(pattern,str)在str中匹配pattern,若存在则返回true,否则返回false;

preg_match_all(pattern,str[,$array])根据pattern匹配str,按array返回数组元素;

preg_quote(str[,char])将str中特殊字符自动转义,可选参数char中字符也会转义;

preg_replace(pattern,replace,str[,limit])将str中匹配pattern的字符替换为replace,可选参数limit指定;

preg_replace_callback(pattern,func_name,str[,limit])跟之前一样,只是replace内容需要是一个函数名;

preg_filter()函数操作方式等同于preg_replace(),只不过它不返回修改后的结果只返回匹配项;

preg_split(pattern,str[,limit])函数可按正则拆分字符串;

 

【PHP数组】

数组是一组数据集合,由键和值组成,这些键可以是数值键或关联键。如果说变量是存储单个值的容器,那么数组就是存储多个值的容器。

数组声明,一种方法是使用array()函数,另一种方法是直接通过数组元素赋值方式声明。

多维数组,一个数组的元素如果是一维数组,则称这个数组是二维数组。

遍历数组:

foreach是最常用的遍历数组的方法,它并非操作数组本身,而是操作数组的一个备份;

list()函数也可以遍历数组,它把数组中的值赋给一些变量,与array相似,它并不是真正的函数,而是语言结构;list()函数仅能用于数字索引数组,且数字索引从0开始;通常在循环中用list(var1…)=each(array)来给一系列变量赋值;

字符串与数组转换:

字符串与数组的转换在程序开发过程中经常使用,主要使用explode()函数和implode()函数实现。

数组函数:

数组统计:

count(array[,mode])统计array元素个数,可选参mode默认为0不递归统计,当统计二维等多维数组时需要设为1进行递归统计,需要注意的是对于多维数组,子数组本身也算一个元素;

sizeof()是count()的别名;

数组检索:

in_array(search,array[,bool])检查search值(多维数组时也可以以数组为元素搜索)是否存在于array的值中,存在则返回true,否则返回false;

array_key_exists(key,array)检查key值是否存在于array键名或索引中,存在则返回true,否则返回false;

array_search(search,array[,bool])查询search中值是否存在于array,存在则返回键名,否则返回false,可选参数为true时还检查给定值的类型;

数组值与键:

array_values(array)返回数组中所有值组成的数字索引数组;

array_keys(array[,search_value])返回数组中所有键名,若有可选参数则只返回该值的键名;

key(array)返回数组中当前指针所在位置的键名,不移指针;

current(array)返回数组中当前指针所在位置的值,不移指针;

each(array)返回数组中当前指针所在位置的键/值对,并将指针向后移一个,通常配合list()函数赋值,使用结束指针不会回首,需要reset();

list(var1[,var2…])把数组中的值赋给一些变量,与array()一样,它不是真正的函数而是语言结构,它仅能用于数值索引;在赋值时,可以通过占位不使用数组中全部元素;在变量是数组时需要注意,赋值时是从右到左的;

array_flip(array)交换数组中的键和值;

array_reverse(array[,bool])将数组元素反转,对数字索引数组,可选参数bool为true时键将跟随值一起反转,否则键将重新计数;

array_rand()函数随机返回数组中的一个或多个键;

数组指针:

next(array)将指针向后移一位,并返回该指针位置的值,没有更多位时返回false;

prev(array)将指针回移一位,并返回该指针位置的值,没有更多位时返回false;

reset(array)将指针移回第一位,并返回第一个元素的值,数组为空则返回false;

end(array)将指针移到最后一位,并返回最后一个元素值,数组为空则返回false;

数组元素增删:

array_unshift(array,value[,…])在数组开头插入一个或多个元素,数值键名则将重新计数,文字键名不受影响;

array_shift(array)将数组开头的一个元素删除,数组键名重新计数,文字键名不受影响;

array_push(array,value[,…])在数组结尾插入一个或多个元素,若加单个元素可直接赋值,而不使用这个函数以减少资源消耗;

array_pop(array)将数组最后一个元素删除;

数组元素重复:

array_unique(array)删除数组中重复的元素返回数组,它先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,其他忽略,这并不意味着在未排序的array中同一个值的第一个出现的键名会保留;

array_count_values(array)统计数组中所有值出现次数,返回一个数组,它以值为键名,出现次数为值;

数组排序:

sort()函数根据值对数组进行升序排序(不保持值键关联),asort()函数根据值升序保持值键关联排序,rsort()函数降序,arsort()同理,natsort()函数按人日常接受模式进行排序,natcasesort()与natsort()类似不同之处在于不区分大小写,ksort()函数按键升序,krsort()函数按键降序,usort()函数按用户自定义函数进行排序(第一个参数为数组,第二个为自定义函数);

shuffle()函数会把数组重新随机排序;

【PHP与Web交互】

表单:Web表单主要用来在网页中发送数据到服务器。

创建表单:使用<form>元素,其属性主要有:

name:表单名称;

method:表单提交方式,GET(URL发送)或POST(数据块发送),默认使用GET方法;

action:指向处理该表单页面的URL(相对位置或绝对位置),使用form表单时必须指定,它指定表单在提交时将内容发往何处进行处理;

enctype:设置表单内容的编码方式;

target:设置返回信息的显示方式,其属性值有:

_blank:将返回信息显示在新窗口中;

_parent:将返回信息显示在父级窗口中;

_self:将返回信息显示在当前窗口中;

_top:将返回信息显示在顶级窗口中;

表单元素:常见的表单元素标记有,输入域标记<input>、选择域标记<select>和<option>、文字域标记<textarea>等。

输入域标记<input>:

语法:<input name=”…” type=”…”>

参数name是输入域的名称,type确定输入域的类型(即样式),常见type取值有:

 

选择域标记<select>和<option>:

通过选择域标记可以建立一个列表或菜单,正常情况下只能看到一个选项,单击右侧下三角按钮打开菜单后才能看到全部选项。列表可以显示一定数量的选项,如果超出这个数量,会自动出现滚动条。

参数name表示选择域的名称,size表示列表的行数(值为1(有multiple属性时值为1也不是下拉)表示为下拉列表框,如大于1则表示列表框,size指定最大显示项数),value表示菜单选项值,multiple表示是否可以多选。菜单方式(平铺+滚动条)显示数据,列表方式(折叠)显示数据,两种方式如下:

 

文字域标记<textarea>:

文字域标记<textarea>用来制作多行的文字域,可以在其中输入更多的文本。

语法:<textarea name=”…” rows=… cols=… value=”…” warp=”…”>…</textarea>

参数name表示文字域的名称,rows表示文字域的行数,cols表示文字域的列数,value表示文字域的默认值,warp用于设定显示和送出时的换行方式,值为off表示不自动换行,值为hard表示自动硬回车换行,换行标记一同被发送到服务器,输出时也会换行,值为soft表示自动软回车换行,换行标记不会被发送到服务器,输出时仍然为一列。

 

PHP参数传递:

PHP参数传递常用的方法有3种:$_POST[]、$_GET[]、$_SESSION[],分别用于获取表单、URL与Session变量的值。其中,使用$_SESSION[]传参的方法获取的变量值,保存之后任何页面都可以使用,很消耗系统资源,需要慎重使用。

通常,对于input中复选框或select中multiple可多选模式等,一般name使用数组形式命名,方便通过循环取值。

对于input中flie,使用$_POST获取的是其上传前绝对地址;

URL参数编/解码:

如在参数中带有空格,则传递参数时就会发生错误,而URL编码后,空格转换成%20,这样就不会错误了,一般使用urlencode()函数实现。

对于URL传递的参数直接使用$_GET[]方法获取,而对于进行URL加密的查询字符串,则需要通过urldecode()函数进行解码。

 

【PHP与JavaScript】

JavaScript是一种基于对象和事件驱动并具有安全性能的解释型脚本语言,在功能上可实现网页特效,它由客户端浏览器解释执行。

数据类型:

字符串(双引单引号括起来)、数值型、布尔型、对象型(用于指定JavaScript程序中用到的对象)、Null值、Undefined(尚未被赋值变量)。

变量声明:

声明变量使用关键字var,声明变量同时也可以对变量进行赋值,也可以同时声明多个变量。若变量声明但并未赋值,则其默认值为undefined。若对已经赋值的变量,再次声明则相当于重新赋值。

注释://单行注释,/*…*/多行注释。

事件:

JavaScript是基于对象的语言,它最基本的特征就是采用事件驱动。事件是某些动作发生时产生的信号,引起事件发生的动作称之为触发事件。如:鼠标滑过、用户点击等。

 

HTML中嵌入JavaScript使用<script>标记,语法如下:

<script language=”javascript”>

</script>

其中,language=”javascript”也可以省略,因为该标记默认使用JavaScript脚本语言。

在HTML中通过“javascript:”可以调用JavaScript的方法;通过src属性可以指定外部的JavaScript文件(即JS文件,以.js为扩展名)的路径,从而引用对应的JS文件。

 

【PHP日期和时间】

date(time_format)函数根据设定格式返回当前日期时间,格式参数有m(月份数前带0)、n(月份不带0)、M(月份三字母)、F(完整英文月份)、d(日期,前带0)、j(日期前不带0)、S(日的充数后缀)、D(三字母的星期)、l(星期完文本)、w(星期数字表示)、W(一年中的星期号)、h(12小时制前带0)、H(24小时制前带0)、g(12小时制前不带0)、G(24小时制前不带0)、i(分钟前带0)、s(秒前带0)、Y(4位年)、a(小写上下午)、A(大写上下午)、E(时区标识)、z(年中某天)、t(月的天数28~31);

该函数有两个参数,第一个是时间格式,第二个可选参数默认为当前日期,可设定为其他日期;

获取当前月份和当月天数可用date(“F”)和date(“t”),但想获得指定月份天数就需要借助mktime()函数指定一个时间戳;

time()函数获取当前时间的unix时间戳,配合date()函数可转为人可读时间;

mktime(h,min,s,mon,d,y)函数生成给定时间,若未给定则返回当前时间,给定格式为“时,分,秒,月,日,年”,该函数常用于计算时间差,差值返回为秒;

strtotime(str_time[,now])函数可将任何英文文本的日期和时间解析为UNIX时间戳,其值相对于可选参数now返回,若省略则默认使用系统当前时间;

通常该函数配合date()转为可读形式;

PHP中时间不可以直接比较,所以可用该函数将时间解析为UNIX时间戳格式然后比较,小的时间发生的比较早;

使用该函数还可用当前时间跟设定时间比较来做倒计时功能;

getdate()函数将一个时间戳返回为一个由各部分组成的关联数组,返回元素及键名,0(纪元秒)、year(4位数年)、mon(月份数值)、month(月份完整)、wday(星期数值,日为0)、weekday(星期完全文件)、mday(月中日数值)、yday(一年中某日0~364)、hours(小时0~23)、minutes(分钟0~59)、seconds(秒0~59);

checkdate(month,day,year)函数验证日期的有效性,有效则返回true,否则false;

setlocale()函数可设置PHP本地化环境,常见两个参数,第一个为模式,第二个相应值,模式有LC_TIME(日期时间)、LC_NUMERIC(数值形式)、LC_MONETARY(货币形式)、LC_CTYPE(字符分类和转换)、LC_COLLATE(字符串比较)、LC_ALL(5种均包括);

strftime()函数根据setlocale()函数指定的本地化设置来格式化日期和时间;

getlastmod()函数根据页面的Last-Modified首部返回最后修改时间,配合date()函数可获得最后修改时间;

datetime()是PHP5.1之后的类构造函数,可使用new关键字设置日期或时间;

实例化后,想要格式化输出或获取时间某部分可使用format()方法,调用如$date->format(“Y-m-d h:i:sa”);

实例化Datetime对象,可以使用setDate()方法设置其日期,参数依次为“年,月,日”,然后可通过format()方法返回;

实例化对象后,可能使用setTime()方法设置其时间,参数依次为“时,分,秒(可选)”;

实例化后,modify()方法可修改日期时间,如modify(“+10 hours”);

计算两个日期之差可用diff()函数;

date_default_timezone_get()函数返回当前时区;

date_default_timezone_set()函数设置当前时区;

microtime()函数可返回微秒级时间;

 

【Cookie和Session】

Cookie和Session是两种不同的存储机制,Cookie是从一个web页到下一个web页的数据传递方法,存储在客户端;Session是让数据在页面中持续有效的方法,存储在服务器端。

Cookie的功能:

记录访客的某些信息,如用户访问网页次数、曾经输入过的信息、上次登录用户名等;

在页面之间传递变量,把变量从一个页面以Cookie形式保存以供下个页面读取,然而浏览器并不会保存页面上的任何变量信息,当页面被关闭时页面上的所有变量信息将随之消失;

将所查看的Internet页存储在Cookies临时文件夹中,可以提高以后浏览的速度;

创建Cookie:

创建Cookie可以通过setcookie()函数,其参数有name(设置变量名)、value(设定变量的值)、expire(设置失效时间,不设置则永久保存)、path(设置Cookie路径,默认当前目录)、domain(有效域名,设置根域名则对所有子域名均生效);

如:记录用户上次访问时间,先使用isset()函数检测$_COOKIE[“…”]中是否存在,若不存在则用setcookie()函数记录访问时间,value可以设置为date()来获取当前访问时间;

删除Cookie:

删除Cookie也使用setcookie()函数,只需要将第二个参数value设置为空值,过期时间设置为小于当前时间即可。

Session定义:

Session是指一个终端用户从进入系统到退出系统所经过的时间,是一个特定的时间概念。当启动一个Session会话时,会生成一个随机且唯一的session_id,也就是Session文件名,此时session_id存储在服务器的内存中,当关闭页面时此id会自动注销,重新登陆此页面,会再次生成一个随机且唯一的id。如果没有Session,那么用户每进入一个页面都需要登陆一次用户和密码。

创建会话:

创建一个会话需要通过以下步骤:启动会话->注册会话->使用会话->删除会话。

启动会话有两种方式:一种是使用session_start(viod)函数,另一种是使用session_register()函数为会话登陆一个变量来隐含地启动会话。session_start()函数在页面开始位置调用,然后会话变量被登录到数据$_SESSION。

session_register()使用要求设置php.ini文件的选项register_globals指令为on,然后重启Apache服务器,使用该函数时不需要调用session_start()函数,PHP会在注册变量之后隐含地调用session_start()函数。

注册会话是给$_SESSION[]数组赋值,使用会话是把数组值赋给变量。

删除会话有3种:删除单个会话、删除所有会话和结束当前会话3种。

删除单个会话只需要使用unset()函数直接注销$_SESSION数组中某个元素即可,千万注意元素名不需要丢了,否则会直接毁掉$_SESSION数组且不可恢复!

删除所有会话可以将一个空的数组赋值给$_SESSION,如:$_SESSION=array();

结束当前会话需要先注册所有会话变量,然后使用session_destroy()函数结束当前会话;

Session失效时间:有两种方法可以设置,一是在session_start()之前使用session_set_cookie_params(time)函数,time需要是一个被赋值时间的函数;另外可以使用setcookie()函数,如setcookie(session_name(),session_id(),time()+$time),session_name是Session名称,session_id是判断客户端用户的标识,$time是失效时间。

 

【PHP文件处理】

打开关闭:

fopen(filepath,mode)函数用来打开资源,被多函数引用为句柄,mode有r(只读)、r+(读写)、w(覆盖&新建只写)、w+(覆盖&新建读写)、a(追加&新建只写)、a+(追加&新建读写)、x(新建只写,若存在则报错)、x+(新建读写,若存在则报错);

fclose(handle)函数用于关闭文件释放资源;

文件读取:

readfile(fliepath)函数不需要资源句柄不需要echo/print等输出语句,直接读取整个文件立即输出到缓冲区并返回,读取出错返回false;

file(fliepath)函数将文件读取到数组中,各元素以换行符分隔,且换行符附加在每个元素末尾;

file_get_contents(filepath[,offset[,maxlen]])函数将文件中的内容读到字符串中,可选参数确定读取起始位置和读取长度,读取失败则返回false;

fgets(handle[,length])读取一行并返回最大值为length-1字节的字符串,在遇到换行符、EOF或读取了length-1个字节后停止,忽略length则读取到行结束;

fgetss(handle[,length[,allow_tags]])是fgets()的变体,用于读取一行数据,只是它会过滤掉HTML和PHP标签,allow_tags可指定不过滤的标签,如果希望从用户通过表单提交的输入中删除HTML标签,可使用strip_tags()函数;

fgetc(handle)一次从句柄中读取一个字符,遇到EOF则返回false值;

fread(handle,length)从handle资源中读取指定字节字符,当遇到EOF或指定字节时停止,遇到换行不停止,它有助于二进制文件,常与fliesize()函数配合读取整个文件;

fgetcsv()函数将解析标记为csv的文件中的每一行,常用三个参数,第一个参数为资源打开句柄,第二个参数确定读取最大长度,一般选择一个较大的数值,第三个参数确定分隔符;

fscanf()函数可以按照预定义格式解析资源,它有两个参数,第一个为资源句柄,第二个为格式形式,再配合list()函数可提取文本;

文件写入:

fwrite(handle,str[,length])将str的byte长写入handle指定文件,若总长小于length则全部写入,省略默认全写入,fputs()是它的别名;

flie_put_contents(fliepath,str[,mode])将str写入fliepath文件,不需要handle是PHP5新增函数;

文件操作:

copy(filepath1,filepath2)将filepath1文件拷贝到filepath2,成功返回true,否则返回false;

rename(filename1,filename2)将fliename1重命名为filename2;

unlink(filepath)删除文件;

delete(filepath)删除文件;

文件属性:

filesize(filepath)返回文件的大小,以字节为单位;

basename()函数返回路径的文件名部分,它有两个参数,第一个参数为路径,第二个可选参数指定忽略的后缀名;

dirname()函数返回路径的目录部分;

pathinfo()函数创建一个关联数组,键名为dirname(目录名)、basename(文件名+扩展名)、filename(文件名)、extension(扩展名),它有两个参数,第一个参数为目录,第二个可选参数可确定返回4属性中的哪一个,属性形如PATHINFO_FILENAME;

realpath()函数将相对路径返回为绝对路径;

fileatime()函数返回文件的最后访问时间;

filectime()函数返回文件的最后改变(不同时修改,包含权限、所有者、组等)时间;

filemtime()函数返回文件的最后修改(文件内容的修改)时间;

touch()函数设置文件的最后修改时间和访问时间,成功则返回true,否则false,它有三个参数,第一个参数为要修改的文件,第二个可选参数设定最后修改时间,省略则默认当前时间,第三个可选参数为最后访问时间,省略则默认当前时间,如果filename不存在,则将创建这个文件;

文件指针:

ftell(handle)返回文件指针当前位置的偏移量;

rewind(handle)将文件指针移回资源开头;

fseek(handle,offset[,mode])将指针移动到指定位置,offset指定偏移字节量,可选参数mode指定模式,默认SEEK_SET从开始位置计算,SEEK_CUR从指针当前位置开始计算,SEEK_END从末尾开始计算,此时偏移量必须为负;

feof(handle)判断文件是否已经到达末尾;

锁定文件:

flock(handle,mode)在向一个文本写入内容时,需要先锁定该文件,以防止其他用户同时修改文件,mode有LOCK_SH(共享锁,读取使用)、LOCK_EX(排它锁,写入使用)、LOCK_UN(释放锁)、LOCK_NB(防止锁堵塞);

目录操作:

opendir(dirpath)打开指定目录,成为目录句柄;

closedir(handle)关闭目录流;

scandir(dirpath[,order])返回路径中的文件和目录组成的数组,order默认0升序,1为降序;

mkdir(dirpath)创建目录;

rmdir(dirpath)删除目录,删除前必须为空,成功则返回true,否则false;

getcwd(void)返回当前目录;

chdir(direpath)把当前目录改为指定目录;

readdir(handle)返回目录中各层次的各个元素;

disk_free_space()函数返回指定目录所在磁盘分区的可用空间,以字节为单位;

disk_total_space()函数返回指定目录所在磁盘分区的总容量,以字节为单位;

 

文件上传:

文件上传可以通过HTTP协议来实现,要实现上传功能首先要在php.ini配置文件中对上传的限制,然后通过$_FILES的值对上传文件做一些限制和判断,最后使用move_uploaded_file()函数实现上传。

$_FILES变量存储的是上传文件的相关信息,它是一个二维数组,保存信息如下:

$_FILES[filename][name]存储上传文件的文件名;

$_FILES[filename][size]存储文件大小;

$_FILES[filename][tmp_name]存储文件上传时的临时文件名;

$_FILES[filename][type]上传文件的类型;

$_FILES[filename][error]存储上传文件的结果,返回0说明文件上传成功;

文件上传函数:

move_uploaded_file(filename,destination)将上传文件存储到指定位置,成功则返回true,否则返回false,其中filename是临时文件名,即$_FILES[tmp_name],destination是保存的新路径和名称;

 

【面对对象】

类是具备某项功能的抽象模型,对象是类进行实例化后的产物。

面向对象编程三大特点:封装性(隐蔽)、继承性(子类)和多态性(同一个类的不同对象,使用同一方法可以获得不同的结果)。

类通过class关键字定义,类中的函数被称为成员方法。函数和类方法的唯一区别是函数实现的是某个独立的功能,而类方法是实现类的一个行为,是类的一部分。

对于对象的理解,可以理解成一种类似于数组的变量,但数组中只能存储多个变量,而对象,不仅可以存储多个变量,还可以存储对变量进行操作的函数;

类中有属性和方法,其实可以直观的理解为变量声明和函数;

使用同一类声明的不同对象之间没有联系,他们相当于在内存中各自使用不同的空间存储;

对属性的访问包括赋值操作和取值操作,对象中成员的访问需要通过引用来完成,引用的方式为“$对象名->成员名”;

构造方法是对象创建完成后第一个被对象自动调用的方法,这是我们在对象中使用构造方法的原因;而析构方法是对象在销毁之前最后一个被对象自动调用的方法,这也是我们在对象中使用析构方法的原因;所以通常使用构造方法完成一些对象的初始化工作,使用析构方法完成一些对象在销毁前的清理工作;

类的使用,首先要对类进行实例化,实例化是通过关键字new来声明一个对象,调用方法时格式为“对象名->成员方法”。

类中的变量,也称为成员变量(也有称为属性或字段)。成员变量用来保存信息数据,或与成员方法进行交互来实现某项功能。

成员变量的使用和成员方法一样,只要把方法名换为成员名即可,格式为“对象名->成员变量”。

常量定义使用关键字const(constant)后跟常量名及赋值,注意,常量无$符号。

常量使用不需要实例化对象,直接由“类名::常量名”即可,其中::是作用域操作符,使用这个操作符可以在不创建对象的情况下调用类中的常量、变量和方法。

构造方法,通常用来初始化一些成员变量,不需要对变量一个个赋值。构造方法格式为:__construct(args[,…]),双下划线后跟construct。

在每个声明的类中都有一个称为构造方法的特殊成员方法,如果没有显式地声明它,类中都会默认存在一个没有参数列表并且内容为空的构造方法;如果显式地声明它则类中的默认构造方法将不会存在;

当创建一个对象时,构造方法就会被自动调用一次,即每次使用关键字new来实例化对象时都会自动调用构造方法,不能主动通过对象的引用调用构造方法;所以通常使用构造方法执行一些有用的初始化任务,比如对成员属性在创建对象的时候赋初初值等;

在PHP5中构造方法的名称为__construct(),但在之前版本中构造方法的方法名必须与类名相同,这种方法在PHP5中仍可使用;

可以在声明构造方法时使用默认参数,这样在创建对象时如果在构造参数中没有传入参数则使用默认参数为成员属性进行初始化;

析构方法,与构造方法作用相反,在对象销毁时调用,作用是释放内存。析构方法格式为:__destruct(void)。

通常对象的引用被赋予其他的值或者在页面运行结束时,对象都会失去引用,当堆内存段中的对象失去访问它的引用时,就不能被访问了,也就成为垃圾对象了;PHP中有垃圾回收机制,当对象不能被访问时自动启动垃圾回收程序,收回对象在堆中占用的内存空间,而析构方法正是在垃圾回收程序回收对象之前调用的;

析构函数不能带有任何参数;

对于多个对象在同一页面中,当页面结束对象均失去引用,自动调用析构函数;但因为对象的引用都是存放在栈内存中,而栈内存后进先出,最后创建的对象引用会被先释放执行析构函数;

封装:

通俗来讲封装就是限制对象中属性方法不被外部访问,以达到保护对象成员的作用。封装的实现可通过成员属性或方法声明时,使用private关键字。

一般来讲,类中的成员属性定义为private时,想要外部访问(赋值或取值)属性时需要借助公共方法。但是,如果以成员属性的读取和赋值非常频繁时,在类中为每个私有属性都定义可以在对象外部取值和赋值的公有方法,又非常繁琐。因此,在PHP5.1.0以后版本中,预定义了两个方法“__get()”和“__set()”用来完成对所用私有属性都能取值和赋值的操作,以及用来检查私有属性是否存在的方法“__isset()”和用来删除对象中私有属性的方法“__unset()”。

魔术方法:

__set(var,value):该方法的作用是在程序运行过程中为私有的成员属性设置值,它不需要有任何返回值。但它需要有两个参数,第一个是在为私有变量设置值时的属性名,第二个是其值。这个方法不需要主动调用,可以在方法前加private关键字防止用户调用,这个方法是在用户为私有属性设置值时自动调用。其方法体中可以先用if判断对入参做限制屏蔽(范围、取值等),最后设置值“$this->var = value;”。

__get(var):类中声明了__get()方法,则直接在对象的外部获取私有属性的值时,会自动调用此方法,返回私有属性的值(使用return)。同样,也可以在__get()方法中根据不同的属性,设置一些条件来控制私有属性的返回值,最后不需要限制的可直接返回值“return $this->var;”。

__isset(var):通常我们用isset()函数来检测变量是否存在,但检测对象中属性时,若其属性是private则外部无法访问,这个函数就不能起作用了。为了检测对象中私有属性,我们可以在类中添加__isset()方法,这样,在类外部使用isset()函数检测对象中私有属性时就会自动调用__isset()方法。在检测时,我们也可以针对特定属性做限制,最后返回语句一般为“return isset($this->var)”。

__unset(var):通常我们用unset()函数删除变量(其实是解除引用,并不是删除内存中值,若该值还有被其他变量引用,则值不会销毁,如果无其他引用,则PHP垃圾处理机制才会回收该内存),对于对象中属性,如果是公有可直接使用unset(),但如果是私有属性则外部无法访问。但如果类中有__unset()方法,在unset()删除私有属性时会自动调用__unset()方法来帮助我们实现。当然,在处理时我们也可以针对具体属性做限制判断(如不允许删除,则可判断后仅返回return),最后语句为“unset($this->var;)”。

继承

子类继承父类的所有成员变量和方法,包括构造函数,当子类被创建时,PHP会先在子类中查找构造方法。如果子类有自己的构造方法,PHP会先调用子类中的方法。当子类中没有时,PHP则去调用父类中的构造方法,这就是继承。继承是通过关键字extends来声明的,格式为:class subclass extends parentclass{…}。

PHP中不能定义重名的函数,也包括不能在同一个类中定义重名的方法,所以也就没有方法重载。但在子类中可以定义和父类同名的方法,这样在子类中就可以把父类中继承过来的方法重写。

在子类中,同名的函数会被覆盖,然后使用新的方法体,但有时候我们仅需要扩展父类的函数,而非完全重写。这时,如果再完全重写一遍父类的方法会有些繁琐,我们可以使用“parent::func_name()”来直接调用父类中方法体,然后再添加扩展语句。

在子类覆盖父类方法时一定要注意,在子类中重写的方法访问权限一定不能低于父类被覆盖的方法访问权限,即父类方法权限为protected则子类需要是protected或public,父类是public则子类也只能是public。

多态

多态存在两种形式:覆盖和重载。覆盖就是在子类中重用父类的方法,而在子类的对象中虽然调用的是父类中相同的方法,但返回的结果是不同的;重载是指一个标识符被用作多个函数名,且能够通过函数的参数个数或者参数类型将这些同名的函数区分开来,调用不发生混淆。其好处是可实现代码重用,不用为了对不同的参数类型或参数个数而写多个函数。

在PHP中,多态性指的就是方法的重写,方法重写是指一个子类中可以重新修改父类中的某些方法,使其具有自己的特性。得写要求子类的方法和父类的方法名称相同,这可以通过声明抽象类或接口来实现。

::域作用符:该操作符可以在没有实例化的情况下访问类中的方法变量,使用格式为:“关键字::变量名/常量名/方法名”,关键字有parent(调用父类中的方法、变量和常量)、self(调用当前类的静态成员和常量)、类名(调用本类的常量、变量和方法)。

属性声明:

public:可以在程序中的任何位置(类内、类外)被其他类和对象调用,子类可以继承和使用父类中所有的公共成员,省略关键字默认为public;

private:只能在所属类的内部被调用和修改,不可以在类外被访问,子类也不可以;

protected:可以在本类和子类中调用,其他地方则不可以调用;

final:被final修饰过的类和方法是最终版本,不可以再被继承,也不能再有子类;

static:

用static声明的静态方法只用调用静态变量,不能调用普通变量,普通方法可调用静态变量,可使用“self::变量名”也可以使用“类名->变量名”调用静态变量,即使对象被销毁静态变量依然存在;

当类第一次被加载时就已经分配了内存空间,所以直接调用静态成员的速度要快一点,但如果静态成员声明过多,空间一直被占用,反而会影响系统的功能;

不管类创建多少个对象,静态成员是唯一存在的,在多个对象之间共享的,因为使用static标识的成员是属于类的,所以与对象实例和其他类无关;

因为静态成员是属于类的,而不属于任何对象,所以内部引用不能用$this,我们可以使用self关键字来代表本类,以访问内部静态成员,虽然直接使用类名也可以但最好还是使用self关键字;

类外部访问静态变量,可以使用对象引用或类名访问,但通常选择使用类名来访问;

const:

在PHP中定义常量用define()函数完成,但在类中定义常量只能使用const关键字;

常量访问方法与静态变量相似,通过类名或内部使用self关键字访问,它不可通过对象访问;

常量的属性为只读,不能重新赋值,程序中试图改变则会出错,所以在声明常量时一定要给初值,因为没有其他方式后期给常量赋值;

常量使用时名称前不需要“$”符号,而且常量名通常大写;

克隆clone:

PHP5中的对象模型是通过引用来调用对象,但有时需要建立一个对象的副本,改变原来的对象时不希望影响到副本。如果使用new关键字重新创建对象,再为属性赋上相同的值,这样做会比较繁琐而且容易出错,这时,我们就需要使用关键字clone来实现,克隆对象格式为:

$object1 = new classname();

$object2 = clone $object1;

__clone()方法:有时除了单纯的克隆对象外,还需要克隆出来的对象拥有跟之前不同的属性和行为。这时,可以使用__clone()方法来实现,它的作用是在克隆对象时,调用__clone()方法使克隆出来的对象拥有自己的行为和属性;

__toString()

普通变量,我们可以使用echo等直接输出其值,而对象作为一种变量若使用这种方式则会出错。类为对象名相当于一个引用,它是一个存放在栈内存中的一个指针,指针存放对象在堆内存中的首地址的变量。

如果在类中添加__toString()方法,则直接输出对象时会自动调用该方法,并输出该方法中返回的字符串。

__call(func_name,args)

在调用对象时,若调用方法不存在则会出现系统报错,然后程序退出不再继续执行。但如果类中添加__call()方法,则调用方法不存在时会自动调用该方法,并且程序可以继续执行。

通常,可以设置__call()方法体为提示用户调用的方法和参数列表内容不存在,若调用时为多参数则args返回一个数组;

自动加载类:

在设计面向对象的程序开发时,通常为每个类都单独建一个PHP源文件。在PHP文件中要使用类,需要使用include包含类所在的源文件。若需要多个类,则需要写多条语句,这些比较麻烦。

在PHP中,我们可以使用__autoload()全局函数来实现以上功能。这样,在文件中使用未包含的类时,若该函数存在则会自动调用,并以类名(取类名时PHP会自动全转为小写)为参数传入该函数中。然后,可以用字符串拼接等,将类名所在文件拼接出来,如:

function __autoload($className){

include(“class_”.ucfirst($className).”.php”);

}

该类名的命名统一为“class_首字母大写类名.php”,对类文件名的统一可以方便包含引用。

对象串行化:

对象是一种在内存中存储的数据类型,它的寿命通常随着生成该对象的程序的终止而终止。然而,有时可能需要将对象的状态保存下来,需要时再将对象恢复,这种行为叫做对象的串行化(serialization)。

串行化会把整个对象转化为二进制字符串,这样可以满足:

对象需要在网络中传输时,将对象串行化成二进制串后在网络中传输;

对象需要持久保存时,将对象串行化后写入文件或者数据库中;

serialize(objectName)函数用来串行化一个对象,把对象转化为二进制的字符串;

unserialize(objectName)函数反串行化对象,将对象串行化后转化的二进制字符串再转化为对象;

在串行化和反串行化时实际调用了两个魔术方法__sleep()和__wakeup(),直接使用这两个方法也可以实现部分成员串行化。

__sleep()不需要接受任何参数,但需要返回一个数组,在数组中包含需要串行化的属性。未被包含在数组中的属性成员将在串行化时被忽略,如果没有在类中声明__sleep()方法,对象中的所有属性都将被串行化。

抽象类:

抽象类和接口相似,都是一种比较特殊的类。抽象类是一种特殊的类,而接口也是一种特殊的抽象类。它们通常配合面向对象的多态性一起使用。

抽象方法就是没有方法体的方法,所谓的没有方法体是指在方法声明时没有花括号以及其中的内容,而是在声明方法时直接在方法名后加上分号结束。另外在声明抽象方法时,还要使用关键字abstract来修饰。

只要在声明类时有一个方法是抽象方法,那么这个类就是抽象类。抽象类也要使用abstract关键字来修饰,在抽象类中可以有不是抽象的成员方法和成员属性,但访问权限不能使用private关键字修改为私有。

抽象类中有没有被实现的抽象方法,所以抽象类是不能被实例化的,即创建不了对象,也就不能直接使用。抽象类是由子类实现的,就是将抽象类作为子类重载的模板使用,定义抽象类就相当于定义了一种规范,这种规范要求子类去遵守。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,所以还是抽象类,也不能被实例化对象。

接口:

因为PHP只支持单继承,也就是说每个类只能继承一个父类。如果声明的新类继承抽象类实现模板后,它就不能再有其他父类了。为了解决这个问题,PHP引入了接口。

接口中声明的方法必须都是抽象方法,另外不能在接口中声明变量,只能使用const关键字声明为常量的成员属性,而且接口中所有成员都必须有public的访问权限。

接口的声明通过关键字interface标识。

接口中所有的方法都要求是抽象方法,所以就不需要方法前使用abstract关键字标识了,而且接口中也不需要显式地使用public访问权限进行修饰,因为默认权限就是public。

接口和抽象类一样不能实例化对象,也需要通过子类来实现。但可以直接使用接口名称在接口外获取常量的值。

使用extends关键字可以让一个接口去继承另一个接口,实现接口之间的扩展。

如果需要使用接口中的成员,需要通过子类去实现接口中的全部抽象方法,然后创建子类的对象去调用在子类中实现后的方法。

通过类去继承接口时需要使用implements关键字,而不是extends。

如果需要使用抽象类去实现接口中的部分方法,也需要使用implements关键字来实现。但要想实例化对象,这个抽象类还要有子类把它所有的抽象方法都实现才行。

PHP是单继承的,一个类只能有一个父类,但是一个类可以实现多个接口。将要实现的多个接口之间使用逗号分隔,而且在子类中要将所有接口中的抽象方法全部实现才可以创建对象。

实现多个接口是使用implements关键字,同时还可以使用extends关键字继承一个类。即在继承一个类的同时实现多个接口,但一定要先使用extends继承一类再去使用implements实现多个接口。

instanceof该操作符可以检测当前对象是否属于指定类,语法格式为:“object instanceof classname”,属于则返回true,否则false;

 

【MySQL】(个人从事数据库开发,故本内容不作笔记)

mysql –u… -p…:登陆数据库,需要注意的是-u和-p之后无空格,且结束无分号;

SHOW DATABASES:查看所有数据库名;

USE DATABASE:连接特定数据库使用该命令,语法格式如:“USE 数据库名;”;

创建/删除数据库:

创建数据库使用“CREATE DATABASE 数据库名;”语句;

删除数据库使用“DROP DATABASE 数据库名;”语句;

查看表结构:

SHOW [FULL]COLUMNS FROM 表名 FROM 数据库名;

SHOW [FULL]COLUMNS FROM 表名.数据库名;

或使用DESCRIBE语句:

DESCRIBE 数据表名;  或简化为 DESC 数据表名;

查看具体列也可以“DESCRIBE 数据表名 列名”;

在select语句中结尾使用limit …关键字可以限定输出的查询结果;

 

【PHP操作MySQL】

连接服务器:mysql_connect(‘hostname’,’username’,’password’)函数,hostname为MySQL服务器的主机名或IP,省略端口号则默认3306,返回值用于表示数据库连接,返回一个资源。

如果在多个网页中都要频繁进行数据库访问,则可以建立与数据库服务器的持续连接来提高效率。因为每次连接服务器需要较长时间和资源,持续连接会更有效。建立持续连接调用函数mysql_pconnect()代替mysql_connect()函数。程序结束时不需要mysql_close()关闭,下次使用mysql_pconnect()时直接返回已经建立持续连接的ID号。

选择服务器:mysql_select_db(数据库名[,handle])函数,省略连接handle则使用上一个打开的连接;

执行SQL语句:mysql_query(query[,handle])函数,在query中的SQL语句不必以分号“;”结尾,select语句成功则返回结果集,否则false,insert、delete等成功返回true;

关闭结果集:mysql_free_result($rerult);

关闭服务器:mysql_close($Link);

结果集获取:

mysql_fetch_array(query[,mode])query是mysql_query()函数返回的数据,可选参mode确定返回数组类型,默认MYSQL_BOTH(同时包含关联和数字索引数组)、MYSQL_ASSOC(关联数组)、MYSQL_NUM(数字索引);

mysql_fetch_object(query)与mysql_fetch_object()类似,不过它返回的是一个对象而不是一个数组,该函数只能通过字段名来访问数组,如$result->col_name;

mysql_fetch_row(query)从结果集中获取一行数据并作为数组返回,每个结果的列存储在一个数组的单元中,偏移量从0开始,如$row[0]访问第一个元素;

mysql_num_rows(query)获取由select语句查询到的结果集中行的数目;

php入门教程

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?