文章目录
[7.PHP 函数](#7.PHP 函数)
[PHP 函数参数](#PHP 函数参数)
[8.PHP 变量作用域](#8.PHP 变量作用域)
[PHP 类定义](#PHP 类定义)
[PHP 中创建对象](#PHP 中创建对象)
[PHP 构造函数](#PHP 构造函数)
[1. 接口](#1. 接口)
[2. 抽象类](#2. 抽象类)
[Static 关键字](#Static 关键字)
[Final 关键字](#Final 关键字)
[11.PHP Include 文件](#11.PHP Include 文件)
1.PHP简述
PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
在一个php文件中可以包括以下内容:
- PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
- PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
- PHP 文件的默认文件扩展名是 ".php"
php的使用:
- PHP 可以生成动态页面内容
- PHP 可以创建、打开、读取、写入、关闭服务器上的文件
- PHP 可以收集表单数据
- PHP 可以发送和接收 cookies
- PHP 可以添加、删除、修改您的数据库中的数据
- PHP 可以限制用户访问您的网站上的一些页面
- PHP 可以加密数据
2.基本语法格式
PHP 脚本以 <?php 开始,以 ?> 结束
<?php
//php脚本的基本格式
/*
* 多行注释,跟java的注释方法相同
* */
变量的命名
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
变量名不能包含空格
//php的变量声明是以$开始的
$num = 3.14;
$str = "hello";
/*static的关键字的使用
* 当一个函数完成时,它的所有变量通常都会被删除。
* 然而,有时候您希望某个局部变量不要被删除。
* 要做到这一点,请在您第一次声明变量时使用 static 关键字:
* */
function test(){
static $n=0;
$n++;
echo "调用了一次".$n."\n";
}
test();test();test();
?>
3.数据类型、常量以及字符串
php有5种数据类型:String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值)。
<?php
$a = "字符串类型";
$b = 1234;//整形
$c = -3.1415;//浮点型
$d = 8E-3;
$e = true;//boolean类型
$f = array("A","B","C");//数组类型
class obj{//php对象的声明
var $num;
function name() { }
}
$o = new obj();//对象实例化类型
$g = NULL;//NULL
var_dump(a);var_dump(b);var_dump(c);var_dump(d);
var_dump(e);var_dump(f);var_dump(o);var_dump(g);
?>
常量:常量是一个简单值的标识符。该值在脚本中不能改变。(在整个脚本中都能使用)
一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。
设置常量,使用 define() 函数,函数语法如下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
该函数有三个参数:
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。
<?php
// 常量
define("CL", "这是一个全局常量", true);
echo CL; // 默认false,变量名区分大小写
echo cl; // true不区分大小写
?>
预定义常量
PHP预定义了许多常量,这些常量无需使用define()函数定义,可直接在程序中使用。下面列举了一些常用的PHP预定义常量。
(1)FILE(FILE前后分别是两个下画线):当前正在处理的脚本文件名,若使用在一个被引用的文件中(include或require),那么 它的值就是被引用的文件,而不是引用它的那个文件。
(2)LINE(LINE前后分别是两个下画线):正在处理的脚本文件的当前行数。
(3)PHP_VERSION:当前PHP预处理器的版本,如5.4.16。
(4)PHP_OS: PHP所在的操作系统的类型。如Linux。
(5)TRUE:表示逻辑真。FALSE:表示逻辑假。NULL:表示没有值或值不确定。
(6)DIRECTORY_SEPARATOR: 表示目录分隔符,UNIX或Linux操作系统环境时的值为" / ", Window操作系统环境时的值为 " \ "。
<?php
echo FILE;
echo "<br/>";
echo LINE;
echo "<br/>";
echo PHP_VERSION;
echo "<br/>";
echo PHP_OS;
echo "<br/>";
echo DIRECTORY_SEPARATOR;
?>
整型
整数类型:保存整数数值(范围限制),4个字节存储数据。PHP中默认为有符号。
在PHP中提供四种整形的定义方式,十进制定义,二进制定义,八进制定义和十六进制定义
$a = 120 //十进制
$a = 0b110 //二进制
$a = 0120 //八进制
$a = 0x120 //十六进制
// 使用echo输出时。默认输出为十进制
decbin() // 十进制转二进制
decoct() // 十进制转八进制
dechex() // 十进制转十六进制
bindec() // 二进制转十进制
bin2hex() //二进制转十六进制
字符串:字符串变量用于存储并处理文本。
<?php
$name='qianxun';
//双引号 里面有变量 会 输出变量的值
$str ="这是 $name 的全栈渗透测试培训,这是一个比较高质量的课程,一个很大的体系 欢迎来学习。";
//单引号 如果里面有变量都作为一个字符串处理
$str1 ='这是 $name 的全栈渗透测试培训,这是一个比较高质量的课程,一个很大的体系 欢迎来学习。';
echo $str;
echo $str1;
<?php
// 字符串
$text1 = "hello";
$text2 = "world";
echo $text1 . " " . $text2; // "."是并置运算符(连接)
echo "返回字符串的长度:", strlen($text1);
echo "返回子串的第一次位置:", strpos($text1, "l");
?>
字符的操作函数
addcslashes --- 以 C 语言风格使用反斜线转义字符串中的字符
addslashes --- 使用反斜线引用字符串
bin2hex --- 函数把包含数据的二进制字符串转换为十六进制值
chop --- rtrim 的别名
chr --- 返回指定的字符
chunk_split --- 将字符串分割成小块
convert_cyr_string --- 将字符由一种 Cyrillic 字符转换成另一种
convert_uudecode --- 解码一个 uuencode 编码的字符串
convert_uuencode --- 使用 uuencode 编码一个字符串
count_chars --- 返回字符串所用字符的信息
crc32 --- 计算一个字符串的 crc32 多项式
crypt --- 单向字符串散列
echo --- 输出一个或多个字符串
explode --- 使用一个字符串分割另一个字符串
fprintf --- 将格式化后的字符串写入到流
get_html_translation_table --- 返回使用 htmlspecialchars 和 htmlentities 后的转换表
hebrev --- 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew)
hebrevc --- 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew),并且转换换行符
hex2bin --- 转换十六进制字符串为二进制字符串
html_entity_decode --- Convert HTML entities to their corresponding characters
htmlentities --- 将字符转换为 HTML 转义字符
htmlspecialchars_decode --- 将特殊的 HTML 实体转换回普通字符
htmlspecialchars --- 将特殊字符转换为 HTML 实体
implode --- 将一个一维数组的值转化为字符串
join --- 别名 implode
lcfirst --- 使一个字符串的第一个字符小写
levenshtein --- 计算两个字符串之间的编辑距离
localeconv --- Get numeric formatting information
ltrim --- 删除字符串开头的空白字符(或其他字符)
md5_file --- 计算指定文件的 MD5 散列值
md5 --- 计算字符串的 MD5 散列值
metaphone --- Calculate the metaphone key of a string
money_format --- 将数字格式化成货币字符串
nl_langinfo --- Query language and locale information
nl2br --- 在字符串所有新行之前插入 HTML 换行标记
number_format --- 以千位分隔符方式格式化一个数字
ord --- 转换字符串第一个字节为 0-255 之间的值
parse_str --- 将字符串解析成多个变量
print --- 输出字符串
printf --- 输出格式化字符串
quoted_printable_decode --- 将 quoted-printable 字符串转换为 8-bit 字符串
quoted_printable_encode --- 将 8-bit 字符串转换成 quoted-printable 字符串
quotemeta --- 转义元字符集
rtrim --- 删除字符串末端的空白字符(或者其他字符)
setlocale --- 设置地区信息
sha1_file --- 计算文件的 sha1 散列值
sha1 --- 计算字符串的 sha1 散列值
similar_text --- 计算两个字符串的相似度
soundex --- Calculate the soundex key of a string
sprintf --- Return a formatted string
sscanf --- 根据指定格式解析输入的字符
str_contains --- Determine if a string contains a given substring
str_ends_with --- Checks if a string ends with a given substring
str_getcsv --- 解析 CSV 字符串为一个数组
str_ireplace --- str_replace 的忽略大小写版本
str_pad --- 使用另一个字符串填充字符串为指定长度
str_repeat --- 重复一个字符串
str_replace --- 子字符串替换
str_rot13 --- 对字符串执行 ROT13 转换
str_shuffle --- 随机打乱一个字符串
str_split --- 将字符串转换为数组
str_starts_with --- Checks if a string starts with a given substring
str_word_count --- 返回字符串中单词的使用情况
strcasecmp --- 二进制安全比较字符串(不区分大小写)
strchr --- 别名 strstr
strcmp --- 二进制安全字符串比较
strcoll --- 基于区域设置的字符串比较
strcspn --- 获取不匹配遮罩的起始子字符串的长度
strip_tags --- 从字符串中去除 HTML 和 PHP 标记
stripcslashes --- 反引用一个使用 addcslashes 转义的字符串
stripos --- 查找字符串首次出现的位置(不区分大小写)
stripslashes --- 反引用一个引用字符串
stristr --- strstr 函数的忽略大小写版本
strlen --- 获取字符串长度
strnatcasecmp --- 使用"自然顺序"算法比较字符串(不区分大小写)
strnatcmp --- 使用自然排序算法比较字符串
strncasecmp --- 二进制安全比较字符串开头的若干个字符(不区分大小写)
strncmp --- 二进制安全比较字符串开头的若干个字符
strpbrk --- 在字符串中查找一组字符的任何一个字符
strpos --- 查找字符串首次出现的位置
strrchr --- 查找指定字符在字符串中的最后一次出现
strrev --- 反转字符串
strripos --- 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
strrpos --- 计算指定字符串在目标字符串中最后一次出现的位置
strspn --- 计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度。
strstr --- 查找字符串的首次出现
strtok --- 标记分割字符串
strtolower --- 将字符串转化为小写
strtoupper --- 将字符串转化为大写
strtr --- 转换指定字符
substr_compare --- 二进制安全比较字符串(从偏移位置比较指定长度)
substr_count --- 计算字串出现的次数
substr_replace --- 替换字符串的子串
substr --- 返回字符串的子串
trim --- 去除字符串首尾处的空白字符(或者其他字符)
ucfirst --- 将字符串的首字母转换为大写
ucwords --- 将字符串中每个单词的首字母转换为大写
vfprintf --- 将格式化字符串写入流
vprintf --- 输出格式化字符串
vsprintf --- 返回格式化字符串
wordwrap --- 打断字符串为指定数量的字串
<?php
$name='qianxun';
//双引号 里面有变量 会 输出变量的值
//$str =" 这是 $name 的全栈渗透测试培训,这是一个比较高质量的课程,一个很大的体系 欢迎来学习。 ";
//单引号 如果里面有变量都作为一个字符串处理
//$str1 ='这是 $name 的全栈渗透测试培训,这是一个比较高质量的课程,一个很大的体系 欢迎来学习。';
$a='123456';
//echo str." 一共有 ".strlen(a)."字符";
//去掉空格
//echo trim($str);
//echo $str1;
//查找字符串 返回位置
//echo strpos($str,'qianxun');
//截取字符串
//echo substr(str,strpos(str,'qianxun'),strpos($str,'培训'));
//md5 加密
//echo md5($a);
//通过下标 取字符的值
//echo $a[0];
//字符串替换函数
a1=str_replace('1','0',a);
echo $a1;
//遍历字符串
for(i=0;i<=strlen(a);i++){
echo a\[i].'</br>';
}
function mb_str_split( $string ) {
// /u表示把字符串当作utf-8处理,并把字符串开始和结束之前所有的字符串分割成数组
return preg_split('/(?<!^)(?!$)/u', $string );
}
for(i=0;i<strlen(str);i++) {
$k = str\[i]; //输出乱码
}
foreach (mb_str_split($str) as $c)
{
echo $c; //正常输出:中 文 测 试
}
4.运算符
基本运算符:
赋值运算符:
递增/递减运算符:
比较运算符:
逻辑运算符:
三元运算符:
(expr1) ? (expr2) : (expr3)
5.控制语句
控制语法的语句结构和其他大多数语言结构相同,有以下两类:
条件控制语句
if 语句- 在条件成立时执行代码
if...else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码
if...elseif....else 语句 - 在若干条件之一成立时执行一个代码块
switch 语句 - 在若干条件之一成立时执行一个代码块
循环控制语句
while- 只要指定的条件成立,则循环执行代码块
do...while- 首先执行一次代码块,然后在指定的条件成立时重复这个循环
for - 循环执行代码块指定的次数
foreach- 根据数组中每个元素来循环代码块
break语句用于终止本次循环
continue语句的作用是跳出本次循环,接着执行下一次循环
6.php数组
数组是一个能在单个变量中存储多个值的特殊变量。
在 PHP 中,array() 函数用于创建数组:
array();
在 PHP 中,有三种类型的数组:
数值数组 - 带有数字 ID 键的数组
关联数组 - 带有指定的键的数组,每个键关联一个值
多维数组 - 包含一个或多个数组的数组
数组的声明
$array1 = array();
<?php
$cars=array("Volvo","BMW","Toyota");//简单的数组
echo count($cars);//count()返回数组的长度
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");//关联数组
//其中包含多个键值对
echo "Peter is " . $age['Peter'] . " years old.";
foreach($age as x=\>x_value)//关联数组的遍历方法
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
在PHP 中定义了多个数组排序的内置函数:
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
krsort() - 根据关联数组的键,对数组进行降序排列
数组的操作
数组的合拼
$array1 =array('a','b','c');
$array2 = array('a1'=>'php','a2'=>'python','a3'=>'java');
array3 = array_merge(array1,$array2);
填加数组元素
array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。
array_push($array1,'d','e');
print_r($array1);
下表为空 自动添加参数
$array1[]='d';
有键值的
$array1['a4']='javasciprt';
添加到指定位置
<?php
$array1 = array('a', 'b', 'c', 'd', 'e');
$array2 = array('x');
array_splice($array1, 3, 0, $array2); // 插入到位置3且删除0个
print_r($array1);
?>
array_splice(数组,位置,删除几个,增加元素)
删除某一个元素
<?php
$array1 = array('a', 'b', 'c', 'd', 'e');
$array2 = array('x');
array_splice($array1, 3, 1);
print_r($array1);
?>
unset 销毁指定的元素
$array1 = array('a', 'b', 'c', 'd', 'e');
unset($array1[0]);
print_r($array1);
array_pop():将数组最后一个单元弹出(出栈)
修改数组中某个元素
$array1 = array('a', 'b', 'c', 'd', 'e');
$array1[0]='aa';
print_r($array1);
常用的数组函数
is_array 判断是否为数组
count 数组的元素数目
array_search --- 在数组中搜索给定的值,如果成功则返回相应的键名
array_key_exists()在给定的 key 存在于数组中时返回 TRUE
array_unshift() 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变
array_shift() 将array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。
array_unique() 接受 array 作为输入并返回没有重复值的新数组。注意键名保留不变。 array_unique() 先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留。
in_array --- 检查数组中是否存在某个值 如果找到指定的值则返回 TRUE,否则返回 FALSE 。in_array()是区分大小写的。
7.PHP 函数
PHP 的真正力量来自它的函数:它拥有超过 1000 个内建的函数。
PHP 用户定义函数
除了内建的 PHP 函数,我们可以创建我们自己的函数。
函数是可以在程序中重复使用的语句块。
页面加载时函数不会立即执行。
函数只有在被调用时才会执行。
在 PHP 创建用户定义函数
用户定义的函数声明以单词 "function" 开头:
语法
function functionName() {
被执行的代码;
}
注释:函数名能够以字母或下划线开头(而非数字)。
注释:函数名对大小写不敏感。
提示:函数名应该能够反映函数所执行的任务。
在下面的例子中,我们创建名为 "writeMsg()" 的函数。打开的花括号({)指示函数代码的开始,而关闭的花括号(})指示函数的结束。此函数输出 "Hello world!"。如需调用该函数,只要使用函数名即可:
实例
<?php
function sayHi() {
echo "Hello world!";
}
sayhi(); // 调用函数
?>
PHP 函数参数
可以通过参数向函数传递信息。参数类似变量。
参数被定义在函数名之后,括号内部。您可以添加任意多参数,只要用逗号隔开即可。
下面的例子中的函数有一个参数($fname)。当调用 familyName() 函数时,我们同时要传递一个名字(例如 Bill),这样会输出不同的名字,但是姓氏相同:
<?php
function familyName($fname) {
echo "$fname Zhang.<br>";
}
familyName("Li");
familyName("Hong");
familyName("Tao");
familyName("Xiao Mei");
familyName("Jian");
?>
PHP 默认参数值
下面的例子展示了如何使用默认参数。如果我们调用没有参数的 setHeight() 函数,它的参数会取默认值:
实例
<?php
function setHeight($minheight=50) {
echo "The height is : $minheight <br>";
}
setHeight(350);
setHeight(); // 将使用默认值 50
setHeight(135);
setHeight(80);
?>
PHP 函数 - 返回值
如需使函数返回值,请使用 return 语句:
实例
<?php
function sum(x,y) {
z=x+$y;
return $z;
}
echo "5 + 10 = " . sum(5,10) . "<br>";
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>
匿名函数
匿名函数就是没有名字的函数。
将一个匿名函数"赋值"给一个变量------此时该变量就代表该匿名函数了!
callfunction=function(name){
return $name;
};
echo $callfunction('qianxun');
回调函数
回调函数是指调用函数的时候将另一个函数作为参数传递到调用的函数中,而不是传递一个普通的变量作为参数
使用回调函数是为了可以将一段自己定义的功能传到函数内部使用
<?php
function Speak(a,b){
echo "He can speak ".$a;
echo "<br>";
echo "She can speak ".$b;
}
function Speak_Test(){
return call_user_func_array('Speak',array('Chinese','English'));
}
Speak_Test()
?>
8.PHP 变量作用域
在 PHP 中,可以在脚本的任意位置对变量进行声明。
变量的作用域指的是变量能够被引用/使用的那部分脚本。
PHP 有三种不同的变量作用域:
local(局部)
global(全局)
static(静态)
Local 和 Global 作用域
函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。
下面的例子测试了带有局部和全局作用域的变量:
<?php
$x=5; // 全局作用域
function myTest() {
$y=10; // 局部作用域
echo "<p>测试函数内部的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
}
myTest();
echo "<p>测试函数之外的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
?>
在上例中,有两个变量 $x 和 y,以及一个函数 myTest()。x 是全局变量,因为它是在函数之外声明的,而 $y 是局部变量,因为它是在函数内声明的。
如果我们在 myTest() 函数内部输出两个变量的值,$y 会输出在本地声明的值,但是无法 $x 的值,因为它在函数之外创建。
然后,如果在 myTest() 函数之外输出两个变量的值,那么会输出 $x 的值,但是不会输出 $y 的值,因为它是局部变量,并且在 myTest() 内部创建。
注释:您可以在不同的函数中创建名称相同的局部变量,因为局部变量只能被在其中创建它的函数识别。
PHP global 关键词
global 关键词用于在函数内访问全局变量。
要做到这一点,请在(函数内部)变量前面使用 global 关键词:
实例
<?php
$x=5;
$y=10;
function myTest() {
global x,y;
y=x+$y;
}
myTest();
echo $y; // 输出 15
?>
PHP 同时在名为 $GLOBALS[index] 的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。
上面的例子可以这样重写:
<?php
$x=5;
$y=10;
function myTest() {
GLOBALS\['y'\]=GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y; // 输出 15
?>
PHP static 关键词
通常,当函数完成/执行后,会删除所有变量。不过,有时我需要不删除某个局部变量。实现这一点需要更进一步的工作。
要完成这一点,请在您首次声明变量时使用 static 关键词:
实例
<?php
function myTest() {
static $x=0;
echo $x;
$x++;
}
myTest();
myTest();
myTest();
?>
然后,每当函数被调用时,这个变量所存储的信息都是函数最后一次被调用时所包含的信息。///
注释:该变量仍然是函数的局部变量。
9.类与对象
PHP 面向对象
在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。
对象的主要三个特性:
- 对象的行为:可以对对象施加那些操作,开灯,关灯就是行为。
- 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
- 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。
比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态。
面向对象内容
类 − 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
对象 − 是类的实例。
成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。
成员函数 − 定义在类的内部,可用于访问对象的数据。
继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。
子类 − 一个类继承其他类称为子类,也可称为派生类。
多态 − 多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。
重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
抽象性− 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
下图中我们通过 Car 类 创建了三个对象:Mercedes, Bmw, 和 Audi。
$mercedes = new Car ();
$bmw = new Car ();
$audi = new Car ();
PHP 类定义
PHP 定义类通常语法格式如下:
<?php
class phpClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
[..]
}
[..]
}
?>
解析如下:
1.类使用 class 关键字后加上类名定义。
2.类名后的一对大括号({})内可以定义变量和方法。
3.类的变量使用 var 来声明, 变量也可以初始化值。
4.函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。
实例
<?php
class Site {
/* 成员变量 */
var $url;
var $title;
/* 成员函数 */
function setUrl($par){
$this->url = $par;
}
function getUrl(){
echo $this->url . PHP_EOL;
}
function setTitle($par){
$this->title = $par;
}
function getTitle(){
echo $this->title . PHP_EOL;
}
}
?>
变量 $this 代表自身的对象。
PHP_EOL 为换行符。
PHP 中创建对象
类创建后,我们可以使用 new 运算符来实例化该类的对象:
$w3cschool = new Site;
$taobao = new Site;
$google = new Site;
以上代码我们创建了三个对象,三个对象各自都是独立的,接下来我们来看看如何访问成员方法与成员变量。
调用成员方法
在实例化对象后,我们可以使用该对象调用成员方法,该对象的成员方法只能操作该对象的成员变量:
// 调用成员函数,设置标题和URL
$w3cschool->setTitle( "W3Cschool教程" );
$taobao->setTitle( "淘宝" );
$google->setTitle( "Google 搜索" );
$w3cschool->setUrl( 'www.w3cschool.cn' );
$taobao->setUrl( 'www.taobao.com' );
$google->setUrl( 'www.google.com' );
// 调用成员函数,获取标题和URL
$w3cschool->getTitle();
$taobao->getTitle();
$google->getTitle();
$w3cschool->getUrl();
$taobao->getUrl();
$google->getUrl();
完整代码如下:
<?php
class Site {
/* 成员变量 */
var $url;
var $title;
/* 成员函数 */
function setUrl($par){
$this ->url = $par;
}
function getUrl (){
echo $this->url . PHP_EOL ;
}
function setTitle($par){
$this ->title = $par;
}
function getTitle (){
echo $this->title . PHP_EOL ;
}
}
$w3cschool = new Site;
$taobao = new Site;
$google = new Site;
// 调用成员函数,设置标题和URL
$w3cschool->setTitle( "W3Cschool教程" );
$taobao ->setTitle( "淘宝" );
$google-> setTitle( "Google 搜索" );
$w3cschool-> setUrl( 'www.w3cschool.cn' );
$taobao->setUrl ( 'www.taobao.com' );
$google->setUrl( 'www.google.com' );
// 调用成员函数,获取标题和URL
$w3cschool->getTitle ();
$taobao->getTitle();
$google-> getTitle();
$w3cschool->getUrl();
$taobao ->getUrl();
$google->getUrl();
?>
执行以上代码,输出结果为:
W3Cschool教程
淘宝
Google 搜索
PHP 构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
PHP 5 允行开发者在一个类中定义一个方法作为构造函数,语法格式如下:
void __construct ([ mixed $args [, $... ]] )
在上面的例子中我们就可以通过构造方法来初始化 $url 和 $title 变量:
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
现在我们就不需要再调用 setTitle 和 setUrl 方法了:
$youj = new Site('www.w3cschool.cn', 'W3Cschool教程');
$taobao = new Site('www.taobao.com', '淘宝');
$google = new Site('www.google.com', 'Google 搜索');
// 调用成员函数,获取标题和URL
$youj->getTitle();
$taobao->getTitle();
$google->getTitle();
$youj->getUrl();
$taobao->getUrl();
$google->getUrl();
析构函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,其语法格式如下:
void __destruct ( void )
实例
<?php
class MyDestructableClass {
function __construct() {
print "构造函数\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "销毁 " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
执行以上代码,输出结果为:
构造函数
销毁 MyDestructableClass
继承
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
父类=基类
PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,格式
class Child extends Parent {
// 代码部分
}如下:
实例
实例中 Child_Site 类继承了 Site 类,并扩展了功能:
<?php
// 子类扩展站点类别
class Child_Site extends Site {
var $category;
function setCate($par){
$this->category = $par;
}
function getCate(){
echo $this->category . PHP_EOL;
}
}
方法重写
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例中重写了 getUrl 与 getTitle 方法:
function getUrl() {
echo $this->url . PHP_EOL;
return $this->url;
}
function getTitle(){
echo $this->title . PHP_EOL;
return $this->title;
}
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected (受保护)或 private(私有)来实现的。
public(公有):公有的类成员可以在任何地方被访问。
protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
private(私有):私有的类成员则只能被其定义所在的类访问。
属性的访问控制
类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
<?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 可以对 public 和 protected 进行重定义,但 private 而不能
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
echo $obj2->private; // 未定义 private
echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined
?>
方法的访问控制
类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方公有
<?php
/**
* Define MyClass
*/
class MyClass
{
// 声明一个公有的构造函数
public function __construct() { }
// 声明一个公有的方法
public function MyPublic() { }
// 声明一个受保护的方法
protected function MyProtected() { }
// 声明一个私有的方法
private function MyPrivate() { }
// 此方法为公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
$myclass->MyProtected(); // 这行会产生一个致命错误
$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有,受保护,私有都可以执行
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 此方法为公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // 这行会产生一个致命错误
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>
接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
<?php
// 声明一个'iTemplate'接口
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// 实现接口
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
this-\>vars\[name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。
实例
<?php
class MyClass
{
const constant = '常量值';
function showConstant() {
echo self::constant . PHP_EOL;
}
}
echo MyClass::constant . PHP_EOL;
$classname = "MyClass";
echo $classname::constant . PHP_EOL; // 自 5.3.0 起
$class = new MyClass();
$class->showConstant();
echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起
?>
抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
<?php
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . PHP_EOL;
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue() {
return "ConcreteClass1";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass1";
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue() {
return "ConcreteClass2";
}
public function prefixValue($prefix) {
return "{$prefix}ConcreteClass2";
}
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;
$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>
执行以上代码,输出结果为:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
此外,子类方法可以包含父类抽象方法中不存在的可选参数。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则都是可以正常运行的。
<?php
abstract class AbstractClass
{
// 我们的抽象方法仅需要定义需要的参数
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
// 我们的子类可以定义父类签名中不存在的可选参数
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{prefix}{separator} {$name}";
}
}
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>
输出结果为:
Mr. Pacman
Mrs. Pacwoman
接口与抽象类
1. 接口
(1)对接口的使用是通过关键字implements
(2)接口不能定义成员变量(包括类静态变量),能定义常量
(3)子类必须实现接口定义的所有方法
(4)接口只能定义不能实现该方法
(5)接口没有构造函数
(6)接口中的方法和实现它的类默认都是public类型的
2. 抽象类
(1)对抽象类的使用是通过关键字extends
(2)不能被实例化,可以定义子类必须实现的方法
(3)子类必须定义父类中的所有抽象方法,这些方法的访问控制必须和父类中一样(或者更为宽松)
(4)如一个类中有一个抽象方法,则该类必须定义为抽象类
(5)抽象类可以有构造函数
(6)抽象类中的方法可以使用private,protected,public来修饰。
(7)一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。
Static 关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
<?php
class Foo {
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
print Foo::$my_static . PHP_EOL;
$foo = new Foo();
print $foo->staticValue() . PHP_EOL;
?>
执行以上程序,输出结果为:
foo
Foo
Final 关键字
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
以下代码执行会报错:
<?php
class BaseClass {
public function test() {
echo "BaseClass::test() called" . PHP_EOL;
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called" . PHP_EOL;
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called" . PHP_EOL;
}
}
// 报错信息 Fatal error: Cannot override final method BaseClass::moreTesting()
?>
调用父类构造方法
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct() 。
<?php
class BaseClass {
function __construct() {
print "BaseClass 类中构造方法" . PHP_EOL;
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct(); // 子类构造方法不能自动调用父类的构造方法
print "SubClass 类中构造方法" . PHP_EOL;
}
}
class OtherSubClass extends BaseClass {
// 继承 BaseClass 的构造方法
}
// 调用 BaseClass 构造方法
$obj = new BaseClass();
// 调用 BaseClass、SubClass 构造方法
$obj = new SubClass();
// 调用 BaseClass 构造方法
$obj = new OtherSubClass();
?>
执行以上程序,输出结果为:
BaseClass 类中构造方法
BaseClass 类中构造方法
SubClass 类中构造方法
BaseClass 类中构造方法
10.PHP超级全局变量
PHP超级全局变量列表:
- $GLOBALS 一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
- $_SERVER 一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组
- $_REQUEST 用于收集HTML表单提交的数据。
它可以获取 cookie get post
- $_POST 广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
- $_GET 广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。
Array []
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
<?php
// php预定义方法
echo "\n", $GLOBALS['y'];
echo "\n", $_SERVER['PHP_SELF'];
echo "\n", $_SERVER['SERVER_NAME'];
echo "\n", $_SERVER['HTTP_HOST'];
?>
11.PHP Include 文件
服务器端包含 (SSI) 用于创建可在多个页面重复使用的函数、页眉、页脚或元素。
include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
包含文件很有用,如果您需要在网站的多张页面上引用相同的 PHP、HTML 或文本的话。
PHP include 和 require 语句
通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。
include 和 require 语句是相同的,除了错误处理方面:
require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
include 只生成警告(E_WARNING),并且脚本会继续
因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
包含文件省去了大量的工作。这意味着您可以为所有页面创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
语法
include 'filename';
或
require 'filename';