属性重载
<?php
/**
* 1.属性重载:属性的访问拦截 __get(),__set()
*/
class User
{
// 属性
private $data = [
'age'=>20
];
//访问拦截器
public function __get($name)
{
//$name:属性名
// array_key_exists():查询数组中是否存在某一个键
if(array_key_exists($name,$this->data)){
return $this->data[$name];
}
return "属性 {$name} 不存在";
}
// 更新拦截器
public function __set($name, $value)
{
// 1.有没有这个属性
if(array_key_exists($name,$this->data)){
// 2.属性是否合法
if($name === 'age') {
if($value > 18 && $value < 59){
$this->data[$name] = $value;
}else{
echo '年龄必须在18~59之间';
}
}else {
// 以上操作只对age有效,其他属性直接赋值
$this->data[$name] = $value;
}
}else {
echo '禁止动态创建属性';
}
}
// 方法拦截器
public function __call($name, $args)
{
//$name:方法名 $args:传给方法的参数
printf('方法:%s<br>参数:<pre>%s</pre>',$name,print_r($args,true));
}
// 静态方法拦截器
public static function __callstatic($name, $args)
{
//$name:方法名 $args:传给方法的参数
printf('方法:%s<br>参数:<pre>%s</pre>',$name,print_r($args,true));
}
}
$user = new User;
echo $user->name . '<hr>';
/**
* 为一个属性赋值的时候,必须要搞清楚两件事
* 1.有没有这个属性
* 2.属性是否合法
*/
$user->age = 25;
echo $user->age . '<hr>';
// 常规方法/非静态方法/用实例调用
$user->hello('猪老师','PHPCN');
// 静态方法
$user::world(100,200);
效果:
命名空间
<?php
/**
* 命名空间:解决全局成员的命名冲突
*/
//一个脚本中,可以创建多个空间
namespace ns1{
//空间成员
//常量
const APP = '商场';
}
// 空间分级管理:子空间
namespace ns2\ns3{
const APP = '问答';
echo APP . '<br>';
}
namespace ns2{
//空间成员
//常量
const APP = '社区';
//2.非限定名称:总是从当前空间开始查询
echo APP . '<br>';
// 查询当前命名空间函数__NAMESPACE__
echo __NAMESPACE__ . '<br>';
// 想在ns2中,访问ns1的APP
// 一定要通过全局空间/根空间来进行访问
// 根空间:\
//1. 完全限定名称:从根空间开始查询
echo \ns1\APP . '<br>';
// 在ns2空间,访问子空间,ns2\ns3中的成员
// 3.限定名称:ns3\APP
echo '<span style="color:red">'.ns3\APP.'</span><br>';
}
/**
* 命名空间类型
* 1.完全限定名称:根空间开始,a\b\APP
* 2.非限定名称:从当前空间开始,'APP'
* 3.限定名称:子空间,ns\APP
*/
//全局空间:匿名的,不要写空间名,用“\”来引用
namespace{
function hello(){
echo 'hello';
}
echo '<span style="color:blue">'.ns1\APP.'</span><br>';
echo '<span style="color:yellow">'.\ns2\ns3\APP.'</span><br>';
}
效果:
类自动加载器
<?php
/**
* 命名空间
* 1.一个文件中,只允许声明一个命名空间并只写一个类
* 2.命名空间的命名,应该和成员的路径一致
* 3.类名必须和类文件对应
*/
//类文件自动加载器
// 注册一个类的自动加载器
spl_autoload_register(function($class){
//1.将命名空间=>映射到一个类文件的绝对路径
$path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
//2.生成类文件路径
$file = __DIR__ . DIRECTORY_SEPARATOR . $path .'.php';
// 3.加载这个类文件
require $file;
});