普通类
无继承的代码很繁琐(其中 Dog 类的 $name 属性和 shout 方法重复定义)
<?php
class Animal
{
public $name = 'Animal';
public function shout()
{
echo "动物叫。";
}
}
class Dog
{
public $name = 'Dog';
public $owner = 'tom';
public function shout()
{
echo "狗叫。";
}
public function swim()
{
echo "狗会游泳。";
}
}
继承类
<?php
class Animal
{
public $name = 'Animal';
public function shout()
{
echo "动物叫。";
}
public function hello()
{
echo "今天天气好!";
}
}
/*
* php继承的语法
* 子类 extends 父类{...}
*/
class Dog extends Animal
{
public $owner = 'tom';
public function swim()
{
echo "狗会游泳。";
}
public function hello()
{
echo "我叫MT!";
}
}
$dog = new Dog();
//继承自父类
echo $dog->name;//Animal
$dog->shout();//动物叫
//子类
echo $dog->owner;//tom
$dog->swim();//狗会游泳。
//子类覆盖掉父类的方法
$dog->hello();//我叫MT!
构造函数的继承
注意:子类不能继承父类的私有属性和方法
<?php
class Animal
{
public $name = 'Animal';
private $age='10';
public function __construct($name = 'Animal')
{
echo "父类方法被调用";
$this->name = $name;
}
}
/*
* php继承的语法
* 子类 extends 父类{...}
*/
class Dog extends Animal
{
public $owner = 'tom';
}
$dog = new Dog('Lucy');//父类方法被调用
echo $dog->name;//Lucy
//子类不能继承父类的私有属性和方法
echo $dog->age;//报错
访问控制修饰符
private、protected、public
以属性为例 方法也是一样的
类内 和 全局:
<?php
class Person
{
public $name = 'bob';
protected $age = 22;
private $money = 100;
public function intro()
{
//类内
echo 'my name is ' . $this->name . '; '; //my name is bob;
echo 'i am ' . $this->age . ' years old' . '; '; //i am 22 years old;
echo 'i have ' . $this->money . ' $' . '; '; //i have 100 $;
}
}
$bob = new Person();
$bob->intro();
//类外
echo $bob->name;//bob
echo $bob->age;//报错 protected修饰的属性和方法,不能在类外访问
echo $bob->money;//报错 private修饰的属性和方法,不能在类外访问
子类中 和 全局:
<?php
class Person
{
public $name = 'bob';
protected $age = 22;
private $money = 100;
}
class Child extends Person
{
public function __construct()
{
//子类中
echo $this->name;//bob
echo $this->age;//22
echo $this->money;//报错 private修饰的属性和方法,不能在子类访问
}
}
$child = new Child();
//类外
echo $child->name;//bob
echo $child->age;//报错 protected修饰的属性和方法,不能在子类访问
echo $child->money;//报错 private修饰的属性和方法,不能在子类访问