首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在php中有条件地定义常量

在php中有条件地定义常量
EN

Stack Overflow用户
提问于 2018-06-28 05:08:51
回答 2查看 677关注 0票数 0

在CodeIgniter中,是否可以使用以下示例中的会话检查全局定义常量

代码语言:javascript
复制
if($this->session->userdata("private")){
    define("TAB_ACCOUNTS","accounts");
    define("TAB_INVENTORY","inventory");
    define("TAB_INVENTORY_PRODUCTS","inventory_products");
    define("TAB_INVENTORY_VIEW","inventory_view");
    define("TAB_ORDER_PRODUCTS","order_products");
    define("TAB_ORDERS","orders");
    define("TAB_ORDERS_VIEW","orders_view");
    define("TAB_VENDORACCOUNTS","vendoraccounts");
}else{
    define("TAB_ACCOUNTS","back_accounts");
    define("TAB_INVENTORY","back_inventory");
    define("TAB_INVENTORY_PRODUCTS","back_inventory_products");
    define("TAB_INVENTORY_VIEW","back_inventory_view");
    define("TAB_ORDER_PRODUCTS","back_order_products");
    define("TAB_ORDERS","back_orders");
    define("TAB_ORDERS_VIEW","back_orders_view");
    define("TAB_VENDORACCOUNTS","back_vendoraccounts");
}

我的要求是基于会话使用表名MySQL查询...

更新:我需要在config.php或任何地方声明这些常量。我需要在整个项目中访问它们,而不是在函数或控制器中

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-28 07:45:51

因为您需要启动并运行session,所以最简单的解决方案是利用“post_controller_constructor”钩子。

在config.php中

代码语言:javascript
复制
$config['enable_hooks'] = TRUE;

文件application/config/hooks.php

代码语言:javascript
复制
$hook['post_controller_constructor'][] = array(
  'class' => '',
  'function' => 'set_tab_constants',
  'filename' => 'post_controller_hook.php',
  'filepath' => 'hooks'
);

在文件application/hooks/post_controller_hook.php中

代码语言:javascript
复制
function set_tab_constants()
{
    if(isset($_SESSION['private']))
    {
        define("TAB_ACCOUNTS", "accounts");
        define("TAB_INVENTORY", "inventory");
        define("TAB_INVENTORY_PRODUCTS", "inventory_products");
        define("TAB_INVENTORY_VIEW", "inventory_view");
        define("TAB_ORDER_PRODUCTS", "order_products");
        define("TAB_ORDERS", "orders");
        define("TAB_ORDERS_VIEW", "orders_view");
        define("TAB_VENDORACCOUNTS", "vendoraccounts");
    }
    else
    {
        define("TAB_ACCOUNTS", "back_accounts");
        define("TAB_INVENTORY", "back_inventory");
        define("TAB_INVENTORY_PRODUCTS", "back_inventory_products");
        define("TAB_INVENTORY_VIEW", "back_inventory_view");
        define("TAB_ORDER_PRODUCTS", "back_order_products");
        define("TAB_ORDERS", "back_orders");
        define("TAB_ORDERS_VIEW", "back_orders_view");
        define("TAB_VENDORACCOUNTS", "back_vendoraccounts");
    }
}

直接访问超全局$_SESSION可避免获取CI实例的开销,以便session类可用于读取userdata。无论如何,该方法直接读取$_SESSION变量。避开中间商,直接购买!

在PHP中,常量的作用域是全局的。您可以在脚本中的任何位置访问常量,而无需考虑作用域。

票数 2
EN

Stack Overflow用户

发布于 2018-06-28 06:35:07

据我所知,您的公共/后端表( else块)总是以back_为前缀,因此我建议不要使用这些常量。

相反,在您的模型中使用普通表名,并创建一个方法来验证会话并返回一个空字符串或"back_“字符串,然后在"from”子句中使用此方法。

换句话说:“当唯一的区别是字符串前缀时,为什么要有这么多常量?”

此外,如果这些镜像表代表相同的记录,请注意您的必需品,例如,如果accounts表中的记录与back_accounts中的记录种类/类型相同,我认为它们应该都是同一个表。:-)我假设你不能改变这个必备条件:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51071438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档