描述类成员的重载、全局成员以及命名空间
程序员文章站
2022-01-15 11:02:01
...
一.类成员的重载:
属性重载: __get(),__set()
方法重载: __call(),__callStatic
函数__get()样式代码:
class Col
{
protected $data = [
'username' => 'HSFFLT',
];
// 属性重载: 拦截器
public function __get($name)
{
// 通常会创建一个获取器,动态的生成一个方法名称
$method = 'get' . ucfirst($name);
if (method_exists($this, $method)) {
return $this->$method($name);
}
}
// 获取器
public function getUsername($name)
{
if (!isset($this->data[$name])) {
$this->data[$name] = 0;
} else {
return $this->data[$name];
}
}
}
// 实例化
$obj = new Col;
// 访问一个属性
echo $obj->username;
效果预览:
函数__set()样式代码:
class Col
{
protected $data = [];
// 属性重载: 拦截器
public function __get($array)
{
// 通常会创建一个获取器,动态的生成一个方法名称
$method = 'get' . ucfirst($array);
return $this->$method($array);
}
public function getEmail($array)
{
if (!isset($this->data[$array])) {
$this->data[$array] = 0;
} else {
return $this->data[$array];
}
}
// __set:当访问不存在可无权限设置的属性时自动调用
public function __set($array, $value)
{
$method = 'set' . ucfirst($array);
return $this->$method($array, $value);
// echo $method;
}
// 设置器
public function setEmail($array, $value)
{
$this->data[$array] = $value;
}
}
// 实例化
$obj = new Col;
// 访问一个属性
$obj->email = '123456';
echo $obj->email;
效果预览:
函数call()和callStatic样式代码:
class Demo
{
// 方法也可以重载
public function __call($name, $arguments)
{
// 这里只做一件事,请求转发
return $name. '['.implode(',',$arguments).']';
}
// 当访问一个不存在的静态方法时,会定位到下面这个魔术方法中
public static function __callStatic($name, $arguments)
{
return $name. '['.implode(', ',$arguments).']';
}
}
// 实例化
$obj = new Demo;
echo '__call: '. $obj->hello(1,2,3),'<hr>';
echo'__callStatic: '. Demo::test('H','E','L','O','O');
效果预览:
二.全局成员:类, 常量, 函数:
样式代码:
<?php
// 类
class Kind
{
public $kind = __CLASS__;
}
echo (new Kind) ->kind .' 类','<br>';
// 常量
const PATH = 'Kindatas'.' 常量';
echo PATH,'<br>';
// 函数
function set()
{
return __FUNCTION__;
}
echo set().' 函数','<hr>';
效果预览:
三.空间的声明与空间成员的访问:
样式代码:
<?php
// 命名空间: 解决全局成员的命名冲突
namespace So {
// 类
class Mno
{
//...
}
// 常量
const PATH = 'MnonM';
// 函数
function MnO()
{
// ...
}
echo Mno::class . ' 类', '<br>';
echo PATH::class . ' 常量', '<br>';
echo MnO::class . ' 函数', '<hr>';
}
// 全局空间
namespace {
// 类
class Kind
{
//...
}
// 常量
const PATH = 'Kintaba';
// 函数
function set()
{
// ...
}
echo Kind::class . ' 类', '<br>';
echo PATH::class . ' 常量', '<br>';
echo set::class . ' 函数', '<hr>';
}
效果预览:
四.空间成员的分解与合并
为了防止一个空间中的代码过大,可以考虑将同一个空间的代码写到多个脚本中
将文件demo6.php分解到demo6-1.php,demo6-2.php,demo6-3.php这三个文件,再由这三个文件合并成一个
demo6.php样式代码:
<?php
// 同名空间成员的组织方式
namespace NO;
require 'demo6-1.php';
require 'demo6-2.php';
require 'demo6-3.php';
// 类
echo Demo1::class, '<br>';
// 常量
echo Demo2::class, '<br>';
// 函数
echo Demo3::class, '<hr>';
demo6-1.php样式代码:
<?php
namespace NO;
// 类
class Demo1
{
// 我有500行代码
}
demo6-2.php样式代码:
<?php
namespace NO{
// 常量
//此处有800行代码
}
demo6-3.php样式代码:
<?php
namespace NO{
// 函数
// 此处1200行代码
}
合并效果预览:
五.子空间访问任何空间的成员方法:
样式代码:
<?php
// 父空间
// namespace: 用在空间中,表示当前空间的引用,类似于$this或self
namespace nos1 {
class Name
{
// ...
}
echo Name::class, '<br>';
// 访问它的子空间成员
echo nos2\Name::class, '<br>';
echo nos2\nos3\Name::class, '<hr>';
}
// nos1的子空间
namespace nos1\nos2 {
class Name
{
// ...
}
echo Name::class, '<br>';
echo nos3\Name::class, '<hr>';
}
// nos2的子空间
namespace nos1\nos2\nos3 {
class Name
{
// ...
}
echo Name::class, '<br>';
// 在nos3中,访问上级空间怎么办?
echo \nos1\nos2\Name::class, '<br>';
echo \nos1\Name::class, '<br>';
// 全局成员:前面加上全局空间的标识符: \
echo \Name::class,'<hr>';
}