简介
- PHP是一种通用开源脚本语言,服务器端脚本语言
- PHP (Hypertext Preprocessor) 超文本预处理器
- PHP脚本在服务器上执行
PHP文件是什么
- PHP可包含文本、HTML、JavaScript和PHP代码
- PHP代码在服务器上执行,结果以纯HTML形式返回浏览器
- PHP文件的默认文件扩展名是:.php
PHP能做什么
- 生成动态页面内容
- 创建、打开、读取、写入、关闭服务器上的文件
- 收集表单数据
- 发送和接收cookie
- 添加、删除、修改数据库中的数据
- 限制用户访问网站上的个别页面
- 加密数据
- 通过PHP,不在仅限于输出HTML,可以输出图像、PDF文件,甚至flash电影
- 输出任意的文件,如:XHTML、XML
为什么选择PHP
- 可在不同的平台上运行(Windows、Linux、Mac OS等)
- 与目前几乎所有的正在被使用的服务器相兼容(Apache、IIS等)
- 提供广泛的数据库支持
- 免费
- 易于学习,可高效地运行在服务器端
基本语法
- PHP脚本可以放在文档中的任何位置
- PHP脚本以<?php 开始, 结束 ?>;
- PHP中的每一行代码都必须以分号结束
- 分号是一种分隔符,用于把指令集区分开
- 两种在浏览器输出文本的基础指令:echo和print
<?php
print "hello PHP";
echo "hello world";
?>
注释
- 单行注释: //
- 多行注释:/* 注释内容 */
变量
- 变量是用来存储信息的“容器”
- 变量以$ 符号开始,后面跟着变量的名称
- 变量名必须以字母、数字、下划线组成,数字不开头
- 变量名区分大小写
注意:PHP语句和PHP变量都是区分大小写的
创建变量
- PHP是一门弱类型语言
- 创建变量时,不必向PHP声明该变量的数据类型
- PHP会根据变量的值,自动把变量转化为正确的数据类型
<?php
$txt = "Hello PHP!";
$x = 10;
$y = 5.5;
$r = $x + $y;
echo $txt,$r;
?>
运行截图
变量作用域
- 变量的作用域是脚本中变量可被引用/使用的部分
- 在PHP中 有四种不同的变量作用域:
local
global
static
parameter
局部和全局作用域
- 在所有函数外部定义的变量,拥有全局作用域
- 除函数外,全局变量可以被脚本中的任何部分访问
- 在PHP函数内部声明的变量是局部变量,仅能在函数内部访问
- 要在函数中访问一个全局变量,需要使用global关键字
<?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";
?>
运行截图
global关键字
- global关键字用于函数内访问全局变量
- 在函数内调用函数外定义的全局变量,则需要在函数中的变量前加上 global 关键字
<?php
$a = 10;
$b = 20;
$c = 30;
function Text()
{
global $a,$b;
echo $a;
echo "<br>";
echo $b;
echo "<br>";
echo $c;
}
text()
?>
运行截图
Static 作用域
- 当一个函数完成时,它的所有变量通常都会被删除
- 然而,有时希望某个局部变量不要被删除,则需要在第一次声明变量时使用static关键字
- 注意:该变量仍然是函数的局部变量
<?php
function test(){
static $x = 1;
$y = 1;
echo $x;
echo "<br>";
echo $y;
$x++;
$y++;
echo "<hr>";
}
test();
test();
test();
test();
?>
运行截图
参数作用域
- 参数是通过调用代码 将值传递给函数的局部变量
- 参数是在参数列表中声明的,作为函数声明的一部分
<?php
function text($a){
echo $a;
}
text(10);
?>
运行截图
输出语句
- 在PHP中有两种基本的输出方式:echo 和 print
- echo:可以输出一个或多个字符串
- print:只允许输出一个字符串,返回值总为1
- 注意:echo 输出的速度比 print 快;echo没有返回值,print有返回值1
echo语句
- echo是一个语言结构,使用时可使用括号,也可不适应括号,echo 或者 echo()
<?php
echo "<h2>PHP 很有趣!</h2>";
echo "Hello world!<br>";
echo "我要学 PHP!<br>";
echo "这是一个", "字符串,", "使用了", "多个", "参数。";
?>
运行截图
print语句
- print同样是一个语言结构,可使用括号,也可不使用括号:print或者print()
<?php
print "<h2>PHP 很有趣!</h2>";
print "Hello world!<br>";
print "我要学习 PHP!";
?>
运行截图
EOF(heredoc)使用说明
- PHP EOF是一种在命令行shell和程序语言里定义一个字符串的方法
使用概述- 必须后接分号,否则编译不通过
- EOF 可以用任意其他代替,只需保证结束标识与开始标识一致
- 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)
- 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号
- . 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法
<?php
echo <<<EOF
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
EOF;
// 结束需要独立一行且前后不能空格
?>
运行截图
数据类型
- String(字符串)
- Integer(整型)
- Float(浮点型)
- Boolean(布尔型)
- Array(数组)
- Object(对象)
- NULL(空值)
NULL 值
- NULL 值表示变量没有值,NULL 是数据类型为NULL的值
- NULL值指明一个变量是否为空值
- 可以通过设置变量值为NULL 来清空变量数据
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>
运行截图
类型比较
- 松散比较: 使用两个等号 == 比较,只比较值,不比较类型
- 严格比较:用三个等号 === 比较,比较值,比较类型
<?php
if(42 == "42") {
echo '1、值相等';
}
echo "<br>";
if(42 === "42") {
echo '2、类型相等';
} else {
echo '3、类型不相等';
}
?>
运行截图
常量
- 常量是一个简单值的标识符,该值在脚本中不能改变
- 一个常量由英文字母、下划线和数字组成,数字不开头
- 常量名前不需要加$修饰符
- 注意:常量在整个脚本中都可以使用(常量是全局的)
设置常量
- 设置常量使用 define()函数
- 语法:bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
- 函数三个参数说明: name:常量名称;value:常量的值,case_insensitive 可选参数,默认为大小写敏感
<?php
define("GREETING", "欢迎访问 Runoob.com");
echo GREETING;
?>
运行截图
字符串
- 字符串变量 用于存储和处理文本
- 当赋一个文本值给变量时,需加上单引号或双引号
<?php
$a = "hello PHP";
echo $a;
?>
运行截图
并置运算符
- 在PHP中,只有一个字符串运算符
- 并置运算符(.) 作用:用于把两个字符串值连接起来
<?php
$a = "hello";
$b = "world";
echo $a.$b;
echo "<br>";
echo $a."+++".$b;
?>
运行截图
strlen()函数
- strlin():计算字符串长度
<?php
echo strlen("hellophp");
?>
运行截图
strpos()函数
- strpos():用于在字符串内查找一个字符或一段指定的文本
- 匹配到字符,返回第一个匹配的字符位置
- 未匹配到,则返回false
<?php
echo strpos("hellophp",'p');
?>
运行截图
运算符
- 赋值运算符:=
- 算数运算符:+
<?php
$x=10;
$y=6;
echo ($x + $y); // 输出16
echo '<br>'; // 换行
echo ($x - $y); // 输出4
echo '<br>'; // 换行
echo ($x * $y); // 输出60
echo '<br>'; // 换行
echo ($x / $y); // 输出1.6666666666667
echo '<br>'; // 换行
echo ($x % $y); // 输出4
echo '<br>'; // 换行
echo -$x;
?>
赋值运算符
<?php
$x=10;
echo $x; // 输出10
$y=20;
$y += 100;
echo $y; // 输出120
$z=50;
$z -= 25;
echo $z; // 输出25
$i=5;
$i *= 6;
echo $i; // 输出30
$j=10;
$j /= 5;
echo $j; // 输出2
$k=15;
$k %= 4;
echo $k; // 输出3
?>
递增/递减运算符
<?php
$x=10;
echo ++$x; // 输出11
$y=10;
echo $y++; // 输出10
$z=5;
echo --$z; // 输出4
$i=5;
echo $i--; // 输出5
?>
比较运算符
<?php
$x=100;
$y="100";
var_dump($x == $y);
echo "<br>";
var_dump($x === $y);
echo "<br>";
var_dump($x != $y);
echo "<br>";
var_dump($x !== $y);
echo "<br>";
$a=50;
$b=90;
var_dump($a > $b);
echo "<br>";
var_dump($a < $b);
?>
逻辑运算符
- and:与
- or:或
- xor:异或
- &&:与
- ||:或
- !:非
数组运算符
<?php
$x = array("a" => "red", "b" => "green");
$y = array("c" => "blue", "d" => "yellow");
$z = $x + $y; // $x 和 $y 数组合并
var_dump($z);
var_dump($x == $y);
var_dump($x === $y);
var_dump($x != $y);
var_dump($x <> $y);
var_dump($x !== $y);
?>
三元运算符
- 语法格式:(expr1) ? (expr2) : (expr3)
<?php
$test = 'hellophp';
// 普通写法
$username = isset($test) ? $test : 'nobody';
echo $username;
echo "<br>";
$username = $test ?: 'nobody';
echo $username;
?>
运行截图
条件判断语句 if…else
- 条件语句用于根据不同条件执行不同动作
if语句
语法:if(条件){条件成立时要执行的代码;}
实例
<?php
$a = 10;
if($a > 5){
echo "hahahaha";
}
?>
运行截图
if…else语句
- 在条件成立时执行一块代码,条件不成立时执行另一条语句
- 语法:
if(条件){条件成立时执行;}else{条件不成立时执行;}
- 实例:
<?php
$t=100;
if ($t<"20")
{
echo "Have a good day!";
}
else
{
echo "Have a good night!";
}
?>
运行截图
if…elseif…else语句
- 在若干条件之一成立时执行一个代码块
- 语法:
if(条件){条件成立时执行;}elseif(条件){条件成立时执行;}elseif(条件){条件成立时执行;}else{条件不成立时执行;}
- 实例:
<?php
$t = 50;
if ($t < 10)
{
echo "Have a good morning!";
}
elseif ($t < 20)
{
echo "Have a good day!";
}
else
{
echo "Have a good night!";
}
?>
运行截图
条件判断语句Switch
- 用于根据多个不同条件执行不同动作
- 语法:
switch(){}
- 实例:
<?php
$favcolor="red";
switch ($favcolor)
{
case "red":
echo "你喜欢的颜色是红色!";
break;
case "blue":
echo "你喜欢的颜色是蓝色!";
break;
case "green":
echo "你喜欢的颜色是绿色!";
break;
default:
echo "你喜欢的颜色不是 红, 蓝, 或绿色!";
}
?>
运行截图
数组
- 数组是一个能在单个变量中存储多个值的特殊变量
创建数组
array();
- 数组类型:数值数组、关联数组、多维数组
数值数组
- 两种创建数值数组的方法
- 自动分配ID键(ID键总是从0开始)
$cars=array("Volvo","BMW","Toyota");
- 人工分配ID键
$cars[0]="Volvo"; $cars[1]="BMW"; $cars[2]="Toyota";
- 实例:
<?php
$cars=array("成都","北京","南充");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>
运行截图
获取数组长度-count()
- count() 函数用于返回数组的长度(元素的数量)
- 实例:
<?php
$cars=array("成都","北京","南充");
echo count($cars);
?>
运行截图
变量数值数组
- 遍历并打印数值数组中的所有值
- 实例:
<?php
$cars=array("成都","北京","南充");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++)
{
echo $cars[$x];
echo "<br>";
}
?>
运行截图
关联数组
- 关联数组是使用用户分配给数组的指定的键的数组
- 这里有两种创建关联数组的方法:
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
$age['Peter']="35"; $age['Ben']="37"; $age['Joe']="43";
- 实例:
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
运行截图
多维数组
- 一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组。依照这种方式,我们可以创建二维或者三维数组
<?php
// 二维数组:
$cars = array
(
array("Volvo",100,96),
array("BMW",60,59),
array("Toyota",110,100)
);
数组排序函数
- sort():对数组进行升序
- rsort():对数组进行降序
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
<?php
$numbers=array(4,6,2,22,11);
rsort($numbers);
print_r($numbers);
?>
运行截图
超级全局变量
- PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
while循环
- while 循环将重复执行代码块,直到指定的条件不成立
- 语法:
while(条件){ 执行的代码}
- 实例:
<?php
$a = 0;
while ($a < 5) {
echo $a;
echo "<br>";
$a++;
}
?>
运行截图
do…while语句
- 至少执行一次代码,然后检查条件,只要条件成立,就会重复进行循环
- 语法:
do{要执行的语句}while(条件)
- 实例:
<?php
$a = 0;
do{
echo $a;
echo "<br>";
$a++;
}
while ($a < 6);
?>
运行截图
for循环
- for 循环用于用户预先知道脚本需要运行的次数的情况
- 语法:
for(初始值;条件;增量){执行的代码}
- 实例:
<?php
$a = 0;
for(;$a < 10;$a++){
echo $a;
echo "<br>";
}
?>
运行截图
foreach循环
- foreach 循环用于遍历数组
- 输出给定数组的值的循环
- 语法:
foreach($array as $value){要执行的代码}
- 每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值。
- 实例:
<?php
$x=array("Google","Runoob","Taobao");
foreach ($x as $value)
{
echo $value;
echo "<br>";
}
?>
运行截图
- 输出给定数组键与值的循环
- 语法:
foreach($array as $key => $value){要执行的代码}
- 实例:
<?php
$x=array("Google","Runoob","Taobao");
foreach ($x as $key => $value){
echo "key 为 " . $key . ",对应的 value 为 ". $value;
echo "<br>";
}
?>
运行截图
函数
- 在 PHP 中,提供了超过 1000 个内建的函数
创建函数
- 函数是通过调用函数来执行的
- 语法:
function functionName(){要执行的代码}
- 函数命名准则:名称应该提示出它的功能,函数名称以字母或下划线开头
- 实例:
<?php
function writeName(){
echo "my name is haha";
}
writeName();
?>
运行截图
添加函数中的参数
- 实例:
<?php
// 需要传入1个参数值
function writeName($name){
echo "my name is $name";
echo "<br>";
}
// 需要传入两个参数值
function writeCar($car,$id){
echo "我的车是 $car,车牌号为 $id";
}
writeName('hello');
writeCar("领克30+","京A666666");
?>
运行截图
返回值
- 如需让函数返回一个值,使用 return 语句
<?php
function add($a,$b){
$res = $a + $b;
return $res;
}
echo " 10 + 20 =" . add(10,20) ;
?>
运行截图
魔术常量
- PHP向它运行的任何脚本提供了大量的预定义常量
- 但是,很多常量都是由不同的扩展库定义,只有加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了
- 有八个魔术常量它们的值随着它们在代码中的位置改变而改变
LINE
- 返回 文件中当前的行号
- 实例:
<?php
echo "这是第" . __LINE__ . "行";
?>
运行截图
FILE
- 文件的完整路径和文件名
- 如果用在被包含文件中,则返回被包含的文件名
- 实例:
<?php
echo "这该文件位于 '" . __FILE__ . "'";
?>
运行截图
DIR
- 文件所在的目录
- 如果用在被包含文件中,则返回被包括的文件所在目录
- 实例:
<?php
echo "这该文件位于 '" . __DIR__ . "'";
?>
运行截图
FUNCTION
- 返回所在的函数名称
- 实例:
<?php
function test(){
echo "函数名:" . __FUNCTION__;
}
test();
?>
运行截图
CLASS
- 返回所在类的名称
- 实例:
<?php
class test{
function t(){
echo "类的名称:" . __CLASS__;
echo "<br>";
echo "函数名:" . __FUNCTION__;
}
}
$a = new test();
$a -> t();
?>
运行截图
TRAIT
- Trait 的名字
- 实例:
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
运行截图
METHOD
- 类的方法名
- 返回该方法被定义时的名字
- 实例:
<?php
function test() {
echo '函数名为:' . __METHOD__ ;
}
test();
?>
运行截图
NAMESPACE
- 当前命名空间的名称
- 实例:
<?php
namespace MyProject;
echo '命名空间为:"', __NAMESPACE__, '"';
?>
运行截图
命名空间
- 命名空间可以解决两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突
- 给很长的标识符名称创建别名
定义命名空间
- 默认情况下,所有的常量、类和函数名都放在全局控件下,和PHP支持的命名空间之前一样
- 命名空间必须是程序脚本的第一条语句
- 命名空间通过关键字 namespace 来声明
- 如果一个文件中包含命名空间,它必须在其他所有代码之前声明命名空间
- 语法:
<?php // 定义代码在 'MyProject' 命名空间中 namespace MyProject;
命名空间使用
- 非限定名称,或不包含前缀的类名称
- 限定名称,或包含前缀名称
- 完全限定名称,或包含了全局前缀操作符的名称
使用命名控件:别名/导入
- 使用use 操作符导入/使用别名
- 一行中包含多个use语句
- 导入和动态名称
面向对象
- 在面向对象的程序设计( Object-oriented programming,缩写:OOP)
- 对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象
对象的主要三个特征- 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为
- 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型
- 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同
比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态
面向对象内容
- 类:定义一件事物的抽象特点
- 对象:类的实例
- 成员变量:定义在类内部的变量,可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性
- 成员函数:定义在类的内部,可用于访问对象的数据
- 继承:子类自动共享父类数据结构和方法的机制,这是类之间的一种关系
- 父类:一个类被其他类继承,该类被称为父类、基类、超类
- 子类:一个类继承其他类,称为子类或派生类
- 多态:相同的函数或方法可作用于多种类型的对象上并获得不同的结果,不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性
- 重载:函数或者方法有同样的名称,但是参数列表不相同的情形
- 抽象性:将具有一致的数据结构(属性)和行为(操作)的对象抽象成类
- 封装:将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内
- 构造函数:用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中
- 析构函数:析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数
- 析构函数往往用来做"清理善后" 的工作
类的定义
- 类使用class关键字后加上类名定义
- 类名后 {} 内可定义 变量和方法
- 类的变量使用var 声明,变量也可以初始化值
- 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问
- 实例:
<?php
class Site {
// 成员变量
var $url;
var $title;
//成员函数
function setUrl($par){
$this->url = $par; //变量 $this 代表自身的对象
}
function getUrl(){
echo $this->url;
echo "<br>";
}
function setTitle($par){
$this->title = $par;
}
function getTtile(){
echo $this->title;
echo "<br>";
}
}
?>
创建对象
- 使用 new 运算符来实例化该类的对象
- 实例:
<?php
class Site {
// 成员变量
var $url;
var $title;
//成员函数
function setUrl($par){
$this->url = $par; //变量 $this 代表自身的对象
}
function getUrl(){
echo $this->url;
echo "<br>";
}
function setTitle($par){
$this->title = $par;
}
function getTtile(){
echo $this->title;
echo "<br>";
}
}
$a = new Site;
$b = new Site;
$c = new Site;
?>
调用成员方法
- 使用该对象调用成员方法,该对象的成员方法只能操作该对象的成员变量
- 实例:
<?php
class Site {
// 成员变量
var $url;
var $title;
//成员函数
function setUrl($par){
$this->url = $par; //变量 $this 代表自身的对象
}
function getUrl(){
echo $this->url;
echo "<br>";
}
function setTitle($par){
$this->title = $par;
}
function getTtile(){
echo $this->title;
echo "<br>";
}
}
// 创建对象
$a = new Site;
$b = new Site;
$c = new Site;
// 调用成员函数,设置标题和url
$a->setTitle("真菜");
$b->setTitle("hello");
$c->setTitle('world');
$a->setUrl('www.cai.com');
$b->setUrl('www.hello.com');
$c->setUrl('www.world.com');
// 调用成员变量,获取标题和url
$a->getTtile();
$b->getTtile();
$c->getTtile();
$a->getUrl();
$b->getUrl();
$c->getUrl();
?>
运行截图
构造函数
- 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值
- 在创建对象的语句中与 new 运算符一起使用
- 语法:`void __construct ([ mixed $args [, $… ]] )
- 实例:
<?php
class Site {
// 成员变量
var $url;
var $title;
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
function setTitle($par){
$this->title = $par;
}
function getTtile(){
echo $this->title;
echo "<br>";
}
}
// 创建对象
$a = new Site("真菜",'www.cai.com');
$b = new Site("hello",'www.hello.com');
$c = new Site('world','www.world.com');
// 调用成员变量,获取标题和url
$a->getTtile();
$b->getTtile();
$c->getTtile();
$a->getUrl();
$b->getUrl();
$c->getUrl();
?>
运行截图
析构函数
- 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数
- 语法:
void __destruct ( void )
继承
- 使用关键字 extends 来继承一个类,PHP 不支持多继承
- 语法:
class Child extends Parent { // 代码部分 }
- 实例:
<?php
class Site {
// 成员变量
var $url;
var $title;
//成员函数
function setUrl($par){
$this->url = $par; //变量 $this 代表自身的对象
}
function getUrl(){
echo $this->url;
echo "<br>";
}
function setTitle($par){
$this->title = $par;
}
function getTtile(){
echo $this->title;
echo "<br>";
}
}
//继承
class Child_Site extend Site{
var $category;
function setCate($par){
$this->category = $par;
}
function getCate(){
echo $this->category . PHP_EOL; //PHP_EOL 换行符
}
}
?>
方法重写
- 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写
- 实例:
<?php
class Site {
// 成员变量
var $url;
var $title;
//成员函数
function setUrl($par){
$this->url = $par; //变量 $this 代表自身的对象
}
function getUrl(){
echo $this->url;
echo "<br>";
}
function setTitle($par){
$this->title = $par;
}
function getTtile(){
echo $this->title;
echo "<br>";
}
}
//继承
class Child_Site extend Site{
// 覆盖写
function getTtile(){
}
function setTitle(){
}
}
?>
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现
- public(公有):公有的类成员可以在任何地方被访问。
- protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
- private(私有):私有的类成员则只能被其定义所在的类访问。
属性的访问控制
- 类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有
方法的访问控制
- 类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有
接口
- 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容
- 通过 interface 关键字来定义,其中定义所有的方法都是空的
- 接口中定义的所有方法都必须是公有,这是接口的特性
- 要实现一个接口,使用 implements 操作符
- 类中必须实现接口中定义的所有方法
- 类可以实现多个接口,用逗号来分隔多个接口的名称
- 语法:
// 声明接口
interface name{}
// 实现接口
class className implements name{}
常量
- 把在类中始终保持不变的值定义为常量
- 定义和使用常量的时候不需要使用 $ 符号
- 常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用
- 可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)
- 定义常量关键字 const
抽象类
- 任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的
- 定义为抽象的类不能被实例化
- 继承一个抽象类的时候,子类必须定义父类中的所有抽象方法,另外,这些方法的访问控制必须和父类中一样
- 使用关键字 abstract
- 子类方法可以包含父类抽象方法中不存在的可选参数
static 关键字
- 声明类属性或方法为 static(静态),就可以不实例化类而直接访问
- 静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)
- 由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用
- 静态属性不可以由对象通过 -> 操作符来访问
- 用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static
final 关键字
- 如果父类中的方法被声明为 final,则子类无法覆盖该方法
- 如果一个类被声明为 final,则不能被继承
调用父类构造方法
- 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();
?>
运行截图