1. 类的继承扩展
//类的继承/扩展
class Demo1
{
private int $age = 10;
//protected 受保护的,用在当前类或者他的子类中 外部不可见
protected string $name;
//魔术方法
public function __construct($name)
{
$this->name = $name;
}
public function getUser(): string
{
return $this->name;
}
}
//extends继承 将Demo1中的代码复制到Demo2中
class Demo2 extends Demo1
{
//扩展父类中的属性
public string $guoji;
//扩展父类中的方法
public function __construct($age,$name,$guoji)
{
//parent引用父类的方法
parent::__construct($name);
$this->age = $age;
$this->guoji = $guoji;
}
//扩展父类的方法
public function getUser():string
{
return '我是'. parent::getUser() . ',年龄是'.$this->age . ',国家是'.$this->guoji;
}
}
$demo = new Demo2(20,'张三','中国');
echo $demo->getUser();
2. 抽象类
抽象类声明关键字abstract 如果一个类中有抽象方法 那么这个类必须要被声明为抽象类
//抽象类
//抽象类声明关键字abstract
//如果一个类中有抽象方法 那么这个类必须要被声明为抽象类
abstract class Demo3
{
public static $name='admin';
//将一个没有实现的方法声明为抽象方法
abstract public function f($name);
}
//必须在子类中将抽象方法实现
class Demo4 extends Demo3
{
public function f($name)
{
return '我是'.$name;
}
}
$demo4 = new Demo4();
echo $demo4->f('李四');
3.全局成员
- 常量/类/接口/函数 全局成员
- 全局成员不能重复声明全局有效
- 用命名空间在一个文件内重复声明
// 2.全局成员有哪些
/**
* 函数/常量/类/接口
* 全局成员不允许重复声明全局有效
* 可以使用命名空间在一个文件内重复声明
*/
namespace Demo1;
const USER = '第一个';
class User
{
}
echo USER;
echo '<hr>';
namespace Demo2;
const USER = '第二个';
class User
{
}
echo USER;
4.命名空间
//命名空间解决了全局成员的命名冲突
//当存在命名空间时访问全局成员应该要用完整名称
//可以通过\命名空间\的方式来访问其他空间的成员
// namespace Demo;
// echo \Demo2\User::$name;
// 命名空间声明方式:
// 1. 当前路径: 非限定名称, Index
// 2. 相对路径: 限定名称, two\Index
// 3. 绝对路径: 完全限定名称, \one\two\Index
//如果命名空间太长比如是多级可以用关键字use进行修饰
// use 默认使用完全限定名称的类名/绝对路径
namespace Demo\Index;
class User
{
public static $name = User::class.'\张三<hr>';
}
use \Demo\Index\User as UserIndex;
echo UserIndex::$name;
namespace Demo\Index1;
use \Demo\Index1\User as UserIndex1;
class User
{
public static $name = User::class.'\李四<hr>';
}
echo UserIndex1::$name;