<?php
//echo __DIR__.'<br>';
//include __DIR__.'\Test1.php';
//include __DIR__.'\Test2.php';
//require __DIR__.'\Test3.php';
//php标准函数库中提供了一个自动加载文件的注册函数,可以实现这个功能
//这个函数,在当前脚本引用一个未加载的文件时,会自动调用它的回调方法来加载这个文件
//spl_autoload_register(function ($class){
// require __DIR__.'/'.$class.'.php';
//});
//$Test1=new Test1;
//$Test2=new Test2;
//$Test3=new Test3;
//echo $Test1->get().'<br>';
//echo $Test2->get().'<br>';
//echo $Test3->get().'<br>';
//抽象类
//class Person1{
// protected $name;
// //构造函数,初始化本类中的受保护的成员name
// public function __construct($name='peter zhu')
// {
// $this->name=$name;
// }
//// 外部接口,获取类中成员name
// public function getName(){
// return $this->name;
// }
// // 外部接口,设置类中成员name
// public function setName($value){
// $this->name=$value;
// }
//}
//$person=new Person1();
//echo '我的姓名是:'.$person->getName().'<br>';
//$person->setName('朱老师');
//echo '我的姓名是:'.$person->getName().'<br>';
//echo '<hr>';
abstract class Person2
{
protected $name;
protected function __construct($name='peter zhu')
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
//修改器方法.声明为抽象方法,不在本类中实现,而在子类中实现
//抽象类
abstract public function setName($value);
// {
// $this->name = $value;
// }
}
class Stu extends Person2{
public function __construct($name = 'peter zhu')
{
parent::__construct($name);
}
public function setName($value)
{
// TODO: Implement setName() method.
$this->name = $value;
}
}
//调用构造方法,来设置属性
$stu=new Stu('猪哥');
echo 'php中文网创始人:'.$stu->getName().'<br>';
//调用子类的重写的抽象方法setName(),来设置属性
$stu->setName('灭绝师太');
echo 'php中文网前端讲师:'.$stu->getName().'<br>';
//一.抽象类
//在实际开发中,通常不会直接使用一个父类/超类,而是在父类中定义一些方法声明
//并且确信这个方法肯定是会被子类重写的。父类中没必要实现,只要给一个方法编写规范即可
//这个规范包括方法的名称,参数列表等,具体实现就完全交给子类去实现了
//相当于公司的部门主管,接收到老板的任务,只把属于自己的做了,其他部分,设置一个标准交给下属去完成
//这个老板就是接口,我们一会会讲到,这个部门经理,我们用抽象类实现,而下属就是子类啦,最终干活的就是子类。
//类中只有一个成员设置为抽象类,该类就必须设置抽象类
//一个类一旦设置为抽象类,就具备了两个特点:
//1.不能实例化 2.类中抽象方法,在子类中必须实现
//注意
//1.属性设置为抽象无意义,抽象仅针对方法
//2.子类的成员可见性必须等于或高于所继承的抽象类成员可见性,例如抽象类是protected,子类可以是protected/public
//子类重写的抽象方法可见性,究竟用protected/public,要看这个子类是不是最终被客户端访问到,如果是就public,如果不是就protected
//* `abstract`: 定义抽象方法/抽象类
//* 类中只要有一个抽象方法, 该类就应该声明为抽象类
//* 抽象类只能被继承,不能实例化,并且抽象方法必须在子类实现
//* 实现抽象方法的子类方法可见性不能低于抽象方法原定义
//* 抽象方法是public, 子类方法只能是public
//* 抽象方法是protected, 子类方法只能是protected/public
//
//> 一个抽象类必须被扩展为一个特定的类,我们才能创建类实例,使用类中功能
//二.接口
//'interface':指定某个类必须实现的方法,但不要定义方法的具体实现过程
//接口中仅允许出现:方法与类常量
//接口中的方法可见性必须是:public
//接口的方法体必须是:public
//接口是类的代码模板,可以像雷一样有父子继承关系,例如父接口,子接口
//'implements':类实现接口的关键字
//如果仅是部分实现接口中的方法,请用一个抽象类来实现它
//接口--抽象类-->类--->对象
//总经理-->部门经理-->程序员-->代码