一、属性与方法重载
重载:就是重定向
1.属性重载:get 查询拦截器,set 更新拦截器
2.方法重载:call 方法拦截器,callStatic 静态方法拦截器
<?php
/**
* 重载:就是重定向
* 1.属性重载:__get(),__set()
* 2.方法重载:__call(),__callStatic()
*/
echo '一、属性重载'. '<br>';
class User
{
//创建属性
// private $name = '李老师';
//一般是数组
private $data = [
'name' =>'李老师',
'age' => 20
];
//!__get 查询拦截器
public function __get($name)
{
//$name:属性名
// return $this->name;
// return $this->data[$name];
//查询是否有这个属性名:array_key_exists()
if(array_key_exists($name,$this->data)){
return $this->data[$name];
}
return "属性{$name}不存在";
}
//! __set 更新拦截器
public function __set($name,$value)
{
// 1.有没有这个属性?
if(array_key_exists($name,$this->data)){
// 2.这个值是否合法?
if($name === 'age'){
if($value >= 18 && $value <= 60){
$this->data[$name] = $value;
}else{
echo '您的年龄不在18到60之间';
}
}else{
//以上仅对age有效,其他属性直接赋值
$this->data[$name] = $value;
}
}else{
echo '禁止动态创建属性';
}
}
//! __call 方法拦截器
public function __call($name,$args)
{
//$name:方法名,$args:参数
printf('方法:%s<br>参数:<pre>%s</pre>',$name,print_r($args,true));
}
//! __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 .'<br>';
/**
* 赋值考虑两件事
* 1.有没有这个属性?
* 2.这个值是否合法?
*/
// 动态创建
$user->age = 30;
// 查看输出
echo $user->age.'<br>';
//禁止动态创建
echo '<hr>';
echo '二、方法重载' . '<br>';
//常规方法/非静态方法:用实例调用
$user->hello('李老师','zaikun.cn');
//静态方法
User::world(100,200);
二、属性与方法重载实现数据查询
<?php
//方法重载小案例
// Db::table('think_user')->where('id', 1)->find();
//1.查询类
class Query
{
//第一个table方法
public function table($table)
{
//返回当前类实例,方便调用
return $this;
}
//第二个where方法
public function where($where){
//返回当前类实例,方便调用
return $this;
}
//第二个find方法,无参数
public function find(){
//不需要返回当前类实例,直接输出最终结果
return ['id'=>1,'name'=>'李老师','qq'=>'15030552'];
}
}
//调用
$query = new Query;
// $query->table('think_user');
// $query->where('id', 1);
// $query->find();
// 简化
$query->table('think_user')->where('id', 1)->find();
//2.入口类:实现请求转发
class Db{
//静态方法重定向
public static function __callStatic($name,$args)
{
// //$name:方法名,$args:参数
// $query = new Query;
// // $query->table('think_user');
// //table 就是传入的方法名$name,think_user就是传入的参数$args
// return $query->$name($args);
//回调的方式来执行对象方法,简化以上代码
return call_user_func_array([new Query,$name],$args);
}
}
//静态方法
$res = Db::table('think_user')->where('id', 1)->find();
printf('<pre>%s</pre>',print_r($res,true));
三、命名空间与类自动加载器
类文件自动加载器autoloader.php
<?php
// 类文件自动加载器
//注册一个类的自动加载器
spl_autoload_register(function($class){
// echo $class;
//1.将命名空间 =》 映射到一个类文件的绝对路径
$path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
//2.生成文件路径
$file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
//3.加载类文件
require $file;
});
命名空间
1.一个文件只允许声明一个命名空间并只写一个类
2.命名空间的名称,应该与成员的路径一致
3.类名,必须与类文件名对应
<?php
//命名空间
//1.一个文件只允许声明一个命名空间并只写一个类
//2.命名空间的名称,应该与成员的路径一致
//3.类名,必须与类文件名对应
namespace ns1;
// require __DIR__ . '/admin/index/demo1.php';
// echo '<br>';
// require __DIR__ . '/admin/index/demo2.php';
// echo '<br>';
// require __DIR__ . '/admin/index/demo3.php';
// echo '<br>';
// require __DIR__ . '/admin/index/demo4.php';
// echo '<br>';
// 自动加载
//注册一个类的自动加载器
// spl_autoload_register(function($class){
// // echo $class;
// //1.将命名空间 =》 映射到一个类文件的绝对路径
// $path = str_replace('\\',DIRECTORY_SEPARATOR,$class);
// //2.生成文件路径
// $file = __DIR__ . DIRECTORY_SEPARATOR . $path . '.php';
// //3.加载类文件
// require $file;
// });
require __DIR__ . '/autoloader.php';
// new \admin\index\Demo2;
// 命名冲突
class demo2
{
}
echo Demo2::class . '<br>';
echo \admin\index\Demo2::class . '<br>';