目录结构
Animal.php
<?php
/*
* 动物类
*
*/
class Animal
{
// 属性前要有访问修饰符
// public 默认的, 关键词定义类内、类外、子类都可见
// protected 关键词定义类内、子类可见,类外不可见
// private 关键词定义类内可见, 子类、类外不可见
public $name;
public $speed;
public $food;
private $age;
protected $life;
// 给private protected属性赋值
// 魔术函数 : __set __get __call __callStatic
// 构造函数 构造器 类每实例化一次 构造函数自动被调用
public function __construct($name, $speed, $food, $age, $life)
{
// 类成员之间的互相访问 $this 本对象
// 1.初始化类成员 让类/对象的状态稳定下来
// 2.给对象的属性进行初始化赋值
// 3.给私有或者受保护的成员属性赋值
$this->name = $name;
$this->speed = $speed;
$this->food = $food;
$this->age = $age;
$this->life = $life;
}
public function run()
{
echo "{$this->name}正以{$this->speed}的速度奔跑。<br>";
}
public function eat()
{
echo "{$this->name}喜欢吃{$this->food}<br>";
}
}
Animal_carnivore.php
<?php
/*
* 食肉动物类
* 类的继承(扩展)extends
* PHP oop具有单继承的诟病->带来程序的高耦合性:如果程序通过深层次继承绑定到某个具体的类,
* 即使对父类做一些简单的修改,也会对子类带来严重的破坏性。
* trait trait是为类似php这种单继承的语言而准备的一种代码复用的机制
* 要追加的新功能放到一个trait里,然后让A组子类去use trait 不是类
*/
class Animal_carnivore extends Animal
{
// 扩展属性
private $ferocity;
public function __construct($name, $speed, $food, $age, $life, $ferocity)
{
// parent 调用父类的成员
// 调用父类构造函数
parent::__construct($name, $speed, $food, $age, $life);
$this->ferocity = $ferocity;
}
// 重写父类中的普通方法
public function eat()
{
return parent::eat() . "它是{$this->ferocity}的食肉动物。<br>";
}
// 扩展方法
public function hunting()
{
echo "{$this->name}通过伏击捕猎。<br>";
}
}
Fish.php
<?php
/*
* 鱼类
*
* 类的静态成员 static 关键字标识, 静态成员由类本身来调用的,为所有实例共享
* 优点
* 1.在内存中即使存在多个实例,静态成员在内存中只占一份,为所有实例共享,普通成员以实例的方式会占用多个内存块
* 2.静态成员的执行效率比实例化高,不需要类的实例化就能够访问静态成员。
* 缺点:静态成员不自动进行销毁,而实例化的结果会被自动销毁
*/
class Fish
{
public static $name = '巨齿鲨'; // 默认值
static public $count = 0; // 记录构造函数实例化次数
function __construct($name)
{
// self::类引用 在类中访问静态成员
self::$name = $name;
self::$count++;
}
// 静态方法中不能访问普通成员 只能访问静态成员
static function login_count()
{
return sprintf('目前有%d条鱼。<br>', self::$count);
}
}
// mvc架构模式 那么任何一个url请求都会定位到某一个具体的类(控制器)的方法中
autoload.php
<?php
/*
* 类的自动加载器
*/
spl_autoload_register(function ($class_name) {
$class_file = dirname(__FILE__, 2) . DIRECTORY_SEPARATOR . 'oop' . DIRECTORY_SEPARATOR . $class_name . '.php';
if (is_file($class_file) && file_exists($class_file)) {
require $class_file;
} else {
throw new Exception('文件名不合法或者文件不存在。');
}
});
Animal_world.php
<?php
require __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';
$zebra = new Animal('斑马', '60公里/小时', '草', 6, 20);
$zebra->run();
$zebra->eat();
$lion = new Animal_carnivore('狮子', '50公里/小时', '肉', 8, 14, '最凶猛');
$lion->run();
$lion->eat();
$lion->hunting();
echo '静态成员Fish::$name为:' . Fish::$name . '<br>';
$Megalodon = new Fish('巨齿鲨');
$Galeocerdo_cuvier = new Fish('虎鲨');
$Sousa_chinensis = new Fish('中华白海豚');
echo Fish::login_count();