决定函数是私有函数还是公共函数的标准是什么。
我总是在不声明函数的情况下进行编码,所以它被视为公共函数,但它运行得很好。然而,我在指南上读到了这一点
在某些情况下,您可能希望某些功能对公共访问隐藏。要使函数私有化,只需添加一个下划线作为名称前缀,它将不会通过URL请求提供。例如,如果你有这样一个函数:
控制器中的公共访问功能如何?
我在我制作的每个控制器上都有这行代码。
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
这阻止了用户直接通过控制器并通过url访问函数,对吗?
我试着测试它,尽管我放了那行代码,这行代码适用于视图页面,但如果有人试图直接访问视图,他们会被发送出去。
当我可以访问声明/假定为public的函数时,private函数会出错。
函数"必须"为私有函数的条件是什么。访问数据库之类的功能?还是有价值的数据?喜欢用户输入的信息(敏感信息,如帐户详细信息/用户名密码)?
或者我应该把所有东西都保密,这样用户就不能直接访问这些功能了?
示例:
我设置了一个名为"Main"的默认控制器
public function index(){
if($this->input->cookie('cookie',TRUE)){
}
else
$this->load->view('login');
}
检查cookie是否存在(如果用户已经登录)。如果我将索引函数设置为private,那么每当我访问root/main文件夹时,它都无法访问。所以我把它设置为公开的。我的推理合乎逻辑/合理吗?
public function login(){
$this->form_validation->set_rules('username', 'Username', 'required|callback_check_account');
$this->form_validation->set_rules('password', 'Password', 'required');
if($this->form_validation->run() == FALSE){
$this->load->view('login'); //i tried using redirect, but it does not pass the error message for validation
}else{
}
}
我将登录函数声明为public。由于所需的数据是通过登录表单提交的,因此在调用回调函数时也无法访问。
public function check_account($username){
$data = array('username' => $username, 'password' => $_POST['password']);
$result = $this->LoginModel->validate_account($data);
if(empty($result)){
$this->form_validation->set_message('check_account' , 'account does not exist');
$this->form_validation->set_message('required' , '');
return FALSE;
} else if($result == 'invalid'){
$this->form_validation->set_message('check_account' , 'password does not match');
$this->form_validation->set_message('required' , '');
return FALSE;
} else if($result){
$isLoggedin = array( 'username' => $result['username'] , 'type' => $result['status'] , 'is_loggedin' => TRUE);
$this->session->set_userdata($isLoggedin);
return TRUE; }
}
我将它声明为public,因为如果我将其声明为private,我的回调将导致致命错误。用户可以通过链接/Main/check_account/username
访问
型号:
function validate_account($data){
$this->db->select('username,password')->where('username' , $data['username']);
$query = $this->db->get('admin')->result_array();
if(!empty($query)){
foreach($query as $row){
if($data['password'] != $row['password']){
return 'invalid'; }
else $query = array('username' => $row['username'] , 'password' => $row['password'] , 'status' => 'administrator');
return $query; }
} else {
$this->db->select('username,password')->where('username' , $data['username']);
$query = $this->db->get('user_mst')->result_array();
if(!empty($query)){
foreach($query as $row){
if($data['password'] != $row['password']){
return 'invalid'; }
else $query['status'] = 'user'; return $query; }
} }
}
已编辑:更改了回调函数,如果不显示,则检查输入的用户名是否存在
"帐户不存在"
,如果返回无效,则显示
"密码不匹配"
如果它返回$query,我将设置会话以及帐户状态,因为我只为管理员和用户创建了一个登录名。我仍然不知道我将如何使用
"类型"
在我的会话中,但我只是把它放在那里,以防不需要检查会话,如果用户是管理员或用户,他们就不能访问彼此的页面。
如果你不想让check_account成为控制器的一个动作,你应该使用
public function _check_account($value) { ... }
然后调用这样的回调:
$this->form_validation->set_rules('username', 'Username', 'required|callback__check_account');
请注意,在"callback"answers"check"之间有两个下划线"_"。此外,提交的表单字段的值将是回调的参数。