1. 基本内容
这节课讲了面向对象其中一部分内容,主要有以下几点:
类与实例:类的实例,实际上就是一个对象,类使用
class
关键字定义,类的示例使用new
关键字定义类属性与类方法:不管属性还是方法,只要在前面加上了
static
关键字,就表示静态属性或静态方法,此时,就可以不需要实例化类而直接访问了,也因为不需要使用对象来调用,所以伪变量$this
在静态方法中就不能使用了类成员的访问控制:也可以叫做封装,实际上就是使用
public
、private
、protected
关键字对类成员(包括类属性和类方法)的作用域设置使用范围类的扩展及扩展方式:实际上就是类的继承,子类共享父类的属性和方法,并且子类可以对父类中的属性或方法进行覆盖或者扩展
2. 实例演示
2.1 类与示例
<?php
// 类与示例
// 1. 声明一个类
class Car
{
public $price;
public $performance;
public function config () {}
}
// 2. 类的示例:对象
$Bmw = new Car();
// 3. 简写:可省略小括号
$Changan = new Car;
2.2 类属性与类方法
<?php
// 类成员:包括类属性和类方法
class Cars
{
// 1. 类属性
public $price;
public $brand;
public $performance;
// 2. 类方法
public function config () {
printf('%s 的价格才 %d 元,性能也 %s ,配置是真好!',$this->brand,$this->price,$this->performance);
}
// 构造函数:它是一种特殊的方法,主要用来对 对象成员变量赋初始值,此方法必须在类实例中用 new 来调用
public function __construct($bra,$pri,$per)
{
// 为变量赋值
// $this:表示类实例引用,相当于 $this = new self ;
// self :引用当前类名称
$this->price = $pri;
$this->brand = $bra;
$this->performance = $per;
}
}
// 实例化一个类,并传参
$changan = new Cars('长安',20000,'not bad');
// 调用函数
$changan->config();
echo '<hr>';
// 动态类:和可变变量差不多,就是将类名称放到一个变量中
$car = 'Cars';
// 原始写法:
// $wuling =new Cars('五菱',19000,'not bad');
// 动态类写法:利用变量
$wuling =new $car('五菱',19000,'not bad');
$wuling->config();
<?php
// 类成员中的 static 关键字
// 一旦声明了属性或方法为static(静态),就可以不实例化类而直接访问了,
// 因为静态方法不需要通过对象就可以调用,所以$this在静态方法中不可用
class Info
{
public static $sex = 'male';
public static function same () {
// 这里使用$this的话会报错
// return 'We are all '.$this->$sex;
// 使用self:表示引用当前类名称
return 'We are all '.self::$sex;
}
}
// 不需要实例化类,直接访问
echo Info::$sex;
echo '<hr>';
echo Info::same();
2.3 类成员的访问控制
<?php
// 类成员的访问控制:也叫封装
// 通过关键字 public、private、protected 来声明类成员的作用域
class StuInfo
{
// public 公共的,在类的外部、内部以及子类都可使用
public $name = '佩奇';
// protected 受保护的,在类的内部和子类均可使用,仅外部不能使用
protected $score = '90';
// private 私有的,仅在类的内部使用,外部和子类均不能使用
private $grade = '一年级';
public function info () {
return "{$this->grade} 学生 {$this->name} 的平均分是 {$this->score} 分";
}
}
// 子类
class StuInfo1 extends StuInfo
{
public function info () {
// 如果加入 {$this->grade} ,就会报错,因为这是私有成员,子类也不能使用
// return "{$this->grade} 学生 {$this->name} 的平均分是 {$this->score} 分";
return " 学生 {$this->name} 的平均分是 {$this->score} 分";
}
}
// 1. 实例化类,调用函数,均可输出,表示任何类型在内部均可使用
$demo1 = new StuInfo;
$res = $demo1->info();
echo $res.'<hr>';
// 2. name输出,score无输出,grade报错,表示public在外部可用,protected和pricate在外部均不可使用,
$demo2 = new StuInfo;
echo $demo2->name,'<br>';
// echo $demo2->score,'<br>';
// echo $demo2->grade,'<br>';
echo '<hr>';
// 3. 实例化子类,现在有输出,表示public和protected在子类中可用
$demo3 = new StuInfo1;
echo $demo3->info();
2.4 类的扩展及扩展方式
<?php
// 类的扩展及扩展方式:扩展也叫做继承
// 扩展方式分为:属性扩展和方法扩展
// 扩展有两层意思:1. 在原来的基础之上增加内容 2.覆盖原来的内容
class Stu
{
public $name = '佩奇';
public $grade = '一年级';
public $hello ='棒棒哒';
public function info () {
return "{$this->grade} 学生 {$this->name} {$this->hello}";
}
}
// 扩展:增加内容
class Demo1 extends Stu
{
// 1. 属性扩展,子类能够继承父类的属性,现在我只增加一个属性
public $score = '100';
// 2. 方法扩展,在原有的方法上,增加内容
public function info () {
// return "{$this->grade} 学生 {$this->name} {$this->hello}";
// 引用父类的方法,简写:
return parent::info()." , 因为它考了 {$this->score} 分";
}
}
$obj1 = new Stu;
echo $obj1->info(),'<hr>';
$obj2 = new Demo1;
echo $obj2->info(),'<hr>';
// 扩展:覆盖内容
class Demo2 extends Stu
{
// 1. 属性扩展,修改父类中的属性
public $name = '柯蓝';
public $grade = '六年级';
// 2. 方法扩展,修改父类中的方法
public function info () {
return "{$this->grade} 学生 {$this->name} 帅爆了";
}
}
$obj3 = new Stu;
echo $obj3->info(),'<hr>';
$obj4 = new Demo2;
echo $obj4->info(),'<hr>';
<?php
// final 关键字 :一旦使用此关键字,表示方法或者类都不允许扩展或者继承
final class Stu
// class Stu
{
public $name = '佩奇';
public $grade = '一年级';
public $hello ='棒棒哒';
// 1. 方法使用 final 关键字
final public function info () {
return "{$this->grade} 学生 {$this->name} {$this->hello}";
}
}
class Demo1 extends Stu
{
public $name = '孙悟空';
// 方法扩展
public function info () {
return "{$this->grade} 学生 {$this->name}";
}
}
$obj = new Demo1;
echo $obj->info();
3. 总结
声明类与实例化类比较简单,知道两个关键词,
class
和new
加入了
static
关键字的属性或方法,就不需要实例化了,可以直接使用类来访问,语法:类名称::类方法或者类属性
,记住:在类方法中$this->
没有用了,要使用self::
来引用当前类名称,访问类属性记住类成员加入了
public
、private
、protected
关键字后,其作用域范围扩展/继承中,子类能够继承父类的属性和方法,也能对其修改或者更新,但是一旦方法或者类加入
final
关键字后,就不能再扩展/继承了