如电商中的下单业务,各种打折促销活动,我想使用到比如 策略模式等,要封装成多个类(父类,子类,抽象类)等。这些类该放在什么地方呢?
可使用命名空间,自动加载类函数,在controller下创建一个service目录。自己封装的类可以放在这个目录下:
目录结构如下:
可以在index.php文件中进行自动加载类函数的注册。代码如下:
spl_autoload_register(function($className){
if(0 === strpos($className, 'service')) {
$parts = explode('\\', substr($className, strlen('service'.'\\')));
$filepath = __DIR__ . DIRECTORY_SEPARATOR .'application'.DIRECTORY_SEPARATOR.'controllers'.DIRECTORY_SEPARATOR.'service'.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $parts).'.php';
if (is_file($filepath)) {
require $filepath;
}
}
},true,false);
自定义类OrderStatus的代码如下:
注意的是 如果要继承CI_Controller 前面要加\ 因为CI_controller类定义在全局命名空间下
继承CI_controller 有利有弊,好处时可以像普通控制器文件那样方便使用$this的各种功能如:$this->load; 等;不好的是:
这样浪费内存因为CI_controller被实例化了多次。
也可以不要继承CI_Controller ; 想用$this->load->mode 这样的,可以使用&get_instance()来获取超全局对象。推荐这样的方式!
<?php
/**
* Created by PhpStorm.
* User: liang
* Date: 2018/01/12
* Time: 下午3:18
*/
namespace service\order;
//class OrderStatus extends \CI_Controller
class OrderStatus
{
//private $CI = null;
public function __construct()
{
//parent::__construct();
$this->CI = &get_instance();
}
/**
* 获取订单状态
*/
public function getOrderStatus(){
echo 'in service method getOrderStatus', '<br/>';
// $this->load->model('order_model');
//
// $this->order_model->getList();
$this->CI->load->model('order_model');
$this->CI->order_model->getList();
}
}
在普通的控制器中如何调用自己在service中定义的类呢?
首先在文件头中要 use 用到的命名空间
use service\order as orderSP;
use service\goods as goodsSP;
.................
public function test_service(){
$statusObj = new orderSP\orderStatus();
$statusObj->getOrderStatus();
$goodsObj = new goodsSP\GoodsInfo();
$goodsObj->getGoodsInfo();
}
---------------------
作者:学海无涯书山有路
来源:CSDN
原文:https://blog.csdn.net/u013862108/article/details/83994427
版权声明:本文为博主原创文章,转载请附上博文链接!