摘要:<?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
老师总结:类中不同的成员,有不同的访问方法, 为什么呢? 因为使用场景不同