首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
Web开发
> 详细
php核心知识纲要总结以及学习路线
时间:
2016-04-05 00:06:18
阅读:
262
评论:
0
收藏:
0
[点我收藏+]
标签:
php介绍
缩写:Personal Home Page ==>>PHP:HypeText Preprocessor
历史
1995PHP/FI,Rasmus Lorderf,Personal Home Page
1997PHP/FI2.0,1998PHP3,2000PHP4,2005PHP5
应用范围:
web服务器端脚本
命令行脚本
应用程序图形界面
php运行环境
BS软件模式
浏览器软件若干
web服务器软件若干
后台程序语言若干
web运行流程:
浏览器输入地址,回车(发送请求)
根据规则找到对应web服务器。规则如下:
首先在本机hosts文件中找对应IP
如果hosts中没有找到,则到互联网上找对应IP
如果还是没有找到,则终止请求,返回“找不到服务器”提示
web服务器取得对应文件
如有需要,对该文件进行一定的处理(比如php代码执行)
将文件(或执行结果文件)返回给浏览器(返回应答)
浏览器接收到文件
浏览器处理文件(显示/执行)
PHP的命令行运行模式:
运行php文件:php.exe -f "php文件路径"
运行php代码:php.exe -r "php脚本代码"
web服务器运行模式
安装apache软件
测试apache
将php配置为apache模块:loadModule php5_module "php5apache2_2.dll路径"
告知apache何时调用php模块
方式1:FilesMatch〉setHandler "application/x-httpd-php"
方式2:addType application/x-httpd-php .php .php3
测试php运行:
配置php
使用phpinfo()测试。
确定php的配置文件
PHPIniDir 设定php.in文件位置
修改php配置
设置时区:timezone=PRC
设置扩展库目录:extension_dir
打开扩展库:mysql, mysqli
安装mysql数据库
安装过程:
相关配置过程:
设置环境变量以方便登录
对php.ini,可以打开对应扩展mysql
操作mysql数据库的基本流程
客户端连接mysql服务器
客户端发送命令(操作语句)
服务器执行语句
服务器返回执行结果
客户端展示执行结果
断开连接(退出登录)
虚拟主机基本配置
端口监听设置
主机配置的关键项
主机名:
主机目录:
目录的访问设置
Options
Order
Allow和Deny
AllowOverride
.htaccess文件
其他相关设置
默认页设置DirectoryIndex
主机别名设置ServerAlias
目录别名设置Alias
多域名虚拟主机配置:
打开主配置文件中的httpd-vhosts.conf开关
编辑多域名配置文件httpd-vhosts.conf
设定要进行多域名配置的IP及端口:NameVirtualHost *:80
一个一个主机进行配置:
设定主机域名:ServerName
设定主机目录:DocumentRoot
设定目录访问:Directory权限设定
PHP运行基本环境配置与设定
确定配置文件所在位置:用phpinfo.php查看
修改php的时区设定
设定php的标记形式:
典型(标准)标记形式
脚本形式<script language="php">
短标记形式:short_open_tag
结束标记有时可以省略
php基本语法形式:
区分大小写
是指变量名区分大小写
但函数名不区分
而系统中使用的关键字也不区分大小写,比如if, else, for
一条语句使用一个分号结束
最后一个分号可省略
php结束标记省略则不能省略最后一个分号
php注释形式
单行注释
//常规风格(推荐)
#配置文件风格
多行注释
多行注释技巧1:/*.... //*/
多行注释技巧2:if语句
变量:
含义:包含名称和值一个标识符
名称和值的关系可以称为“引用” (指向)
使用一个变量名其实是指使用该变量所“引用”(指向)的值
形式:变量必须以$开头,后面紧跟变量名
基本操作:
定义变量(赋值):
取值:
判断变量是否存在isset()
修改变量值(赋值):
删除unset():就是断开变量名跟数据之间的“引用关系”
变量命名基本规则
以字母或下划线开头
后跟任意数量(含0个)的字母,数字和下划线
命名推荐规则(行业规则):
骆驼命名法:
帕斯卡命名法:
下划线间隔法:
变量间传值方式:
赋值传值(值传递):在php中,变量之间默认都是“值传递”,即将一个变量的“内容”复制一份再赋值给另一个变量。
引用传值(引用传递):可以使用“&”运算符来强制引用传值,语法形式为:$v1 = &$v2;
例:$v1 = 10; $v2 = &$v1;
$v2 = 20;
则:echo $v1;//结果是20,这就是引用。
注意事项:对象和资源在某些语句中有时会被“误认为”是引用传值,其实不是的。例如:
$obj1 = new c1(); $obj1.age = 10; $obj2 = $obj1;
$obj2.age = 20;
echo $obj1.age;//结果是20,也改变了:这就好像是引用传值一样。但其实不是,因为变量中存储的并不是对象本身,而是对象的一个“标识符”,该标识符才指向(引用)对象本身。即“new”的时候,创建了一个对象的同时,也生成了一个标识符,该标识符指向了该对象,同时将该标识符赋值给了变量$obj1。赋值的时候,是“复制”了该标识符,然后再赋值给了另一个变量。
可变变量:
预定义变量(超全局变量/数组):
综述:
主要有:$_GET, $_POST, $_REQUEST, $_SERVER, $GLOBALS
均是数组
系统定义与维护
具有超全局作用域
不同情形下可能具有不同的值
$_GET:get请求(发送数据)的4种形式
<form method=”get” >
<a href=”abc.php?a=5&b=xyz”>内容</a>
location.href=”abc.php?a=5&b=xyz” ;
location.assign(“abc.php?a=5&b=xyz”);
$_POST
基本形式:<form method=”post” >
注意特殊的表单项的写法:多选通常要使用数组形式命名
另外,post方式时在action中还可以带参数,且作为get方式
$_REQUEST
实际是$_GET和$_POST的合集
如果两者有重名项,默认是$_POST项覆盖$_GET项
可以在php.ini配置文件中设定先后顺序,后者覆盖前者:request_order=GP
$_GET, $_POST, $_REQUEST三种数据是相互独立的。
$_SERVER:保存了服务器或客户端的有关信息。
常用的有:REMOTE_ADDR, DOCUMENT_ROOT, PHP_SELF
输出所有项(可能每台服务器有所差异)
$GLOBALS:保存了用户定义的所有全局变量的数据
常量:
含义:
定义形式:
使用define()函数定义
推荐常用名使用全大写形式
使用const语法定义
但const语法只能在“最顶层”的代码域中使用
也即,const语法不能在函数中或条件语句中或其他表示一个“范围”的语句中使用
使用(取值):
直接使用名字
或使用constant()函数
常量和变量的区别
定义形式不同:
使用形式不同:常量无需$符号
可变程度不同:常量的值不可以改变,常量也不可以销毁
作用范围不同:常量具有超全局作用域 (函数内外都可以直接使用)
可用类型不同:常量只能存储标量类型
判断常量是否存在:defined()
使用一个未定义的常量(特殊情况):
预定义常量:
比如M_PI, PHP_OS, PHP_VERSION,PHP_INT_MAX
参考手册〉保留字列表〉预定义常量
魔术常量
比如:__DIR__,__FILE__,__LINE__
魔术常量其实类似变量,其值随着不同代码而变化,不区分大小写
参考手册〉语言参考〉常量〉魔术常量
数据类型:
类型总体划分:
标量类型: int, float, string, bool
复合类型: array, object
特殊类型: null, resouce
整数类型:int, integer
整数的3种进制写法:
十进制写法:123
八进制写法: 0123
十六进制写法: 0x123
进制转换问题
十进制转二进制decbin(),除2取余倒着写
十进制转八进制decoct(),除8取余倒着写
十进制转十六进制dechex(),除16取余倒着写
二进制转十进制bindec(),每位数值乘以2的权值然后相加
八进制转十进制octdec() ,每位数值乘以8的权值然后相加
十六进制转十进制hexdec() ,每位数值乘以16的权值然后相加
注意:十进制转为其他进制结果是字符串,其他进制转为十进制要求给定数据是字符串形式
浮点数类型:float,double ,real
浮点数的2种写法:
小数写法:
科学计数法:
关于浮点数的细节知识
浮点数不应进行大小比较
小数转二进制的做法:乘2并顺序取整数部分
当整数运算的结果超出整数的范围后,会自动转换为浮点数。
字符串类型:string
单引号字符串:
双引号字符串:
定界符字符串heredoc:
定界符字符串nowdoc:
字符串中的变量:双引号和heredoc形式中可以识别
布尔类型:bool, boolean
被当作false的数据 :null, "", 0, 0.0, "0", array(), 未定义
其他的都会当作true
数组类型: array
定义:
赋值:
取值:
下标,键,key
值,value
元素顺序问题
对象类型: object
定义类:
创建对象:
对象属性操作:
对象方法操作:
资源类型:resource
含义:基本上都是指对外部数据的引用。
不是PHP语言通过某种语法形式“创造”的数据,而是外部本来就有该数据(比如数据库,文件,图片),PHP只是通过某种语法(或方式)来对其进行某些操作。
空类型:null
类型转换问题:
自动转换: 根据数据所使用的具体环境而可能会发生自动转换, 常见的自动转换情形如:
if(数据){}:转为bool类型
算术运算符:转为数字类型
连接运算符:转为字符串类型
比较运算符:转为布尔类型或数字类型
强制转换:
语法:(目标类型)数据
常见:(int), (float), (string), (bool)
类型相关的系统函数:
var_dump()
getType(), setType();
isset(), empty(), unset();
is_XX类型() 系列函数:
运算符
算术运算符:
一般
注意取余运算%,先取整,再取余
自增自减运算符
常规:对数字进行自加1或自减1。
字符串: 只能自增,且自增的效果就是“下一个字符”
布尔值递增递减无效
null递减无效,递增结果为1
前自增和后自增的区别(自减类似):
前++:先完成变量的递增运算,再取得该变量的值参与别的运算。
后++:先将原来变量的值临时存储,再将变量值递增,最后再将临时存储的值参与别的运算。
推论1:如果独立语句中进行自加运算,前自加后自加没有区别 。
推论2:如果前自加后自加是放在别的语句中,则会有所区别。
推论3: 前加加比后加加效率略高(在循环中建议使用前加加)。
比较运算符:
一般比较:
==和===比较
不要对浮点数直接进行大小比较
常见不同类型的比较
有布尔值,转为布尔值比较
有数字转为数字比较
两边都是纯数字字符串,转为数字比较
否则就按字符串比较
逻辑运算符:
短路现象
逻辑与短路:
逻辑或短路:
字符串运算符:
赋值运算符:
标准赋值
自赋值
条件(三目)运算符:
位运算符:
位运算符基本规则:
& : 两个都是1,结果才是1(有一个是0,结果就是0)
| : 两个都是0,结果才是0(有一个是1,结果就是1)
~ : 取二进制数字的相反值,即:~1的结果是0,~0的结果是1。
按位与运算(&):
按位或运算(|):
按位非运算(~):
按位左移运算(<<):
按位右移运算(>>):
按位异或运算(^):
补充介绍:原码,反码,补码
原码:一个数字的原始二进制形式,人可理解
反码:正数的反码是其本身(即不变),负数的反码:符号位不变,各位取反
补码:正数的补码是其本身(即不变),负数的补码:符号位不变,各位取反后加1(即反码加1)
补码还原:正数无需还原,负数:符号位不变,各位取反加1
计算机cpu中的运算,只有加法运算,没有减法运算
用补码来表示一个数,就可以将减法转换为加法:15-13相当于15+(-13)
举例计算:5+3, 5-3
应用:管理一组对象(事物)的开关状态
有些事物(数据)只有2个状态(值),此时可以称为“开关状态”,比如灯的亮灭状态,商品是否推荐状态
用二进制原理可以方便轻松管理多个该类事物的状态:
每个事物的状态用一个变量值来表示:$S1=1,$S2=2,$S3=4,$S4=8,$S5=16,...
则所有灯的总状态变量:$state = "11111"(2进制)就表示他们都是“开”的。$state = "10110"(2进制)就表示第一第四盏灯是关的,其余是开的。
判断某盏灯的状态(亮或灭):如果($state & $Sn)>0,则表示亮,否则表示灭(其中$Sn代表某盏灯,即$S1,$S2,$S3,$S4,$S5之一,下同)。
对于任意的初始状态,想要打开某盏灯:$state = $state | $Sn。
对于任意的初始状态,想要关闭某盏灯:$state = $state & ~$Sn。
数组运算符:+ == != <> === !==
联合(+):将右边的数组项合并到左边数组的后面,得到一个新数组。如有重复键,则结果以左边的为准
相等(==): 如果两个数组具有相同的键名和键值(可以顺序不同,或类型不同),则返回true
不相等(!=, <>) :如果两个数组不是相等(==),则返回true
全等(===):如果两个数组具有相同的键名和键值且顺序和类型都一样,则返回true
不全等(!==) : 如果两个数组不是全等(===),则返回true
错误控制运算符@:用于一个表达式的前面,以抑制该表达式可能产生的报错信息。
运算符的优先级问题
要意识到运算符有优先级问题
括号最优先,赋值最落后(通常)
先乘除后加减
大致:算术运算符〉比较运算符〉逻辑运算符(除了“非”运算)
流程控制:
流程图基本符号:开始结束,语句(块),判断,输入输出,走向
分支结构
if
if else
if else if(推荐)
if elseif
if else if else
switch
break的作用
不使用break的技巧
循环结构:
while
do while
for
foreach(用于数组遍历循环)
循环的中断
break
continue
中断层级
部分流程控制的替换语法:
if ( ... ) : 。。。。 endif;
if ( ... ) : 。。。else: 。。。 endif;
if ( ... ): 。。。elseif( ... ) : 。。。 elseif( ... ): 。。。 else: 。。。 endif;
switch( ... ) : case ... case ... endSwitch;
while(...): 。。。endwhile;
for(...; ...; ...): :。。。 endfor;
goto语句:
基本形式: goto Flag; ... Flag: .....
注意事项:
不能跳入循环中
不能跳入函数中
不能跳出函数外
不能跳出文件外
控制脚本执行进度
die() / exit();
sleep()
文件加载
综述和基本语法:include, require, include_once, require_once:
文件路径问题
相对路径: ./ ../
绝对路径: c:/abc/def/ 或:http://www.abc.com
无路径设定(只给出文件名,不推荐)
先在include_path设定的目录中找
没找到,则在网页文件所在目录下找(当前工作目录)
没找到,则在当前include命令所在文件的目录下找
include_path设置,set_include_path(), get_include_path()
文件载入和执行过程:
从include语句处退出php脚本模式(进入html代码模式)
载入include语句所设定的文件中的代码,并执行之(如同在当前文件中一样)
退出html模式重新进入php脚本模式,继续之后的代码
include_once 和include的区别
require 和 include的区别:引用失败(出错)时,include警告并继续,require终止。
require 和 require_once的区别
在被载入文件中 return 关键字的作用
默认情况下include载入成功返回1,载入失败返回false
但被包含的文件中可以使用return语句返回数据值并终止该文件的后续部分的执行
return返回的数据如同函数返回值一样可以进一步处理(比如赋值给其他变量)
错误处理:
错误的分类:
语法错误:程序没法运行,直接提示语法错误
运行时错误:只有程序运行到某行,或在某些特定的情形下运行才会发生的错误。
逻辑错误:程序从头到尾运行都没有发生(并提示)错误,但程序运行计算的结果是错误的。
错误分级与代号: 不同的错误会导致不同程度的程序运行反应,这就是错误的分级。 错误代号其实只是一个系统内部常量。也就是说,这些错误代号是一个系统预先定义好的数据,然后系统根据发生的不同错误情形,而分配不同的值供程序员使用来判断错误类型。
系统错误:E_ERROR, E_WARNING, E_NOTICE
用户错误:E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE
所有错误: E_ALL | E_STRICT
PHP手册〉函数参考〉影响PHP行为的扩展〉错误处理〉预定义常量
错误的触发:
程序运行时触发。
程序中通过触发函数来人为触发3种用户错误
trigger_error("错误提示文字", 错误类型T)
错误类型T:E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE之一
其中,系统关键错误(E_ERROR)或用户关键错误(E_USER_ERROR)一旦发生,则程序停止执行。
显示错误报告:
display_errors = On || Off ,或 ini_set("display_errors", 0或1);
error_reporting = E_ALL,或ini_set(‘error_reporting‘, E_ALL);
记录错误日志:
log_errors = On||Off, 或ini_set(‘log_errors‘, 1或0);
error_log = "错误日志文件名", 或ini_set(‘error_log‘, "错误日志文件名");
error_log = "syslog"则会将错误信息记录到系统日志去。
自定义错误处理器:
设定错误由我们自定义函数来处理:set_error_handler("函数名");
定义该函数,带4个参数:function errorHandler($errNo, $errMsg, $errFile, $errLine){...}
这样,发生错误之后,就会调用该函数来处理该错误
但如果发生系统关键错误(E_ERROR),则不会去调用自定义错误处理函数,而是会直接停止运行,并按php.ini的设定显示或记录错误信息。
除了系统关键错误,其他错误发生后则不会再去显示或记录错误了,而是按照自定义错误处理函数中的代码执行。
函数
基本使用
函数定义形式
函数调用形式
函数调用流程分析
开始调用:实际参数传数据给形式参数
程序执行流程进入到函数中(一个独立的运行空间),跟全局执行空间是隔离的
按常规的程序逻辑执行函数中的代码
如果碰到return语句,则终止函数的执行,跳回函数开始调用的位置;
如果执行到函数的最后位置,也同样跳回函数开始调用的位置
函数参数
形式参数,形参,parameter
实际参数,实参,arguement
参数的默认值
形式:形式参数上给其赋值(就是默认值)
要求:
默认值不能是对象或资源类型;
默认值只能是常量表达式,或常量,不能是变量
默认值参数必须放在非默认值参数的右边
调用函数的时候,对应有默认值的参数可以给值,也可以不给值
如果给值,则该对应形式参数使用给定的值
如果不给值,则该对应形式参数使用默认
参数传值问题
默认情况下,参数传值采用的是“值传递”的方式进行传值。
可以在形式参数的前面使用“&”符号,来达到“引用传递”的传值方式。
注意1:如果是引用传值,则实参只能是一个“变量”——也即变量跟变量之间才有引用传值方式问题。
注意2:引用传值的形参变量,在函数内部改变该形参变量的值,则对应实参变量的值也就改变。
参数的数量问题
常规:实际参数数量跟形式参数一致;
实际参数数量多于形式参数,不报错(很多其他语言是报错的);
实际参数数量少于形式参数,则分为:
实际参数数量少于形式参数的非默认参数数量,则报错
实际参数数量不少于形式参数的非默认参数数量,则不报错,不够部分,使用默认参数值
不定参数数量的情形:
类似:var_dump()可以传递不定个数的参数,如何做实现?
定义的时候不定义形式参数
在函数内部,使用func_get_args()获取所有传递过来的实际参数值,结果是一个数组
在函数内部,使用func_get_arg(n)获得第n个参数(n从0开始)
在函数内部,使用func_num_args()获得所有实际参数的个数
函数的返回值
在函数中,使用return语句后面跟一个数据(直接数据或变量数据或常量数据),就可以返回该数据(值)。
通常情况下,函数返回的数据都是以“值传递”的形式返回。
我们还可以使用强制引用返回(&)的形式来定义一个函数的返回值的返回方式,做法:
定义函数使用&符号:function
&
f1(){....}
调用函数使用&符号:$v1 =
&
f1();
要求:return语句返回的值必须是变量值(即变量)。
举例:函数中的一个静态变量的值,使用引用返回,则外部也可以修改其值。
函数的其他形式
可变函数:一个变量名后面带括号,则会被识别为可变函数:找到与该变量的值同名的函数并执行之。
匿名函数:没有名字的一个函数,可将其赋值给一个变量,然后该变量后面加括号就可以调用该函数
$f1 = function($p1, $p2) { ........ }
call_user_func_array($f1, array(1, 2));
或纯粹是一个没有名字的函数,且直接当作其他函数的参数(即改函数的参数是一个函数)。
call_user_func_array(
function($p1, $p2) { ........ }
, array(1, 2) )
这种当作其他函数参数的函数,通常称为“callable”(可调函数),或“callback”(回调函数)。
变量作用域
局部作用域(局部变量)
静态局部变量:静态变量只能赋值为一个直接的标量值,不能是计算值,或另一个变量值。
全局作用域(全局变量)
超全局作用域(超全局变量)
局部访问全局变量
使用$GLOBALS超全局数组
global关键字:本质是设定一个局部变量来引用某个全局变量,删掉该局部变量,全局变量仍然存在
$GLOBALS数组中的元素跟全局变量是一一对应关系。删掉(unset)一个,另一个也就没有了
使用$GLOBALS数组的一个新元素,则可以“创造”全局变量,如:$GLOBALS[‘vvv‘] = 1; #假设之前没有$vvv这个全局变量,则这一行之后就有了。
全局访问局部
通过引用传递的方式向形参传递一个引用实参变量
使用函数的引用返回形式
函数中使用global关键字来首次引用一个全局变量,则函数结束后在全局范围就可以使用该变量了
有关函数的系统函数
function_exists()
func_get_arg()
func_get_args()
func_num_args()
函数相关编程思想
递归思想
递推思想(迭代思想)
常用内部函数:
字符串函数:
输出与格式化:echo , print, printf, print_r, var_dump.
字符串去除与填充:trim, ltrim, rtrim, str_pad
字符串连接与分割:implode, join, explode, str_split
字符串截取:substr, strchr, strrchr,
字符串替换:str_replace, substr_replace
字符串长度与位置: strlen, strpos, strrpos,
字符转换:strtolower, strtoupper, lcfirst, ucfirst, ucwords
特殊字符处理:nl2br, addslashes, htmlspecialchars, htmlspecialchars_decode,
时间函数:
time, microtime, mktime, date, idate, strtotime, date_add, date_diff, date_default_timezone_set, date_default_timezone_get
数学函数:
max, min, round, ceil, floor, abs, sqrt, pow, round, rand
数组
数组基础
定义(多种形式)
取值
赋值(多种形式)
数组分类
从键值关系来分
关联数组
索引数组
从数组层次来分
一维数组
多维数组
混合数组
“维”的本质
数组遍历
foreach基本语法
数组指针操作与遍历原理
foreach遍历流程图
for+next遍历数组
while+each()+list()遍历数组
foreach遍历的细节探讨:
foreach也是正常的循环语法结构,可以有break和continue等操作。
遍历过程中值变量默认的传值方式是值传递。
遍历过程中值变量可以人为设定为引用传递:foreach($arr as $key => &$value){ ... }
foreach默认是原数组上进行遍历。但如果在遍历过程中对数组进行了某种修改或某种指针性操作,则会复制数组后在复制的数组上继续遍历循环。
foreach中如果值变量是引用传递,则无论如何都是在原数组上进行。
数组函数
指针操作函数: current, key, next, prev, reset, end, each
单元操作函数: array_pop,array_push, array_shift, array_unshift, array_slice, array_splice
排序函数: sort, asort, ksort, usort, rsort, arsort , krsort , shuffle,
查找函数: in_array, array_key_exists, array_search
其他函数: count, array_reverse, array_merge, array_sum, array_keys, array_values,array_map, array_walk, range
数组排序算法
冒泡排序
选择排序
插入排序
快速排序
数组查找算法
顺序查找
二分查找
面向对象编程
面向对象编程思想介绍:
传统的面向过程的编程思想:
将要实现的功能描述为一个从开始到结束的连续的“步骤(过程)”。
依次逐步完成这些步骤。如果步骤较大,又可以将该步骤再次细分为子步骤,以此类推。
程序从头开始执行一直到结尾并得到所需结果。
例子:完成来传智“报名学习”这件事,可以分为以下几步:
学生: 提出要报名,并提供姓名和照片
咨询老师: 接收照片并登记学生姓名
学生:缴费(付款到学校账号)并获得缴费凭证
咨询老师:验证凭证并分配班级
结果:报名完成,学生可以在规定的时间到规定的班级(教室)上课,数据库中就有了该学生的信息。
现代的面向对象的编程思想:
将要实现的功能描述为一个“对象/物体”完成的任务——现实中也是如此:功能的实现都是依赖于一个实体的“行动/操作/动作”。
完成该最终功能的过程中需要实现其他中间功能(过程),则再去调用其它对象(或也可能是自己本身)来实现该中间功能。
整个系统的完成(功能的实现)看作是一个一个对象在发挥其各自的“能力”并在内部进行协调有序的调用过程。
例子:完成来传智“报名学习”这件事,可以这样来处理:
学生对象:有姓名有照片,有所属班级,能“提出报名”,能“缴费”
咨询老师对象:能接收照片并登记姓名,能分配班级。
班级对象:有班号,有开班日期,有教室。
面向对象基本概念:
类与对象:
类是描述一类事物的一个总称,是具有相同特征特性的该类事物的一个通用名字(称呼);
比如人就是一个类(人类),狗也是一个类(狗类),它们又属于一个更大的类(哺乳类),桌子,手机,书都是一个类;
对象是一个明确的具体的“物体”,是某个类中的一个“实物”(相对来说,类就是一种抽象的泛称)。对象离不开类,或者说,对象一定隶属于某个类——有类才有对象,先有类再有对象。
比如“黄晓明”就是“人”这个类的一个具体对象,“阿黄”是“狗”这个类的一个具体对象。
一个类决定了一个对象所具有的所有特征特性信息,比如我是人类,则我有:姓名,性别,年龄,我还能吃饭,走路,说话。
一个对象的所有特征特性信息,都是由其所属的类决定的,但每个对象又很有可能有自己不同的特征特性信息,比如有个对象的名字叫吴六奇,性别男,会写程序,另一个对象可能叫章子怡,性别女,会演戏。
语法上,一个类内部可以具有自己的“变量”和“函数”,但此时在技术术语上就对应地称为“属性”和“方法”。一个类也可以有自己的常量。这些属性,方法和常量就都称为“类”的“成员”。
类的定义:
类中属性property:
类中方法method:
对象的创建:就是由一个类“创建”出一个具体的“物体”——专业说法就是对象。创建对象的语法可以有:
new 类名();
new 变量名(); //该变量的内容是一个表示类名的字符串。
new 对象名();//创建该对象所属类的一个新对象
new self; //用于在类的方法内部创建一个该类对象。
类名::getNew();//定义类的一个静态方法用于获取该类的一个对象
对象的使用:要么使用其属性,要么使用其方法。使用属性,就可以当作一个变量看待。使用方法,就可以当作一个函数看待。
对象的传值:
类中成员member:
一个类中能且只能包含如下3种成员(代码):变量(称为属性),函数(称为方法),常量(称为类常量)。
一般属性:
属性就是定义在类中的变量,需要使用public或var来修饰(定义),也可以使用protected或private来修饰(见后续知识)。
定义的时候可以不赋值,也可以赋(初)值,但只能是一个“直接值”(常量值)或常量,不能是变量值或计算值或函数调用返回值等。
属性的使用形式:对象名->属性名;
属性是可读可写的(可取值赋值)。
一般方法:
方法就是定义在类中的函数,但函数前可以使用public,protected, private修饰(见后续知识),也可以省略。
但该方法的调用(使用)不能独立进行,而是需要通过对象来调用。
方法中$this关键字具有特定含义:表示调用该方法的对象。
获取$this的所属类:get_class($this)
静态属性:
一个仅仅隶属于(依附于)类的属性,其是通过类名直接来取用的。
定义形式:[访问修饰符] static $静态属性名 [ = 初值];//访问修饰符省略则默认为public,初值也应该是直接值或常量
使用形式:类名::$静态属性名;//可取值可赋值;
静态方法:
一个仅仅隶属于(依附于)类的方法,其是通过类名直接调用的(不过新版php已经可以使用该类的对象名来调用了)
定义形式:[访问修饰符] static function $静态方法名(...){ ...... }
使用形式:类名::静态方法名(...);其中类名也可以用该类的对象名,一个内容为该类名的字符串变量名,self等来代替。
self关键字:用在方法中,表示该方法所在的类。
static关键字:代替self关键字的位置,除了具有self作用外,还具有更灵活的作用,那就是所谓“后期静态绑定”。
注意1:$this在静态方法中不能使用。
注意2:静态方法中不应调用非静态方法。
类常量:
一个仅仅隶属于(依附于)类的常量,其是通过类名直接来取用的(不过新版php已经可以使用该类的对象名来调用了)
定义形式:const 常量名 = 初值;//必须赋初值
使用形式:类名::常量名;其中类名也可以用该类的对象名,一个内容为该类名的字符串变量名,self等来代替。
构造方法(函数):
构造方法是一个类在进行实例化(new一个对象出来)的时候,会首先自动调用的方法。
构造方法适用于创建对象时(使用对象前)对该对象做一些初始化工作。
定义形式:[访问修饰符] function __construct(...){ ...... };//访问修饰符通常总是需要public(或省略)。
调用形式:实际上,没有直接的调用形式,而是在new一个对象的时候就调用了:new C1("小花",18,"女");
如果一个类中定义了构造方法,则实例化该类时就会调用该方法,且实例化时的参数需要跟构造方法的参数匹配。
如果一个类中没有定义构造方法,则会自动调用其父类的构造方法(如果有),则实例化时的参数需跟父类的构造方法的参数匹配。
也可以在当前类的构造方法中调用父类的构造方法:parent::__construct();
析构方法(函数):
析构方法是在一个对象被销毁的时候会自动调用(执行)的方法;对象销毁的几种情况:
脚本程序运行结束,自动销毁;
明确地unset()一个对象变量,则被销毁;
改变对象变量的值,被销毁;
析构方法适用于销毁对象时对对象中使用的一些资源进行清理(销毁)——不过实际上现代PHP已经内具了垃圾回收机制,一般无需清理。。
定义形式:function __destruct(){ ...... };//注意:只能是public的,且不能有参数
调用形式:无需在代码中手工调用,而是在代码运行结束时自动被调用(执行)。
如果一个类中定义了析构方法,则销毁对象时就会调用该方法。
如果一个类中没有定义析构方法,则销毁对象时就会调用其父类的析构方法(如果有)
类的继承:
基本含义:类是用来描述现实世界中同一种事物的共有特性的抽象模型。但现实世界中,不同种类的事物之间有往往有一些上下级或大小范围的关系。比如,动物是一个“类”,具有某些特性。但脊椎动物也是一个类,也具有一些特性,且同时具有动物类的所有特性。哺乳动物还是一个类,具有一些特性,并同时具有脊椎动物的所有特性。如此等等,则面向对象编程中,我们定义的类也同样可以具有类似的关系特征,这就是类的继承。
基本语法:extends
基本概念:
继承:一个类从另一个已有的类获得其特性,称为继承。
派生:从一个已有的类产生一个新的类,称为派生。
父类/子类:已有类为父类,新建类为子类。
单继承:一个类只能从一个上级类继承其特性信息。PHP和大多数面向对象的语言都是单继承模式。C++是多继承。
扩展:在子类中再来定义自己的一些新的特有的特性信息(属性,方法和常量)。没有扩展,继承也就没有意义了。
访问控制修饰符:
public公共的:在所有位置都可访问(使用)。
protected受保护的:只能再该类内部和该类的子类或父类中访问(使用)。
private私有的:只能在该类内部访问(使用)。
parent关键字:在类的内部用来表示(代表)该类的父类。可以用来访问父类的属性或方法或常量。
构造和析构方法中的调用上级同样方法的问题:
子类中没有定义构造方法时,会自动调用父类的构造方法。因此实例化子类时,需按照父类的构造方法的形式进行。
子类定义了自己的构造方法,则不会自动调用父类的构造方法,但可以手动调用:parent::__construct();
子类中没有定义析构方法时,会自动调用父类的析构方法。
子类定义了自己的析构方法,则不会自动调用父类的析构方法,但可以手动调用:parent::__destruct()
重写override
什么是重写?重写又叫“覆盖”,就是将从父类继承下来的属性或方法重新定义。只有保护的或公有的属性或方法能够被覆盖。
为什么要重写?因为父类的某个属性可能对于子类来说不够具体或详细,子类想要同样特性或功能的更准确或详细信息。
重写的基本要求:访问控制权限,方法的参数形式。
私有属性和私有方法的重写问题:私有属性和方法都不能覆盖,但其实子类可以定义跟父类私有的同名属性或方法。只是当作一个自身的新的属性或方法来看待而已。不过方法的参数必须一致。
构造方法的重写问题:构造方法不但可以像其他普通方法一样重写,而且,比普通方法更宽松:重写的时候参数可以不一致。
最终类final class:
最终方法final method:
设计模式:
工厂模式:一种专门用于“生产”其他各种类的对象的一个类
单例模式:一种只能从中实例化出来一个对象的类
类的“扩大化”技术:
抽象类,抽象方法:
一个类可以使用关键字abstract声明为抽象类;抽象类是不能实例化的类,只用作其他类的父类。
一个方法可以使用关键字abstract声明为抽象方法;抽象方法只需要声明方法头,不需要大括号部分的方法体。
一个类中有抽象方法,则该类必须声明为抽象类。
子类继承自一个抽象类,则子类必须实现父类中的所有抽象方法,除非子类也继续作为抽象类。
子类实现抽象父类的方法时,访问控制修饰符的范围不能降低,且方法的参数也须一致。
重载技术overloading:
属性重载:__set(), __get(), __isset(), __unset()
方法重载:__call(), __callstatic();
接口interface:
什么是接口?
为什么需要接口?
接口的定义形式:
接口的实现:使用接口被称为接口的“实现”(implements),其实就是类似“继承”
接口的多实现:
接口常量:
接口继承:
有关类或对象的其他相关技术:
类的自动加载:__autoload(), spl_autoload_register();
对象的复制(克隆):
对象的遍历:
PHP内置标准类:
对象的类型转换: 将得到一个标准类stdClass的对象
对象转换为对象:没有变化;
数组转换为对象:数组的键名当作属性名,值为对应值;
null转换为对象:空对象;
其他标量数据转换为对象:属性名为固定的“scalar”,值为该变量的值
类型约束:可以对函数(方法)的参数设定必须使用的类型。只能对对象,接口,数组进行约束。
与类有关的魔术常量:__CLASS__, __METHOD__
与类有关的其他魔术方法:
已学过的魔术方法:__construct, __destruct, __set(), __get(), __isset(), __unset(), __call(), __callstatic()
__sleep()和__wakeup(): 序列化操作的时候,会先调用__sleep()方法,反序列化操作的时候会先调用__wakeup()方法。
__tostring():将对象当作字符串来使用的时候,会自动调用该方法,以此来作为对象转换为字符串的结果数据。
__invoke():将对象当作函数来使用的时候,会自动调用该方法。
与类有关的系统函数:class_exists(), interface_exists(), get_class(),get_parent_class(), get_class_methods(), get_class_vars(), get_declared_classes()
与对象有关的系统函数:is_object(),get_object_vars()
与类有关的运算符:new,instanceof
面向对象编程思想的3个特征:封装,继承,多态。
php核心知识纲要总结以及学习路线
标签:
原文地址:http://www.cnblogs.com/bc8web/p/5352592.html
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
36.VUE — 认识 Webpack 和 安装
2021-07-28
【PHP】上传图片翻转问题
2021-07-28
php对数字进行万。亿的转化
2021-07-28
五个 .NET 性能小贴士
2021-07-28
Three.js中显示坐标轴、平面、球体、四方体
2021-07-28
.net 5+ 知新:【1】 .Net 5 基本概念和开发环境搭建
2021-07-27
1.html,css
2021-07-27
基于Docker搭建 Php-fpm + Nginx 环境
2021-07-27
nginx + http + svn
2021-07-27
kubernets kube-proxy的代理 iptables和ipvs
2021-07-26
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!