摘要:<?php /** * 类的继承与代码复用 * 1,继承是为了代码复用 * 2,php只支持单继承 * 3,父类也叫超类、基类,子类也叫派生类 * 4,子类用extends声明继承于父类 * 5,子类构造方法,一定要先继承父类构造方法 parent::
<?php
/**
 * 类的继承与代码复用
 * 1,继承是为了代码复用
 * 2,php只支持单继承
 * 3,父类也叫超类、基类,子类也叫派生类
 * 4,子类用extends声明继承于父类
 * 5,子类构造方法,一定要先继承父类构造方法 parent::
 */
class ParentClass
{
    public $name;
    protected $course;
    private $pay;
    const WEBNAME = 'php中文网';
    //构造方法
    public function __construct($name,$course,$pay)
    {
        $this->name = $name;
        $this->course = $course;
        $this->pay = $pay;
    }
    //访问私有成员
//    public function getcourse()
//    {
//        return $this->course;
//    }
    //访问私有成员
    public function getpay()
    {
        return $this->pay;
    }
}
class ChildClass extends ParentClass
{
    public $grade;
    public function getcourse()
    {
        return $this->course;
    }
    //子类构造方法,一定要先继承父类构造方法
   public function __construct($name, $course, $pay,$grade)
   {
       parent::__construct($name, $course, $pay);
       $this->grade = $grade;
   }
}
//$parentclass = new ParentClass('RAMBO','php',4000);
//echo ParentClass::WEBNAME,'<br>';
//echo $parentclass->name,'<br>';
//echo $parentclass->getcourse(),'<br>';
//echo $parentclass->getpay(),'<hr>';
$childclass= new ChildClass('demo','JS','5000','60');
echo ChildClass::WEBNAME.'<br>';
echo $childclass->name,'<br>';
echo $childclass->getcourse(),'<br>';
echo $childclass->getpay(),'<br>';
echo $childclass->grade;
echo '<hr>';
/*
 * 范围解析符(::)的使用
 * 访问类静态成员与类常量
 * 类内访问使用关键字:self,parent,static
 * 类外使用:类名::类静态成员或类常量
 * 静态成员在方法中不能用$this,因为它是属于类的,不属于对象
 *
 */
class Book
{
    public $bookname = 'PHP从入门到放弃';
    protected static $author = 'null';
    const price = 99;
    //动态方法中既可以访问动态成员也可以访问静态成员,但是不建议访问静态成员
    public function getinfo1()
    {
//        return $this->bookname;
        return self::$author.self::price;
    }
    // 静态方法中只可以访问静态成员,因为静态方法只属于类
    public static function getinfo2()
    {
        return self::price;
    }
}
//声明一个子类
class Study extends Book
{
    public static function getinfo3()
    {
    return parent::price.parent::$author;
    }
}
$book = new Book();
//echo $book->getinfo1();
echo $book->getinfo2();
echo '<hr>';
$study = new Study();
echo $study->getinfo3().'<hr>';
/**
 * static 关键字 始终调用当前类
 * 1. 定义与访问类静态成员
 * 2. 访问类常量
 * 3. 后期静态绑定(延迟静态绑定)
 */
/**
 * 重载: 动态的创建类属性和方法
 *重载的实现手段:通过魔术方法
 */
/**
 * 一、属性重载
 * 1.__set($name,$value):当给不可访问属性赋值时自动调用
 * 2.__get($name):当访问不可访问属性的值时自动调用
 * 3.__isset($name):当对不可访问属性调用isset()或empty()时自动调用
 * 4.__unset($name):当对不可访问属性调用unset()时自动调用
 */
/**
 * 二、方法重载
 * 1.__call($method,array $args):访问对象中不可访问的方法时,自动调用
 * 2.__callStatic($method,array $args):在静态上下文中调用一个不可访问方法时调用
 * method: 方法名, $args: 枚举数组,里面存放着传递给方法的参数
 */
include 'public/Site.php';
class Web
{
 public function __call($name, $arguments)
 {
     return call_user_func_array([(new Site),'show'],$arguments);
 }
 public static function __callStatic($name, $arguments)
 {
     return call_user_func_array([(new Site),'add'],$arguments);
 }
}
$web = new Web();
//echo Web::show();
echo $web->show('php中文网','海量资源,免费公益'), '<hr>';
echo Web::add(40,30);
						批改老师:天蓬老师批改时间:2018-12-30 17:49:45		
						
老师总结:类中不同的成员,有不同的访问方法, 为什么呢? 因为使用场景不同					
 
                 
 
 
  
            