类代码练习
1、代码练习
<?php
class A
{
//类通过protected和private关键字来封装
public $name='ldy';
protected $sex='男';
protected $age=28;
public static $course='PHP中文网';
public function getName(){
return __CLASS__.'=>'.__METHOD__;
}
protected function getClass(){
return __CLASS__.':'.$this->getcountvar().'个属性';
}
private function getcountvar(){
return count(get_class_vars(__CLASS__));
}
}
// 继承/扩展
class B extends A
{
public static $work='销售';
// 修改父类中的访问权限遵循:子类的访问权限必须大于等于父类;public≥protected≥private
// 重写
public function getClass(){
return parent::getClass().';'.static::$work;
}
// 多态
public static function get(){
return '调用静态函数'.__METHOD__;
}
}
echo B::$course.B::$work,'<br>';
echo B::get(),'<br>';
$b=new B();
echo $b->getName(),'<br>';
echo $b->getClass(),'<br>';
echo '<hr>';
//抽象类
abstract class C
{
//类通过protected和private关键字来封装
public $name='ldy';
protected $sex='男';
protected $age=28;
public static $course='PHP中文网';
public function getName(){
return __CLASS__.'=>'.__METHOD__;
}
abstract protected function getClass();
abstract protected function getcountvar();
}
// 继承/扩展
class D extends C
{
public static $work='销售';
// 修改父类中的访问权限遵循:子类的访问权限必须大于等于父类;public≥protected≥private
// 重写
// 多态
public static function get(){
return '调用静态函数'.__METHOD__;
}
function getClass(){
return __CLASS__.':'.$this->getcountvar().'个属性'.static::$work;
}
function getcountvar(){
// 父类中的私有变量在继承中是无法直接继承的
return count(get_class_vars(__CLASS__));//返回私有变量不参与计算
}
}
$b=new D();
echo $b->getName(),'<br>';
echo $b->getClass(),'<br>';
// echo $b->getcountvar(),'<br>';
echo '<hr>';
//接口类
interface F
{
const CITY='郑州';
public static function get();
}
class G implements F{
private $word='测试';
public static function get(){
return '我在'.F::CITY;
//return '我在'.F::CITY.$this->word;静态方法无法直接调用类中的属性
}
// 访问私有变量
public function getP(){
return $this->word;
}
}
echo F::CITY,'<br>';
echo G::get(),"<br>";
echo (new G)->getP();
2、演示结果
总结
1、self: 引用当前, $this: 引用当前实例;例如:new self()
和$this->var
;A extends B{}
:A类继承于B类;
2、global
关键字声明访问外部变量;
3、static
:静态方法不允许使用$this;只能访问静态成员: 静态属性, 静态方法;
4、static::$course
与self::$scourse
的区别是,self只认定义的类,static可以区分(父和子),作用于实列类执行
5、类中访问限制(封装):public|protected|private;同一个类中的方法可以访问类中所有的方法和属性
6、 二类成员: 子类有权访问的父类成员类型, public, protected
7、三种操作: 子类对父类的三种操作: 继承, 重写, 扩展
8、类的三个特性:
1. 继承: 父类的二类成员自动成为子类的成员
2. 重写: 覆写与父类/基类同名的成员(属性, 方法)
3. 扩展: 子类添加自身的方法来增加/扩展父类的功能
9、final
:类不可继承,方法不可重写
10、abstract
声明抽象类(与其他类对比可以有抽象方法);
11、interface
:声明接口;implements
:继承接口类;接口允许多继承