类
类的定义
//简单的类的例子
class People
{
const PI=3.14; //类常量
//成员变量
public $name; //public 公共的,可外部访问
protected $age; //protected 受保护的,在类的内部使用,父类及子类皆可
private $salary; //private 私有的,只在当前类使用
public function __construct($name,$age) //构造函数,在类实例化前调用
{
$this->name=$name;
$this->age=$age;
}
public function __destruct() //析构函数,在该类实例销毁时触发
{
return __CLASS__." has been destroyed";
}
public static function fn() //静态成员方法
{
return __METHOD__;
}
public function fn1() //成员方法
{
return __METHOD__;
}
}
//用法
People::fn(); //静态调用
var_dump(People::PI); //访问类常量
$people=new People('小明',18); //实例化
var_dump($people->name); //访问成员变量
$people->fn1(); //调用成员方法
访问控制
- public (公有) 公有的类成员可以在任何地方被访问。
- protected (受保护) 受保护的类成员则可以被其自身以及其子类和父类访问。
- private (私有) 私有的类成员则只能被其定义所在的类访问。
- 如不声明即为public(公有)
构造函数 __construct 用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。
析构函数 __destruct 当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
继承 extends
- PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承
class People
{
public $name;
public $age;
public function __construct($name,$age)
{
$this->name=$name;
$this->age=$age;
}
}
class Chinese extends Peopel //extends 继承
{
public $country;
public function __construct($name,$age,$country)
{
//PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct() 。
parent::__construct($name,$age);
$this->country=$country;
}
}
$ch=new Chinese('xiaoxiao',18,'china');
抽象类及抽象方法 abstract
- 抽象方法 即 没有方法体的方法且需要用abstract关键字修饰
- 抽象类 即 存在抽象方法的类且需要用abstract关键字修饰
- 抽象类只能继承,不能实例化,其作用更像是给子类一个约束,起规范作用
abstract class People
{
abstract function lst(); //抽象方法,没有{}即方法体
public function fn()
{
echo "fn call ...";
}
}
//继承抽象类后,必须实现父类中的所有抽象方法
class Chinese extends People
{
public function lst()
{
echo "抽象方法lis";
}
}
$chinese=new Chinese();
$chinese->lst();
接口 interface
- 使用interface关键字来定义,就像定义一个标准的类一样,但其中所有的方法都是空的。
- 如果说抽象类起到规范作用,那么接口则完完全全是用于规范限制作用
- 指定某个类必须实现哪些方法
- implements 绑定需实现的接口
- 上诉说到,php没有多继承,则可以用接口模拟多继承
interface DB
{
const PI=3.1415962;
public function open();
}
interface qq
{
public function close();
}
class people
{
public function lst()
{
echo "lst";
}
}
//使用接口
//在php里可同时使用多个接口
//也可以继承后接入接口
class mysqldb extends people implements DB,qq
{
public function open()
{
echo "open";
}
public function close()
{
echo "close";
}
}
$mysqldb=new mysqldb();
$mysqldb->open();
$mysqldb->lst();
trait
- php 中没有多继承,为实现多继承,可以用链式继承和接口外,还可以使用trait实现。
- 用trait代替class关键字声明类,然后用use引入这段代码
trait People
{
public $color='witle';
public function lst()
{
var_dump('lst ...');
}
public function run()
{
var_dump('People run ...');
}
}
trait Animal
{
public $color='yellow';
public function run()
{
var_dump('Animal run ...');
}
}
class Chinese
{
// use Animal;
// use People;
use Animal,People{
//当出现重名方法时,声明使用那个trait的方法
Animal::run insteadof People; //用Animal的run方法覆盖people的run方法;
People::run as prun;
}
}
$p=new Chinese();
$p->run();
$p->lst();
var_dump($p->color);
$p->prun();
Final 关键字 如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
class BaseClass {
public function test() {
echo "BaseClass::test() called" . PHP_EOL;
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called" . PHP_EOL;
}
}