什么是构造方法(函数)?
构造(函数)方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct()。
在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。该方法无返回值。
<?php
/**
* Created by PhpStorm.
* User: liudandan
* Date: 2018/5/13
* Time: 11:50
*/
class BaseClass {
function __construct()
{
print "我是构造函数\n";
}
}
class SubClass extends BaseClass {
function __construct()
{
parent::__construct();
print "我是 SubClass 下的构造函数\n";
}
}
class OtherSubClass extends BaseClass {
}
$obj = new BaseClass();
$obj = new SubClass();
$obj = new OtherSubClass();
?>
之前的项目中需要给app提供接口,由于TP是在5.1.6+才正式引入中间件的支持(使用的版本5.0),所以不能在中间件中验证用户身份,解决方案如下
新建Base.php
<?php
namespace app\api\controller;
use think\Controller;
use think\Request;
class Base extends Controller
{
public function __construct(Request $request = null)
{
parent::__construct($request);
// 检测私钥和token
$private_key = input('post.private_key', '', 'trim');
$token = input('post.token', '', 'trim');
//获取控制器及方法名
$controller_name = $request->controller();
$action_name = $request->action();
$route = $controller_name.'/'.$action_name;
//定义未登录状态允许访问的控制器/方法
/**
* 未登录状态允许访问的控制器/方法
* 方法名取小写
*/
$allow_route = [
'Goods/goodslist',
'Article/articleindex',
'Article/articledetail'
];
if (!in_array($route,$allow_route))
{
//验证用户身份
$data = $this->tokenProving($private_key, $token);
if($data['code'] == 500)
{
echo json_encode($data);die;
}
else
{
//获取用户身份
//$this->user_id =
}
}
else
{
//获取用户身份
//$this->user_id =
}
}
// 检测私钥和token
private function tokenProving($private_key, $token)
{
if(empty($private_key) || empty($token))
{
$data['code'] = 500;
$data['msg'] = '重要参数丢失';
$data['data'] = (object)array();
return $data;
}
//一系列的验证
}
}
?>
控制器继承Base.php
<?php
namespace app\api\controller;
use think\Db;
use app\api\model;
class User extends Base
{
public function index()
{
//获取user_id
$user_id = $this->user_id;
}
}
?>
这样就可以在构造函数中验证用户身份了