公有成员变量或方法能被全局访问,私有成员变量或方法只能被所属类访问,保护成员变量或方法能被同类和子类访问
基类就是父类,派生类就是子类
扩展或派生出来的类拥有其基类的所有变量和函数,并包含所有派生类中定义的部分
public、protected
关键字定义的成员变量和成员函数可以被子类继承,private
关键字定义的成员变量和成员函数不能被子类继承
::
运算符调用其他不相关类(除去父类子类)的类成员,PHP 是通过 伪变量$this->
和 作用域操作符::
来实现的
关键字::变量名/常量名/方法名
上述格式中的「关键字」分为以下 3 种情况。
parent:可以调用父类中的成员变量、成员方法和常量。
self:可以调用当前类中的静态成员和常量。
类名:可以调用基类中的变量、常量和方法。
案例:
class A {
//定义类 A
function example() {
//定义类中的函数
echo "我是基类的函数 A::example().
静态方法只能调用静态成员变量
上图中将private $i = 1;
改为 private static $i = 1;
即可
静态方法和常量,都用::
形式调用,例如:self::$i
对于在继承类中使用基类的情况,不要使用基类的名字,应该使用特殊的名字 parent
假设A是基类
尽量不要写成:A::example();
写成: parent::example(); //使用关键字 parent 指明是使用基类
当在一个函数声明前使用 final 关键字时,这个被修饰的函数不能被任何函数重载。
当一个类被 final 修饰后,说明该类不可以再被继承,也不能再有子类。
当一个方法被 final 修饰后,说明该方法在子类中不可以进行重写,也不可以被覆盖
不是所有的变量(方法)都要通过创建对象来调用。 可以通过给变量(方法)加上 static 关键字的方式来直接调用。
虽然是同一种方法,却产生了不同的形态,这就是多态。
多态有两种存在形式,分别是覆盖和重载
interface
关键字声明一个接口,接口名一般大写
interface 接口名
{
function 接口函数 A();
function 接口函数 B();
…
}
class 类名 implement 接口名 //一个类可以实现多个接口,implement后可写多个接口,用逗号分隔
{
function 接口函数 A(); //类中的函数要与接口中的函数对应,接口中的成员函数要在类中成员函数实现
function 接口函数 B();
…
}
接口使用的一个案例:
//定义接口
interface User{
function getDiscount();
function getUserType();
}
//定义VIP用户这个类,关键字“implement” 把接口整合起来
class VipUser implements User{
private $discount=0.8;
function getDiscount() //第一个接口函数的具体实现
{
return $this->discount;
}
function getUserType() //第二个接口函数的具体实现
{
return "VIP用户";
}
}
//定义商品类
class Goods{
var $price = 100; //定义价格
var $vc;
//定义run方法,参数类型是User接口类型参数
function run(User $vc){
$this->vc = $vc;
$discount = $this->vc->getDiscount();
$usertype = $this->vc->getUserType();
echo $usertype."商品价格:".$this->price*$discount;
}
}
$display = new Goods();
$display->run(new VipUser);
//输出:VIP用户商品价格:80
?>
接口不能被实例化,接口可以继承接口
对于PHP这种不能继承多个类的语言,可以借助接口来实现。接口提供了相当于多重继承的功能,但是它不会带来多重继承所产生的语义上的歧义。