1. 描述类成员重载的原理与实现
访问类中的属性或者方法,如果不存在或者受保护,会自动执行一个魔术方法。进而在魔术方法里对该访问请求进行过滤或者动态创建类属性和方法。
<?php
//重载的魔术方法-属性重载 __get() __set() __isset() __unset()
//重载的魔术方法-方法重载 普通方法__call() 静态方法__callStatic()
class quanxian
{
private $manger = 'guanliyuan';
public function __get($name){
if ($name === $this->manger):
return '可以继续浏览';
else:
//动态生成方法名字
$method = 'get'.ucfirst($name);
return $this -> $method();
endif;
}
public function getUser(){
return'无权访问';
}
}
$user = new quanxian();
echo $user->guanliyuan;
echo $user->user;
2. 全局成员有哪几种,有什么特点
全局成员有三种:类、函数、常量,特点是不能重复声明。
<?php
//类
class Demo{
}
//常量
const APPNAME = '微信';
//函数
function addName(){
return '名字';
}
3. 空间的声明(关键字namespace)与空间成员的访问
<?php
namespace C {
class Banji
{
//...
}
//echo 'C\Banji'
echo Banji::class;
//访问全局空间成员前面要加\
echo \Quanju::class;
}
namespace D {
class Banji
{
//...
}
//echo 'D\Banji'
echo Banji::class;
}
//全局空间
namespace{
class Quanju{
static $name = '全局';
}
//echo 'Quanju'
echo Quanju::class;
}
4. 空间成员的分解与合并操作
//第一个文件,引用home1.php和home2.php
namespace home;
require 'home1.php';
require 'home2.php';
//第二个文件,home1.php
namespace home;
class Home1{
//...
}
//第三个文件,home2.php
namespace home;
class Home2{
//...
}
5. 在子空间中访问任何空间中的成员的方式
<?php
namespace C {
class Banji
{
//...
}
//访问子类成员及子子类
echo C1\Banji::class,'<br>';
echo C1\C2\Banji::class,'<br>';
}
namespace C\C1 {
class Banji
{
//...
}
//访问子类成员
echo C2\Banji::class,'<br>';
//访问父类成员
echo \C\Banji::class,'<br>';
}
namespace C\C1\C2 {
class Banji
{
//...
}
//访问父类成员及父父类
echo \C\Banji::class,'<br>';
echo \C\C1\Banji::class,'<br>';
}