有条件地在php中定义常量

时间:2018-06-27 21:08:51

标签: php codeigniter codeigniter-3

在CodeIgniter中,是否可以通过会话检查全局定义常量,如下面的示例所示

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或任何地方声明这些常量。我需要在整个项目中访问那些不在函数或控制器中的对象

2 个答案:

答案 0 :(得分:2)

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

config.php

$config['enable_hooks'] = TRUE;

文件 application / config / hooks.php

$hook['post_controller_constructor'][] = array(
  'class' => '',
  'function' => 'set_tab_constants',
  'filename' => 'post_controller_hook.php',
  'filepath' => 'hooks'
);

在文件 application / hooks / post_controller_hook.php

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中,常量的范围是全局的。您可以在脚本中的任何位置访问常量,而无需考虑范围。

答案 1 :(得分:0)

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

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

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


此外,如果这些镜像表表示相同的记录,则请务必谨慎,例如,如果accounts表中的记录与back_accounts中的记录的种类/类型相同,我知道它们应该都是同一张桌子。 :-)我想您不能更改此必要条件:-)