今天所学心得、笔记
示例运行截图
1、Animal父类代码
// 类: 对象的模板
class Animal {
// 类成员: 属性, 方法
// 属性: 变量
protected $name;
protected $age;
// 方法: 函数
// 构造方法
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
// 实例方法
public function show() {}
public function speak() {}
}
2、Cat类代码
require 'Loader.php';
class Cat extends Animal {
// 类成员: 属性, 方法
// 属性: 变量, 构造方法, 继承父类的
// 实例方法,重写父类的方法
public function show() {
echo "这是一只小猫,名字叫:{$this->name}, 它{$this->age}岁了...", "<br>";
}
public function speak() {
echo "小猫发出“喵、喵、喵”的叫声...", "<br>";
}
}
3、Dog类代码
require 'Loader.php';
class Dog extends Animal {
// 类成员: 属性, 方法
// 属性: 变量, 构造方法, 继承父类的
// 属性扩展
private $weight;
// 重写构造方法
public function __construct($name, $age, $weight)
{
// $this->name = $name;
// $this->$age = $age;
// 调用父类的通用构造方法
parent::__construct($name, $age);
//增加自己独有的属性
$this->weight = $weight;
}
// 实例方法,重写父类的方法
public function show() {
echo "这是一只小狗,名字叫:{$this->name}, 它{$this->age}岁了, 它{$this->weight}斤重...", "<br>";
}
public function speak() {
echo "小狗发出“汪、汪、汪”的叫声...", "<br>";
}
}
4、Duck类代码
require 'Loader.php';
class Duck {
// 类成员: 属性, 方法
// 属性: 变量, 静态属性
public static $name;
public static $age;
//构造方法, 继承父类的
public function __construct($name, $age)
{
// self: 当前类的引用
self::$name = $name;
self::$age = $age;
}
// 实例方法,重写父类的方法
public static function show() {
echo "这是一只小鸭,名字叫:". self::$name .", 它". self::$age ."岁了...", "<br>";
}
public static function speak() {
echo "小鸭发出“嘎、嘎、嘎”的叫声...", "<br>";
}
}
5、测试PHP文档代码
require 'Loader.php';
echo "------小猫类,继承Animal父类,和其成员/方法--------", "<br>";
$c = new Cat("咪咪", 3);
$c->show();
$c->speak();
echo "<br>";
echo "------小狗有和父类不一样的扩展属性,\$weight--------", "<br>";
$d = new Dog("旺财", 5, 15);
$d->show();
$d->speak();
echo "<br>";
echo "------小鸭采用的是静态成员,和静态方法--------", "<br>";
echo "------静态调用采用,类名 + 双冒号 + 属性/方法名--------", "<br>";
$u = new Duck("小黄", 2);
echo Duck::$name, "<br>";
echo Duck::$age, "<br>";
Duck::show();
Duck::speak();
echo "<br>";
echo "------trait功能,及其使用--------", "<br>";
// 父类
class P
{
public function m1()
{
echo "这里是父类class P的m1()方法", "<br>";
}
}
trait T1
{
public function m1()
{
echo "这里是trait T1的m1()方法", "<br>";
}
}
trait T2
{
public function m1()
{
echo "这里是trait T2的m1()方法", "<br>";
}
}
// 子类
class A extends P
{
use T1,T2{
// 1. 优先级
T1::m1 insteadOf T2;
// 2. 别名
T2::m1 as T2m1;
}
// 在子类中将父类的m1进行了重写
public function m1()
{
echo "这里是自己class A的m1()方法", "<br>";
// return parent::m1();
}
}
echo "------在自己、父类class P和trait T中都有同名m1方法时--------", "<br>";
echo "------自己方法 >>trait T方法 >>class P方法 --------", "<br>";
echo "------当trait T1、T2有相同方法时,需要其中一个起别名 --------", "<br>";
(new A)->m1();
(new A)->T2m1();
6、类的自动加载器代码
spl_autoload_register(function ($class){
require $class.'.php';
});