我想要一个可以通过控制器函数访问的全局数组,它们可以添加或删除任何具有特定键的项目。我该怎么做?我已经制作了我的自定义控制器" globals.php
"并将其添加到自动加载库中。
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
$notification_array = array();
$config['notification'] = $notification_array;
?>
控制器上的以下函数应将新项目添加到我的数组中
function add_data(){
array_unshift($this->config->item('notification'), "sample-data");
}
add_data添加到全局数组后,每当从客户端调用以下函数时,它都应该将更新的数组提供给客户端。
function send_json()
{
header('content-type: application/json');
$target = $this->config->item('notification');
echo json_encode($target);
}
但是我的客户端总是得到空数组。我怎样才能做到这一点?请帮忙。
利用 OOP,像这样
MY_Controller.php放在核心目录下
class MY_Controller extends CI_Controller{
public $global_array = array('key1'=>'Value one','key2'=>'Value2'):
public function __construct() {
parent::__construct();
}
}
页面控制器
class Page extends MY_Controller{
public function __construct() {
parent::__construct();
}
function send_json()
{
header('content-type: application/json');
$target = $this->global_array['key1'];
echo json_encode($target);
}
}
出的一个解决方案是使用session,它易于使用且"快速",您需要进行一些基准测试。
正如我对上面/下面的两个答案的评论一样,您不可能在不同的控制器中获得相同的数据,因为每个请求的所有内容都被"重置",并且要访问不同的控制器,您至少需要重新加载页面。(注意,即使是 AJAX 调用也会发出新请求)
请注意,会话受大小限制,您的限制为 4kb(CodeIgniter 将会话存储为 Cookie),但等等,有办法将它们存储在数据库中(要允许它转到配置文件并将其打开 $config['sess_use_database'] = TRUE;
+ 创建表,您将在此处找到更多信息)
好吧,让我们得到答案本身,因为我知道您尝试扩展所有控制器,如果没有这样做,并将一些代码放在该核心/MY_Controller.php文件中如下:
private function _initJSONSession() { //this function should be run in MY_Controller construct() after succesful login, $this->_initJSONSession(); //ignore return values
$json_session_data = $this->session->userdata('json');
if (empty($json_session_data )) {
$json_session_data['json'] = array(); //your default array if no session json exists,
//you can also have an array inside if you like
$this->session->set_userdata($ses_data);
return TRUE; //returns TRUE so you know session is created
}
return FALSE; //returns FALSE so you know session is already created
}
您还需要这几个功能,它们是不言自明的,它们都是公共的,因此您可以在MY_Controller.php扩展的任何控制器中自由使用它们,如下所示
$this->_existsSession('json');
public function _existsSession( $session_name ) {
$ses_data = $this->session->userdata( $session_name );
if (empty( $ses_data )) return FALSE;
return TRUE;
}
public function _clearSession($session_name) {
$this->session->unset_userdata($session_name);
}
public function _loadSession($session_name) {
return (($this->_existsSession( $session_name )) ? $this->session->userdata($session_name) : FALSE );
}
最有趣的功能是_loadSession()
,它的自我解释性我花了一段时间才完全理解会话本身,简而言之,您需要获取(加载)已经在会话中的数据,对其进行操作([CRUD]例如添加新数据或删除一些)然后放回(重写)同一会话中的所有数据。
让我们来看这个例子:
请记住,会话类似于 2D 数组(我自己使用 4+5d 数组)
$session['session_name'] = 'value';
$session['json'] = array('id' => '1', 'name' => 'asok', 'some_array' => array('array_in_array' => array()), 'etcetera' => '...');
所以要在会话中编写新的(重写)东西,你使用
{
$session_name = 'json';
$session_data[$session_name] = $this->_loadSession($session_name);
//manipulate with array as you wish here, keep in mind that your variable is
$session_data[$session_name]['id'] = '2'; // also keep in mind all session variables are (string) type even (boolean) TRUE translates to '1'
//or create new index
$session_data[$session_name]['new_index'] = FALSE; // this retypes to (string) '0'
//now put session in place
$this->session->set_userdata($session_data);
}
如果你喜欢使用自己的函数add_data()
你需要这样做
- 好吧,您需要先向其传递一些数据
add_data($arr = array(), $data = ''){}
例如:array_unshift( $arr, $data );
{
//your default array that is set to _initJSONSession() is just pure empty array();
$session_name = 'json';
$session_data[$session_name] = $this->_loadSession( $session_name );
// to demonstrate I use native PHP function instead of yours add_data()
array_unshift( $session_data[$session_name], 'sample-data' );
$this->session->set_userdata( $session_data );
unset( $session_data );
}
就是这样。
您可以为每个控制器添加一个"全局"数组。
在控制器顶部:
public $notification_array = array();
然后,要在不同的函数中访问它,您将使用:
$this->notification_array;
因此,如果要向其添加项目,可以执行以下操作:
$this->notification_array['notification'] = "Something";
$this->notification_array['another'] = "Something Else";