<?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));
}
// 静态方法拦截器
// php5.3以后增加了__callStatic方法
// 当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法
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;
});