Correcting teacher:PHPz
Correction status:qualified
Teacher's comments:
访问修饰符,有三个:
public 公用的
protected 受保护的,在外面不能直接访问
private 私有的
PHP的oop面向对象开发,它的三大特性:封装,继承,多态
require_once 加载,可以加载引入类使用
-创建类
class A
{
// 成员属性
// 公开的,外部可以访问
public $name;
public $id = 123; // 给默认值
// 受保护的,在外面不可以访问,但是可以继承
protected $salary;
// 私有的,只能本类(我)自己调用,子类都继承不了的
private $password;
// 构造方法,专门给受保护的属性,给与重新赋值,构造方法也是可以继承的
public function __construct($a, $b, $c, $d)
{
$this->name = $a;
$this->id = $b;
$this->salary = $c;
$this->password = $d;
}
// 可以通过 __construct 方法里,把其他属性通过用户传过来
public function bldy()
{
return "我的名字叫:{$this->name},我的id是:{$this->id},我的工资是:{$this->salary},我的密码是:{$this->password}";
}
// 方法在本类里调用 用 $this 代表本类和英文里的 my一个意思
public function dy()
{
return $this->bh() . ',另外:' . $this->sy();
}
// 成员方法 可以公开的
public function gk()
{
return '这里可以写很多代码,进行功能处理,和函数一样,也可以写返回的数据类型';
}
// 成员方法,受保护的
protected function bh()
{
return '这个方法是受保护的,可以继承';
}
// 成员方法,私有的
private function sy()
{
return '私有的,子类是继承不了的';
}
require_once 'A.php'; // 引用创建的 A 类
// 这个类创建出来,给不能访问的属性,添加默认值
$obj = new A('晋阳', '123', '5000', '123456');
echo $obj->name; // name 是公开的,所以可以输出
echo '<hr>';
echo $obj->id;
echo '<hr>';
echo $obj->salary; // 受保护的,在外部不能调用,所以报错
echo '<hr>';
echo $obj->password; // 私有的,只能自己使用,所以报错
echo '<hr>';
echo $obj->bldy(); // 受保护的和私有的在外部不能访问,但是可以自己调用出来
echo '<hr>';
echo $obj->dy(); // 在本类中可以用$this调用方法
传值的属性,是先传给子类,如果子类里面有构造方法先使用了它,它就优先用子类的构造方法,替换掉父类的构造方法
创建子类
require_once 'A.php';
// B 类,继承 A类
class B extends A
{
// 可以在父类的基础上进行扩展
// public $age;
// 可以重写构造方法,对属性进行重新赋值
// public function __construct($age)
// {
// $this->age = $age;
// }
// 受保护的属性在子类里也可以调用,但是要在子类里面使用
public function get_salary()
{
return '父类的工资是:' . $this->salary;
}
// 子类和父类都有 bldy 重复了,可以用 parent:: 调用父类的 bldy
public function bldy()
{
return parent::bldy() . ',这是从B类里传出来的';
}
}
blay在子类调用
spl_autoload_register(
function ($className) {
// $className 是new的B这个名字,这个名字是类名,不是文件名
require_once $className . '.php';
}
);
把 final 写在 class 前面那么这个类就不能被继承
不能继承
// final 写在 class前面这个类就不能被继承
final class C
{
public $name;
public $id;
protected $salary;
private $password;
public function __construct($a, $b, $c, $d)
{
$this->name = $a;
$this->id = $b;
$this->salary = $c;
$this->password = $d;
}
// final 写在方法前面,那么这个方法就不能被修改
final public function bldy()
{
return "我的名字叫:{$this->name},我的id是:{$this->id},我的密码是:{$this->password},我的工资有:{$this->salary}";
}
}
静态成员访问方式,用类名::属性名,类名::方法名()
一个类,不用实例就能使用里面的属性和方法.
静态成员由本类掉用,为所有实例共享
静态类
class Shop
{
// 静态属性
public static $title;
public $price;
public $num1 = 1;
public static $num2 = 2;
public function __construct($t, $p)
{
$this->title = $t;
$this->price = $p;
$this->num1++; // 普通变量,都是从头开始计算
// self:: 代表静态成员的本类
self::$num2++; // 静态成员,只要是调用了,就会增加1
}
// 静态方法
public static function cartoon()
{
return '使用' . Shop::$title;
}
}
调用
Shop::$title = '苹果13Pro'; // 赋值
echo Shop::$title;
echo '<hr>';
echo Shop::cartoon();
echo '<hr>';
echo Shop::$num2;
输出