类与对象
- 封装
1.1 private :私有,封装
1.2 变量一般放到数组里面
1.3 类中数组的数据访问,访问数组,直接__get()传参即可,访问数组内部,需要用到array_key_exists()判断键位是否在数组内,从而返回数组的值 - 属性重载:get(属性),set(属性,值)
- 方法重载:call(方法名,参数)-动态,callStatic(方法名,参数)-静态
类的扩展/抽象/最终
- 扩展:extends,可继承成员:属性:protected,public,方法,构造方法,需要constract引入父类重新占位,为了传参,例:parent::constract;
- 抽象类:abstract,父类为抽象类之后,无法实例化使用,必须通过子类实现父类的方法,父类方法存在抽象方法时,父类必须定义为抽象类,
- 最终类:final:最终类声明关键字,必须将方法实现,无法再继续扩展
- 优先级:pulic(类中,类外,子类) > protected(类中,子类) > private(类中)
接口
- 升级版的抽象类
- 声明方法:interface ixxx,类名首字母带一个’i’;
- 方法:必须是public
- 工作类(接口的子类):实现了接口的类,声明格式:class xxx implements ixxx
- 子类:abstract声明后,可以只实现接口的一部分抽象方法,否则会报错
- 工作类继承自抽象类,抽象类继承自接口,其中抽象类可实现部分功能,但是在工作类中必须实现全部的抽象类中未实现的方法
- 继承接口方法:implements,
命名空间
- 全局成员:函数,常量,类/接口,全局有效,禁止重复声明
- ::class :获取类的完整名称
- 跨空间访问必须从根空间/全局空间开始查询: ‘\’;
- 命名空间理解就是在当前目录下,创建了虚拟路径(或者虚拟文件夹),此时文件名必须加上命名空间名,目的为了解决全局成员之间的命名冲突的问题,方便管理
- 跨空间调用,类和函数以及接口可以不按照顺序使用,但是常量必须声明在前,如一个文件中两个命名空间,第二个命名空间可以访问第一个空间内的常量,反之则无法访问;
命名空间的类型(namespace)
- 当前路径:非限定名称,直接当前目录查找
- 相对路径:限定名称,在当前目录的子目录中查找
- 绝对路径:完全限定名称,在根空间进行查找
- 空间可分层管理 namespace xx\xx,’\’分层
命名冲突的
- 访问方式: 路径::$变量名;
- 路劲过长起别名:use 绝对路径 as 别名
其他
- METHOD:返回当前方法名称
案例源码
<?php
use _0815\D;
use _0815\Demo2 as _0815Demo2;
use _0815\Demo3;
use Demo2 as GlobalDemo2;
namespace six;
class Demo {
private $data = ['a'=>'结果1','b'=>'结果2','c'=>'结果3'];
private $data2 = '这仅仅是个测试';
public $text = '10';
public $text2 = '20';
protected $text3 = '30';
// 访问数组中的单值
public function __get($name)
{
if(array_key_exists($name,$this->data)){
return $this->data[$name]; // 访问数组的元素,数组名不需要加'$';
}else{
// 访问数组,或者访问单值
return $this->data2;
}
// return array_key_exists($name,$this->data)? $this->data[$name] : return $this->data2;
}
}
$getData = new Demo;
// echo $getData->b;
echo $getData->a.'<hr>';
echo $getData->data4.'<hr>';
// 统一个类中无法反复声明__get()函数,引用不同的数据类型可以使用新增类,或者定义一个子类,
// 通过继承父类的protected,public,方法,构造方法(需要引入父类进行占位,为了传参);
class Demo2 extends Demo{
public function __get($name)
{
return $this -> $name;
}
}
$getData2 = new Demo2;
echo $getData2->text.'<hr>';
class Test
{
protected string $txt;
// public string $txt2;
private $txt3 = '我是父类的私有变量';
public function __construct($txt,$txt2)
{
$this->txt = $txt;
$this->txt2 = $txt2;
}
protected function getInfo():string
{
return $this->txt.' '.$this->txt2;
// return ;
}
}
// 扩展子类
class Test1 extends Test
{
private string $txt4;
public function __construct($txt,$txt2,$txt4)
{
// 引用父类得构造器占位,一个就够了,不需要两个construct
parent::__construct($txt,$txt2);
// parent::__construct($txt2);
$this -> txt4 = $txt4;
}
public function getInfo(): string
{
return parent::getInfo() . '....' .$this->txt4;
}
}
$Demo6 = new Test1('hello','world','我在子类里面');
echo $Demo6->getInfo().'<hr>';
// 类中存在抽象方法,类必须为抽象类
abstract class GetData
{
protected string $id = '0';
protected string $frcn = '38950';
protected string $imsi = '460001234512345';
// 抽象类中,方法无法完成,但必须在子类中完成
abstract public function getInfo();
}
// 抽象类扩展,方法可完成
class GetDataSon extends GetData
{
public function getInfo()
{
return $this->id;
}
}
$GET = new GetDataSon;
echo $GET->getInfo().'<hr>';
// 最终类,方法必须完成,否则会报错,无法再继续扩展子类了,
final class Demo10 {
public function getInfo(){
}
}
// 接口类中两类成员:常量,方法(两者必须都是public)
interface iName {
public const NATION = 1;
public const NAME2 = 2;
public function A();
public function B();
public function C();
}
echo iName::NATION.'<hr>';
// 抽象类继承接口的方法,可实现部分功能
abstract class name implements iName{
public function A(){
return iName::NATION;
}
}
// 工作类,继承抽象类
class name2 extends name {
public function B(){
}
public function C(){
}
}
namespace four;
const OP = 'WOCAO';
echo \AAA\show2().'<hr>';
echo \AAA\Index::class.'<hr>';
echo \AAA\Index::show().'<hr>';
namespace AAA;
const KKK = '又是一个测试';
function show2(){
return __METHOD__;
};
class Index {
public static function show(){
return __METHOD__;
}
}
案例结果